From 9d114d5319151c2420ae225357a64fba92729c9e Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Thu, 14 Sep 2023 10:56:20 +0200 Subject: [PATCH 01/48] toast --- packages/next/src/build/index.ts | 16 +- packages/next/src/build/webpack-config.ts | 233 +++++++++++------- .../router-reducer/fetch-server-response.ts | 10 +- .../reducers/server-action-reducer.ts | 15 +- ...t-dom-server-legacy.browser.development.js | 2 +- ...om-server-legacy.browser.production.min.js | 2 +- ...eact-dom-server-legacy.node.development.js | 2 +- ...t-dom-server-legacy.node.production.min.js | 2 +- ...t-dom-server-rendering-stub.development.js | 2 +- ...om-server-rendering-stub.production.min.js | 2 +- .../react-dom-server.browser.development.js | 2 +- ...react-dom-server.browser.production.min.js | 2 +- .../cjs/react-dom-server.edge.development.js | 2 +- .../react-dom-server.edge.production.min.js | 2 +- .../cjs/react-dom-server.node.development.js | 2 +- .../react-dom-server.node.production.min.js | 2 +- .../react-dom-static.browser.development.js | 2 +- ...react-dom-static.browser.production.min.js | 2 +- .../cjs/react-dom-static.edge.development.js | 2 +- .../react-dom-static.edge.production.min.js | 2 +- .../cjs/react-dom-static.node.development.js | 2 +- .../react-dom-static.node.production.min.js | 2 +- .../react-dom-unstable_testing.development.js | 4 +- ...act-dom-unstable_testing.production.min.js | 2 +- .../cjs/react-dom.development.js | 4 +- .../cjs/react-dom.production.min.js | 2 +- .../cjs/react-dom.profiling.min.js | 2 +- ...t-dom-server-legacy.browser.development.js | 2 +- ...om-server-legacy.browser.production.min.js | 2 +- ...eact-dom-server-legacy.node.development.js | 2 +- ...t-dom-server-legacy.node.production.min.js | 2 +- .../react-dom-server.browser.development.js | 2 +- ...react-dom-server.browser.production.min.js | 2 +- .../cjs/react-dom-server.edge.development.js | 2 +- .../react-dom-server.edge.production.min.js | 2 +- .../cjs/react-dom-server.node.development.js | 2 +- .../react-dom-server.node.production.min.js | 2 +- .../react-dom/cjs/react-dom.development.js | 4 +- .../react-dom/cjs/react-dom.production.min.js | 2 +- .../react-dom/cjs/react-dom.profiling.min.js | 2 +- .../cjs/react-jsx-dev-runtime.development.js | 2 +- .../cjs/react-jsx-runtime.development.js | 2 +- .../cjs/react-jsx-runtime.production.min.js | 2 +- .../cjs/react-jsx-runtime.profiling.min.js | 2 +- .../cjs/react-jsx-dev-runtime.development.js | 2 +- .../cjs/react-jsx-runtime.development.js | 2 +- .../cjs/react-jsx-runtime.production.min.js | 2 +- .../cjs/react-jsx-runtime.profiling.min.js | 2 +- packages/next/src/lib/constants.ts | 5 +- packages/next/src/server/esm-loader.mts | 4 +- .../future/route-modules/app-page/module.ts | 13 +- .../app-page/vendored/rsc/entrypoints.ts | 29 +++ .../app-page/vendored/rsc/react-dom.ts | 1 + .../react-server-dom-webpack-server-edge.ts | 3 + .../react-server-dom-webpack-server-node.ts | 3 + .../app-page/vendored/rsc/react.ts | 1 + .../app-page/vendored/shared/entrypoints.ts | 4 + .../vendored/shared/react-jsx-dev-runtime.ts | 3 + .../vendored/shared/react-jsx-runtime.ts | 3 + .../app-page/vendored/ssr/entrypoints.ts | 23 ++ .../vendored/ssr/react-dom-server-edge.ts | 3 + .../app-page/vendored/ssr/react-dom.ts | 1 + .../react-server-dom-webpack-client-edge.ts | 3 + .../app-page/vendored/ssr/react.ts | 1 + packages/next/src/server/import-overrides.ts | 122 ++++----- packages/next/src/server/require-hook.js | 4 +- packages/next/taskfile.js | 161 +++++++++--- packages/next/types/misc.d.ts | 5 + packages/next/webpack.config.js | 157 ++++++++++-- 69 files changed, 638 insertions(+), 279 deletions(-) create mode 100644 packages/next/src/server/future/route-modules/app-page/vendored/rsc/entrypoints.ts create mode 100644 packages/next/src/server/future/route-modules/app-page/vendored/rsc/react-dom.ts create mode 100644 packages/next/src/server/future/route-modules/app-page/vendored/rsc/react-server-dom-webpack-server-edge.ts create mode 100644 packages/next/src/server/future/route-modules/app-page/vendored/rsc/react-server-dom-webpack-server-node.ts create mode 100644 packages/next/src/server/future/route-modules/app-page/vendored/rsc/react.ts create mode 100644 packages/next/src/server/future/route-modules/app-page/vendored/shared/entrypoints.ts create mode 100644 packages/next/src/server/future/route-modules/app-page/vendored/shared/react-jsx-dev-runtime.ts create mode 100644 packages/next/src/server/future/route-modules/app-page/vendored/shared/react-jsx-runtime.ts create mode 100644 packages/next/src/server/future/route-modules/app-page/vendored/ssr/entrypoints.ts create mode 100644 packages/next/src/server/future/route-modules/app-page/vendored/ssr/react-dom-server-edge.ts create mode 100644 packages/next/src/server/future/route-modules/app-page/vendored/ssr/react-dom.ts create mode 100644 packages/next/src/server/future/route-modules/app-page/vendored/ssr/react-server-dom-webpack-client-edge.ts create mode 100644 packages/next/src/server/future/route-modules/app-page/vendored/ssr/react.ts diff --git a/packages/next/src/build/index.ts b/packages/next/src/build/index.ts index 16944bde6fc18..b1cb3fffed59a 100644 --- a/packages/next/src/build/index.ts +++ b/packages/next/src/build/index.ts @@ -146,9 +146,9 @@ import { generateInterceptionRoutesRewrites } from '../lib/generate-interception import { buildDataRoute } from '../server/lib/router-utils/build-data-route' import { - baseOverrides, + // baseOverrides, defaultOverrides, - experimentalOverrides, + // experimentalOverrides, } from '../server/import-overrides' import { initialize as initializeIncrementalCache } from '../server/lib/incremental-cache-server' import { nodeFs } from '../server/lib/node-fs-methods' @@ -2107,12 +2107,12 @@ export default async function build( ) const sharedEntriesSet = [ - ...Object.values(baseOverrides).map((override) => - require.resolve(override) - ), - ...Object.values(experimentalOverrides).map((override) => - require.resolve(override) - ), + // ...Object.values(baseOverrides).map((override) => + // require.resolve(override) + // ), + // ...Object.values(experimentalOverrides).map((override) => + // require.resolve(override) + // ), ...(config.experimental.turbotrace ? [] : Object.keys(defaultOverrides).map((value) => diff --git a/packages/next/src/build/webpack-config.ts b/packages/next/src/build/webpack-config.ts index a9273b46bdc2f..7123a3c94d834 100644 --- a/packages/next/src/build/webpack-config.ts +++ b/packages/next/src/build/webpack-config.ts @@ -17,6 +17,7 @@ import { RSC_ACTION_CLIENT_WRAPPER_ALIAS, RSC_ACTION_VALIDATE_ALIAS, WEBPACK_RESOURCE_QUERIES, + WebpackLayerName, } from '../lib/constants' import { CustomRoutes } from '../lib/load-custom-routes.js' import { isEdgeRuntime } from '../lib/is-edge-runtime' @@ -85,7 +86,7 @@ const NEXT_PROJECT_ROOT_DIST_CLIENT = path.join( 'client' ) -const isWebpackServerLayer = (layer: string | null) => +const isWebpackServerLayer = (layer: WebpackLayerName | null) => Boolean(layer && WEBPACK_LAYERS.GROUP.server.includes(layer)) if (parseInt(React.version) < 18) { @@ -109,6 +110,11 @@ const optionalEsmPart = `((${pathSeparators}esm)?${pathSeparators})` const sharedRuntimeFileEnd = '(\\.shared-runtime(\\.js)?)$' const externalFileEnd = '(\\.external(\\.js)?)$' const nextDist = `next${pathSeparators}dist` +const genericRuntimeFileEnd = '(\\.[\\w-]+\\.runtime\\.[\\w-]+(\\.js)?)$' + +const genericRuntimePattern = new RegExp( + `${nextDist}.*${genericRuntimeFileEnd}` +) const sharedRuntimePattern = new RegExp( `${nextDist}${optionalEsmPart}.*${sharedRuntimeFileEnd}` @@ -386,39 +392,62 @@ function getReactProfilingInProduction() { function createRSCAliases( bundledReactChannel: string, opts: { + layer: WebpackLayerName & ('rsc' | 'ssr' | 'app-pages-browser') reactProductionProfiling: boolean - reactSharedSubset: boolean - reactDomServerRenderingStub: boolean + // reactSharedSubset: boolean + // reactDomServerRenderingStub: boolean reactServerCondition?: boolean } ) { - const alias: Record = { - react$: `next/dist/compiled/react${bundledReactChannel}`, - 'react-dom$': `next/dist/compiled/react-dom${bundledReactChannel}`, - 'react/jsx-runtime$': `next/dist/compiled/react${bundledReactChannel}/jsx-runtime`, - 'react/jsx-dev-runtime$': `next/dist/compiled/react${bundledReactChannel}/jsx-dev-runtime`, - 'react-dom/client$': `next/dist/compiled/react-dom${bundledReactChannel}/client`, - 'react-dom/server$': `next/dist/compiled/react-dom${bundledReactChannel}/server`, - 'react-dom/server.edge$': `next/dist/compiled/react-dom${bundledReactChannel}/server.edge`, - 'react-dom/server.browser$': `next/dist/compiled/react-dom${bundledReactChannel}/server.browser`, - 'react-server-dom-webpack/client$': `next/dist/compiled/react-server-dom-webpack${bundledReactChannel}/client`, - 'react-server-dom-webpack/client.edge$': `next/dist/compiled/react-server-dom-webpack${bundledReactChannel}/client.edge`, - 'react-server-dom-webpack/server.edge$': `next/dist/compiled/react-server-dom-webpack${bundledReactChannel}/server.edge`, - 'react-server-dom-webpack/server.node$': `next/dist/compiled/react-server-dom-webpack${bundledReactChannel}/server.node`, - } + const alias: Record = + opts.layer === 'app-pages-browser' + ? { + react$: `next/dist/compiled/react${bundledReactChannel}`, + 'react-dom$': `next/dist/compiled/react-dom${bundledReactChannel}`, + 'react/jsx-runtime$': `next/dist/compiled/react${bundledReactChannel}/jsx-runtime`, + 'react/jsx-dev-runtime$': `next/dist/compiled/react${bundledReactChannel}/jsx-dev-runtime`, + 'react-dom/client$': `next/dist/compiled/react-dom${bundledReactChannel}/client`, + 'react-dom/server$': `next/dist/compiled/react-dom${bundledReactChannel}/server`, + 'react-dom/server.edge$': `next/dist/compiled/react-dom${bundledReactChannel}/server.edge`, + 'react-dom/server.browser$': `next/dist/compiled/react-dom${bundledReactChannel}/server.browser`, + 'react-server-dom-webpack/client$': `next/dist/compiled/react-server-dom-webpack${bundledReactChannel}/client`, + 'react-server-dom-webpack/client.edge$': `next/dist/compiled/react-server-dom-webpack${bundledReactChannel}/client.edge`, + 'react-server-dom-webpack/server.edge$': `next/dist/compiled/react-server-dom-webpack${bundledReactChannel}/server.edge`, + 'react-server-dom-webpack/server.node$': `next/dist/compiled/react-server-dom-webpack${bundledReactChannel}/server.node`, + } + : { + react$: `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react`, + 'react-dom$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-dom`, + 'react/jsx-runtime$': `next/dist/server/future/route-modules/app-page/vendored/shared/react-jsx-runtime`, + 'react/jsx-dev-runtime$': `next/dist/server/future/route-modules/app-page/vendored/shared/react-jsx-dev-runtime`, + 'react-dom/client$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-dom-client`, + 'react-dom/server$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-dom-server`, + 'react-dom/server.edge$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-dom-server-edge`, + 'react-dom/server.browser$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-dom-server-browser`, + 'react-server-dom-webpack/client$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-server-dom-webpack-client`, + 'react-server-dom-webpack/client.edge$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-server-dom-webpack-client-edge`, + 'react-server-dom-webpack/server.edge$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-server-dom-webpack-server-edge`, + 'react-server-dom-webpack/server.node$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-server-dom-webpack-server-node`, + } - if (opts.reactSharedSubset) { - alias[ - 'react$' - ] = `next/dist/compiled/react${bundledReactChannel}/react.shared-subset` - } - // Use server rendering stub for RSC - // x-ref: https://github.com/facebook/react/pull/25436 - if (opts.reactDomServerRenderingStub) { - alias[ - 'react-dom$' - ] = `next/dist/compiled/react-dom${bundledReactChannel}/server-rendering-stub` - } + // if (opts.reactSharedSubset) { + // // alias[ + // // 'react$' + // // ] = `next/dist/compiled/react${bundledReactChannel}/react.shared-subset` + // alias[ + // 'react$' + // ] = `next/dist/server/future/route-modules/app-page/vendored/react-shared-subset` + // } + // // Use server rendering stub for RSC + // // x-ref: https://github.com/facebook/react/pull/25436 + // if (opts.reactDomServerRenderingStub) { + // // alias[ + // // 'react-dom$' + // // ] = `next/dist/compiled/react-dom${bundledReactChannel}/server-rendering-stub` + // alias[ + // 'react-dom$' + // ] = `next/dist/server/future/route-modules/app-page/vendored/react-server-rendering-stub` + // } // Alias `server-only` and `client-only` modules to their server/client only, vendored versions. // These aliases are necessary if the user doesn't have those two packages installed manually. @@ -1130,9 +1159,11 @@ export default async function getBaseWebpackConfig( ...(hasAppDir ? createRSCAliases(bundledReactChannel, { - reactSharedSubset: false, - reactDomServerRenderingStub: false, + // reactSharedSubset: false, + // reactDomServerRenderingStub: false, reactProductionProfiling, + // browser: true, + layer: 'app-pages-browser', }) : {}), @@ -1313,7 +1344,7 @@ export default async function getBaseWebpackConfig( context: string, request: string, dependencyType: string, - layer: string | null, + layer: WebpackLayerName | null, getResolve: ( options: any ) => ( @@ -1338,35 +1369,37 @@ export default async function getBaseWebpackConfig( return `commonjs next/dist/lib/import-next-warning` } - const isAppLayer = [ - WEBPACK_LAYERS.reactServerComponents, - WEBPACK_LAYERS.serverSideRendering, - WEBPACK_LAYERS.appPagesBrowser, - WEBPACK_LAYERS.actionBrowser, - WEBPACK_LAYERS.appRouteHandler, - ].includes(layer!) - - if ( - request === 'react/jsx-dev-runtime' || - request === 'react/jsx-runtime' - ) { - if (isAppLayer) { - return `commonjs next/dist/compiled/${request.replace( - 'react', - 'react' + bundledReactChannel - )}` - } - return - } + const isAppLayer = ( + [ + WEBPACK_LAYERS.reactServerComponents, + WEBPACK_LAYERS.serverSideRendering, + WEBPACK_LAYERS.appPagesBrowser, + WEBPACK_LAYERS.actionBrowser, + WEBPACK_LAYERS.appRouteHandler, + ] as WebpackLayerName[] + ).includes(layer!) + + // if ( + // request === 'react/jsx-dev-runtime' || + // request === 'react/jsx-runtime' + // ) { + // if (isAppLayer) { + // return `commonjs next/dist/compiled/${request.replace( + // 'react', + // 'react' + bundledReactChannel + // )}` + // } + // return + // } // Special internal modules that must be bundled for Server Components. - if (layer === WEBPACK_LAYERS.reactServerComponents) { - // React needs to be bundled for Server Components so the special - // `react-server` export condition can be used. - if (reactPackagesRegex.test(request)) { - return - } - } + // if (layer === WEBPACK_LAYERS.reactServerComponents) { + // // React needs to be bundled for Server Components so the special + // // `react-server` export condition can be used. + // if (reactPackagesRegex.test(request)) { + // return + // } + // } // Relative requires don't need custom resolution, because they // are relative to requests we've already resolved here. @@ -1377,31 +1410,32 @@ export default async function getBaseWebpackConfig( return `commonjs ${request}` } - if (reactPackagesRegex.test(request)) { + if (reactPackagesRegex.test(request) && !isAppLayer) { // override react-dom to server-rendering-stub for server - if ( - request === 'react-dom' && - (layer === WEBPACK_LAYERS.serverSideRendering || - layer === WEBPACK_LAYERS.reactServerComponents || - layer === WEBPACK_LAYERS.actionBrowser) - ) { - request = `next/dist/compiled/react-dom${bundledReactChannel}/server-rendering-stub` - } else if (isAppLayer) { - request = - 'next/dist/compiled/' + - request.replace( - /^(react-server-dom-webpack|react-dom|react)/, - (name) => { - return name + bundledReactChannel - } - ) - } + // if ( + // request === 'react-dom' && + // (layer === WEBPACK_LAYERS.serverSideRendering || + // layer === WEBPACK_LAYERS.reactServerComponents || + // layer === WEBPACK_LAYERS.actionBrowser) + // ) { + // request = `next/dist/compiled/react-dom${bundledReactChannel}/server-rendering-stub` + // } else if (isAppLayer) { + // request = + // 'next/dist/compiled/' + + // request.replace( + // /^(react-server-dom-webpack|react-dom|react)/, + // (name) => { + // return name + bundledReactChannel + // } + // ) + // } return `commonjs ${request}` } const notExternalModules = /^(?:private-next-pages\/|next\/(?:dist\/pages\/|(?:app|document|link|image|legacy\/image|constants|dynamic|script|navigation|headers|router)$)|string-hash|private-next-rsc-action-validate|private-next-rsc-action-client-wrapper|private-next-rsc-action-proxy$)/ if (notExternalModules.test(request)) { + console.log('notExternalModules', request) return } } @@ -1433,10 +1467,11 @@ export default async function getBaseWebpackConfig( const resolveNextExternal = (localRes: string) => { const isSharedRuntime = sharedRuntimePattern.test(localRes) const isExternal = externalPattern.test(localRes) + const isRenderRuntime = genericRuntimePattern.test(localRes) // if the file ends with .external, we need to make it a commonjs require in all cases // this is used mainly to share the async local storage across the routing, rendering and user layers. - if (isExternal) { + if (isExternal || isRenderRuntime) { // it's important we return the path that starts with `next/dist/` here instead of the absolute path // otherwise NFT will get tripped up return `commonjs ${localRes.replace(/.*?next[/\\]dist/, 'next/dist')}` @@ -1521,14 +1556,14 @@ export default async function getBaseWebpackConfig( // Treat react packages and next internals as external for SSR layer, // also map react to builtin ones with require-hook. if (layer === WEBPACK_LAYERS.serverSideRendering) { - if (reactPackagesRegex.test(request)) { - return `commonjs next/dist/compiled/${request.replace( - /^(react-server-dom-webpack|react-dom|react)/, - (name) => { - return name + bundledReactChannel - } - )}` - } + // if (reactPackagesRegex.test(request)) { + // return `commonjs next/dist/compiled/${request.replace( + // /^(react-server-dom-webpack|react-dom|react)/, + // (name) => { + // return name + bundledReactChannel + // } + // )}` + // } const isRelative = request.startsWith('.') const fullRequest = isRelative @@ -1729,7 +1764,7 @@ export default async function getBaseWebpackConfig( context, request, dependencyType, - contextInfo.issuerLayer, + contextInfo.issuerLayer as WebpackLayerName, (options) => { const resolveFunction = getResolve(options) return (resolveContext: string, requestToResolve: string) => @@ -2156,11 +2191,13 @@ export default async function getBaseWebpackConfig( // react to the direct file path, not the package name. In that case the condition // will be ignored completely. alias: createRSCAliases(bundledReactChannel, { - reactSharedSubset: true, - reactDomServerRenderingStub: true, + // reactSharedSubset: true, + // reactDomServerRenderingStub: true, reactServerCondition: true, // No server components profiling reactProductionProfiling, + // browser: false, + layer: WEBPACK_LAYERS.reactServerComponents, }), }, use: { @@ -2219,10 +2256,12 @@ export default async function getBaseWebpackConfig( // It needs `conditionNames` here to require the proper asset, // when react is acting as dependency of compiled/react-dom. alias: createRSCAliases(bundledReactChannel, { - reactSharedSubset: true, - reactDomServerRenderingStub: true, + // reactSharedSubset: true, + // reactDomServerRenderingStub: true, reactServerCondition: true, reactProductionProfiling, + // browser: false, + layer: WEBPACK_LAYERS.reactServerComponents, }), }, }, @@ -2231,10 +2270,12 @@ export default async function getBaseWebpackConfig( issuerLayer: WEBPACK_LAYERS.serverSideRendering, resolve: { alias: createRSCAliases(bundledReactChannel, { - reactSharedSubset: false, - reactDomServerRenderingStub: true, + // reactSharedSubset: false, + // reactDomServerRenderingStub: true, reactServerCondition: false, reactProductionProfiling, + // browser: true, + layer: WEBPACK_LAYERS.serverSideRendering, }), }, }, @@ -2246,10 +2287,12 @@ export default async function getBaseWebpackConfig( resolve: { alias: createRSCAliases(bundledReactChannel, { // Only alias server rendering stub in client SSR layer. - reactSharedSubset: false, - reactDomServerRenderingStub: false, + // reactSharedSubset: false, + // reactDomServerRenderingStub: false, reactServerCondition: false, reactProductionProfiling, + // browser: isClient, + layer: WEBPACK_LAYERS.appPagesBrowser, }), }, }, diff --git a/packages/next/src/client/components/router-reducer/fetch-server-response.ts b/packages/next/src/client/components/router-reducer/fetch-server-response.ts index 689d27df7798f..e6c3eb037b143 100644 --- a/packages/next/src/client/components/router-reducer/fetch-server-response.ts +++ b/packages/next/src/client/components/router-reducer/fetch-server-response.ts @@ -2,7 +2,15 @@ // @ts-ignore // eslint-disable-next-line import/no-extraneous-dependencies -import { createFromFetch } from 'react-server-dom-webpack/client' +// import { createFromFetch } from 'react-server-dom-webpack/client' +const { createFromFetch } = ( + typeof window === 'undefined' + ? // eslint-disable-next-line import/no-extraneous-dependencies + require('react-server-dom-webpack/client.edge') + : // eslint-disable-next-line import/no-extraneous-dependencies + require('react-server-dom-webpack/client') +) as typeof import('react-server-dom-webpack/client') + import type { FlightRouterState, FlightData, diff --git a/packages/next/src/client/components/router-reducer/reducers/server-action-reducer.ts b/packages/next/src/client/components/router-reducer/reducers/server-action-reducer.ts index 0c6caaba746ca..3cd195b17c04f 100644 --- a/packages/next/src/client/components/router-reducer/reducers/server-action-reducer.ts +++ b/packages/next/src/client/components/router-reducer/reducers/server-action-reducer.ts @@ -12,10 +12,17 @@ import { } from '../../app-router-headers' import { createRecordFromThenable } from '../create-record-from-thenable' import { readRecordValue } from '../read-record-value' -// eslint-disable-next-line import/no-extraneous-dependencies -import { createFromFetch } from 'react-server-dom-webpack/client' -// eslint-disable-next-line import/no-extraneous-dependencies -import { encodeReply } from 'react-server-dom-webpack/client' +// // eslint-disable-next-line import/no-extraneous-dependencies +// import { createFromFetch } from 'react-server-dom-webpack/client' +// // eslint-disable-next-line import/no-extraneous-dependencies +// import { encodeReply } from 'react-server-dom-webpack/client' +const { createFromFetch, encodeReply } = ( + typeof window === 'undefined' + ? // eslint-disable-next-line import/no-extraneous-dependencies + require('react-server-dom-webpack/client.edge') + : // eslint-disable-next-line import/no-extraneous-dependencies + require('react-server-dom-webpack/client') +) as typeof import('react-server-dom-webpack/client') import { ReadonlyReducerState, diff --git a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-server-legacy.browser.development.js b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-server-legacy.browser.development.js index 15a3a5bd195b2..933a1cf4b1b58 100644 --- a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-server-legacy.browser.development.js +++ b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-server-legacy.browser.development.js @@ -14,7 +14,7 @@ if (process.env.NODE_ENV !== "production") { (function() { 'use strict'; -var React = require("next/dist/compiled/react-experimental"); +var React = require('react'); var ReactDOM = require('react-dom'); var ReactVersion = '18.3.0-experimental-dd480ef92-20230822'; diff --git a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-server-legacy.browser.production.min.js b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-server-legacy.browser.production.min.js index 1fd88592e6fc2..5429882ac9a40 100644 --- a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-server-legacy.browser.production.min.js +++ b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-server-legacy.browser.production.min.js @@ -7,7 +7,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -'use strict';var ca=require("next/dist/compiled/react-experimental"),da=require("react-dom");function l(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;cja||(a.current=ia[ja],ia[ja]=null,ja--)}function E(a,b){ja++;ia[ja]=a.current;a.current=b} var la=Symbol.for("react.element"),ma=Symbol.for("react.portal"),na=Symbol.for("react.fragment"),oa=Symbol.for("react.strict_mode"),pa=Symbol.for("react.profiler"),qa=Symbol.for("react.provider"),ra=Symbol.for("react.context"),sa=Symbol.for("react.server_context"),ta=Symbol.for("react.forward_ref"),ua=Symbol.for("react.suspense"),va=Symbol.for("react.suspense_list"),wa=Symbol.for("react.memo"),xa=Symbol.for("react.lazy"),ya=Symbol.for("react.scope");Symbol.for("react.debug_trace_mode"); var za=Symbol.for("react.offscreen"),Aa=Symbol.for("react.legacy_hidden"),Ba=Symbol.for("react.cache");Symbol.for("react.tracing_marker");var Ca=Symbol.for("react.default_value"),Da=Symbol.for("react.memo_cache_sentinel"),Ea=Symbol.for("react.postpone"),Fa=Symbol.iterator;function Ga(a){if(null===a||"object"!==typeof a)return null;a=Fa&&a[Fa]||a["@@iterator"];return"function"===typeof a?a:null} diff --git a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.development.js b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.development.js index 3516e84e55d88..98b075d7cd6aa 100644 --- a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.development.js +++ b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.development.js @@ -23,8 +23,8 @@ if ( ) { __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error()); } - var React = require("next/dist/compiled/react-experimental"); -var Scheduler = require("next/dist/compiled/scheduler-experimental"); + var React = require('react'); +var Scheduler = require('scheduler'); var Internals = { usingClientEntryPoint: false, diff --git a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.production.min.js b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.production.min.js index 212d918338910..d51fe46f4353a 100644 --- a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.production.min.js +++ b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.production.min.js @@ -10,7 +10,7 @@ /* Modernizr 3.0.0pre (Custom Build) | MIT */ -'use strict';var aa=require("next/dist/compiled/react-experimental"),ba=require("next/dist/compiled/scheduler-experimental"),ca={usingClientEntryPoint:!1,Events:null,Dispatcher:{current:null}};function t(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;cja||(a.current=ia[ja],ia[ja]=null,ja--)}function E(a,b){ja++;ia[ja]=a.current;a.current=b} var la=Symbol.for("react.element"),ma=Symbol.for("react.portal"),na=Symbol.for("react.fragment"),oa=Symbol.for("react.strict_mode"),pa=Symbol.for("react.profiler"),qa=Symbol.for("react.provider"),ra=Symbol.for("react.context"),sa=Symbol.for("react.server_context"),ta=Symbol.for("react.forward_ref"),ua=Symbol.for("react.suspense"),va=Symbol.for("react.suspense_list"),wa=Symbol.for("react.memo"),xa=Symbol.for("react.lazy"),ya=Symbol.for("react.scope");Symbol.for("react.debug_trace_mode"); var za=Symbol.for("react.offscreen"),Aa=Symbol.for("react.legacy_hidden"),Ba=Symbol.for("react.cache");Symbol.for("react.tracing_marker");var Ca=Symbol.for("react.default_value"),Da=Symbol.for("react.memo_cache_sentinel"),Ea=Symbol.for("react.postpone"),Fa=Symbol.iterator;function Ga(a){if(null===a||"object"!==typeof a)return null;a=Fa&&a[Fa]||a["@@iterator"];return"function"===typeof a?a:null} diff --git a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.profiling.min.js b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.profiling.min.js index 33c62fb078628..5ea39f478ef4e 100644 --- a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.profiling.min.js +++ b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.profiling.min.js @@ -21,7 +21,7 @@ if ( /* Modernizr 3.0.0pre (Custom Build) | MIT */ -'use strict';var aa=require("next/dist/compiled/react-experimental"),ba=require("next/dist/compiled/scheduler-experimental"),ca={usingClientEntryPoint:!1,Events:null,Dispatcher:{current:null}};function t(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;cja||(a.current=ha[ja],ha[ja]=null,ja--)}function E(a,b){ja++;ha[ja]=a.current;a.current=b} var la=Symbol.for("react.element"),ma=Symbol.for("react.portal"),na=Symbol.for("react.fragment"),oa=Symbol.for("react.strict_mode"),pa=Symbol.for("react.profiler"),qa=Symbol.for("react.provider"),ra=Symbol.for("react.context"),sa=Symbol.for("react.server_context"),ta=Symbol.for("react.forward_ref"),ua=Symbol.for("react.suspense"),va=Symbol.for("react.suspense_list"),wa=Symbol.for("react.memo"),xa=Symbol.for("react.lazy"),ya=Symbol.for("react.scope");Symbol.for("react.debug_trace_mode"); var za=Symbol.for("react.offscreen"),Aa=Symbol.for("react.legacy_hidden"),Ba=Symbol.for("react.cache");Symbol.for("react.tracing_marker");var Ca=Symbol.for("react.default_value"),Da=Symbol.for("react.memo_cache_sentinel"),Ea=Symbol.for("react.postpone"),Fa=Symbol.iterator;function Ga(a){if(null===a||"object"!==typeof a)return null;a=Fa&&a[Fa]||a["@@iterator"];return"function"===typeof a?a:null} diff --git a/packages/next/src/compiled/react-dom/cjs/react-dom-server-legacy.browser.development.js b/packages/next/src/compiled/react-dom/cjs/react-dom-server-legacy.browser.development.js index a7e8b9b1e59f8..11b447300603c 100644 --- a/packages/next/src/compiled/react-dom/cjs/react-dom-server-legacy.browser.development.js +++ b/packages/next/src/compiled/react-dom/cjs/react-dom-server-legacy.browser.development.js @@ -14,7 +14,7 @@ if (process.env.NODE_ENV !== "production") { (function() { 'use strict'; -var React = require("next/dist/compiled/react"); +var React = require('react'); var ReactDOM = require('react-dom'); var ReactVersion = '18.3.0-canary-dd480ef92-20230822'; diff --git a/packages/next/src/compiled/react-dom/cjs/react-dom-server-legacy.browser.production.min.js b/packages/next/src/compiled/react-dom/cjs/react-dom-server-legacy.browser.production.min.js index 4721283164864..14f4bfcfd2881 100644 --- a/packages/next/src/compiled/react-dom/cjs/react-dom-server-legacy.browser.production.min.js +++ b/packages/next/src/compiled/react-dom/cjs/react-dom-server-legacy.browser.production.min.js @@ -7,7 +7,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -'use strict';var aa=require("next/dist/compiled/react"),la=require("react-dom");function l(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;cha||(a.current=fa[ha],fa[ha]=null,ha--)}function E(a,b){ha++;fa[ha]=a.current;a.current=b} var ja=Symbol.for("react.element"),ka=Symbol.for("react.portal"),la=Symbol.for("react.fragment"),ma=Symbol.for("react.strict_mode"),na=Symbol.for("react.profiler"),oa=Symbol.for("react.provider"),pa=Symbol.for("react.context"),qa=Symbol.for("react.server_context"),ra=Symbol.for("react.forward_ref"),sa=Symbol.for("react.suspense"),ta=Symbol.for("react.suspense_list"),ua=Symbol.for("react.memo"),va=Symbol.for("react.lazy"),wa=Symbol.for("react.scope");Symbol.for("react.debug_trace_mode"); var xa=Symbol.for("react.offscreen"),ya=Symbol.for("react.legacy_hidden"),za=Symbol.for("react.cache");Symbol.for("react.tracing_marker");var Aa=Symbol.for("react.default_value"),Ba=Symbol.iterator;function Ca(a){if(null===a||"object"!==typeof a)return null;a=Ba&&a[Ba]||a["@@iterator"];return"function"===typeof a?a:null}var Da=ia(null),Ea=ia(null),Fa=ia(null); diff --git a/packages/next/src/compiled/react-dom/cjs/react-dom.profiling.min.js b/packages/next/src/compiled/react-dom/cjs/react-dom.profiling.min.js index 6e1719b94551e..dacda5f5473d5 100644 --- a/packages/next/src/compiled/react-dom/cjs/react-dom.profiling.min.js +++ b/packages/next/src/compiled/react-dom/cjs/react-dom.profiling.min.js @@ -21,7 +21,7 @@ if ( /* Modernizr 3.0.0pre (Custom Build) | MIT */ -'use strict';var aa=require("next/dist/compiled/scheduler"),ba=require("next/dist/compiled/react"),ca={usingClientEntryPoint:!1,Events:null,Dispatcher:{current:null}};function r(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;cha||(a.current=fa[ha],fa[ha]=null,ha--)}function E(a,b){ha++;fa[ha]=a.current;a.current=b} var ja=Symbol.for("react.element"),ka=Symbol.for("react.portal"),la=Symbol.for("react.fragment"),ma=Symbol.for("react.strict_mode"),na=Symbol.for("react.profiler"),oa=Symbol.for("react.provider"),pa=Symbol.for("react.context"),qa=Symbol.for("react.server_context"),ra=Symbol.for("react.forward_ref"),sa=Symbol.for("react.suspense"),ta=Symbol.for("react.suspense_list"),ua=Symbol.for("react.memo"),va=Symbol.for("react.lazy"),wa=Symbol.for("react.scope");Symbol.for("react.debug_trace_mode"); var xa=Symbol.for("react.offscreen"),ya=Symbol.for("react.legacy_hidden"),za=Symbol.for("react.cache");Symbol.for("react.tracing_marker");var Aa=Symbol.for("react.default_value"),Ba=Symbol.iterator;function Ca(a){if(null===a||"object"!==typeof a)return null;a=Ba&&a[Ba]||a["@@iterator"];return"function"===typeof a?a:null}var Da=ia(null),Ea=ia(null),Fa=ia(null); diff --git a/packages/next/src/compiled/react-experimental/cjs/react-jsx-dev-runtime.development.js b/packages/next/src/compiled/react-experimental/cjs/react-jsx-dev-runtime.development.js index b7fbf53834137..8fcab4f2602e1 100644 --- a/packages/next/src/compiled/react-experimental/cjs/react-jsx-dev-runtime.development.js +++ b/packages/next/src/compiled/react-experimental/cjs/react-jsx-dev-runtime.development.js @@ -14,7 +14,7 @@ if (process.env.NODE_ENV !== "production") { (function() { 'use strict'; -var React = require("next/dist/compiled/react-experimental"); +var React = require('react'); // ATTENTION // When adding new symbols to this file, diff --git a/packages/next/src/compiled/react-experimental/cjs/react-jsx-runtime.development.js b/packages/next/src/compiled/react-experimental/cjs/react-jsx-runtime.development.js index cbc97be6bbc73..d5d0bb7693f96 100644 --- a/packages/next/src/compiled/react-experimental/cjs/react-jsx-runtime.development.js +++ b/packages/next/src/compiled/react-experimental/cjs/react-jsx-runtime.development.js @@ -14,7 +14,7 @@ if (process.env.NODE_ENV !== "production") { (function() { 'use strict'; -var React = require("next/dist/compiled/react-experimental"); +var React = require('react'); // ATTENTION // When adding new symbols to this file, diff --git a/packages/next/src/compiled/react-experimental/cjs/react-jsx-runtime.production.min.js b/packages/next/src/compiled/react-experimental/cjs/react-jsx-runtime.production.min.js index 789512436d200..3ecb2350b3e55 100644 --- a/packages/next/src/compiled/react-experimental/cjs/react-jsx-runtime.production.min.js +++ b/packages/next/src/compiled/react-experimental/cjs/react-jsx-runtime.production.min.js @@ -7,5 +7,5 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -'use strict';var f=require("next/dist/compiled/react-experimental"),k=Symbol.for("react.element"),l=Symbol.for("react.fragment"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0}; +'use strict';var f=require("react"),k=Symbol.for("react.element"),l=Symbol.for("react.fragment"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0}; function q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=""+g);void 0!==a.key&&(e=""+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q; diff --git a/packages/next/src/compiled/react-experimental/cjs/react-jsx-runtime.profiling.min.js b/packages/next/src/compiled/react-experimental/cjs/react-jsx-runtime.profiling.min.js index 5aeb73baa6743..b875a84b3d090 100644 --- a/packages/next/src/compiled/react-experimental/cjs/react-jsx-runtime.profiling.min.js +++ b/packages/next/src/compiled/react-experimental/cjs/react-jsx-runtime.profiling.min.js @@ -7,5 +7,5 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -'use strict';var f=require("next/dist/compiled/react-experimental"),k=Symbol.for("react.element"),l=Symbol.for("react.fragment"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0}; +'use strict';var f=require("react"),k=Symbol.for("react.element"),l=Symbol.for("react.fragment"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0}; function q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=""+g);void 0!==a.key&&(e=""+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q; diff --git a/packages/next/src/compiled/react/cjs/react-jsx-dev-runtime.development.js b/packages/next/src/compiled/react/cjs/react-jsx-dev-runtime.development.js index 9d4d9fe8f9768..05e5bedbfad47 100644 --- a/packages/next/src/compiled/react/cjs/react-jsx-dev-runtime.development.js +++ b/packages/next/src/compiled/react/cjs/react-jsx-dev-runtime.development.js @@ -14,7 +14,7 @@ if (process.env.NODE_ENV !== "production") { (function() { 'use strict'; -var React = require("next/dist/compiled/react"); +var React = require('react'); // ATTENTION // When adding new symbols to this file, diff --git a/packages/next/src/compiled/react/cjs/react-jsx-runtime.development.js b/packages/next/src/compiled/react/cjs/react-jsx-runtime.development.js index 9c7bd16ccdb47..ba3757094e39a 100644 --- a/packages/next/src/compiled/react/cjs/react-jsx-runtime.development.js +++ b/packages/next/src/compiled/react/cjs/react-jsx-runtime.development.js @@ -14,7 +14,7 @@ if (process.env.NODE_ENV !== "production") { (function() { 'use strict'; -var React = require("next/dist/compiled/react"); +var React = require('react'); // ATTENTION // When adding new symbols to this file, diff --git a/packages/next/src/compiled/react/cjs/react-jsx-runtime.production.min.js b/packages/next/src/compiled/react/cjs/react-jsx-runtime.production.min.js index 2c15ab3ac1155..3ecb2350b3e55 100644 --- a/packages/next/src/compiled/react/cjs/react-jsx-runtime.production.min.js +++ b/packages/next/src/compiled/react/cjs/react-jsx-runtime.production.min.js @@ -7,5 +7,5 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -'use strict';var f=require("next/dist/compiled/react"),k=Symbol.for("react.element"),l=Symbol.for("react.fragment"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0}; +'use strict';var f=require("react"),k=Symbol.for("react.element"),l=Symbol.for("react.fragment"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0}; function q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=""+g);void 0!==a.key&&(e=""+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q; diff --git a/packages/next/src/compiled/react/cjs/react-jsx-runtime.profiling.min.js b/packages/next/src/compiled/react/cjs/react-jsx-runtime.profiling.min.js index 5936004d767cc..b875a84b3d090 100644 --- a/packages/next/src/compiled/react/cjs/react-jsx-runtime.profiling.min.js +++ b/packages/next/src/compiled/react/cjs/react-jsx-runtime.profiling.min.js @@ -7,5 +7,5 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -'use strict';var f=require("next/dist/compiled/react"),k=Symbol.for("react.element"),l=Symbol.for("react.fragment"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0}; +'use strict';var f=require("react"),k=Symbol.for("react.element"),l=Symbol.for("react.fragment"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0}; function q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=""+g);void 0!==a.key&&(e=""+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q; diff --git a/packages/next/src/lib/constants.ts b/packages/next/src/lib/constants.ts index 65370408b0bca..92702f6231c18 100644 --- a/packages/next/src/lib/constants.ts +++ b/packages/next/src/lib/constants.ts @@ -138,7 +138,10 @@ const WEBPACK_LAYERS_NAMES = { * The layer for the server bundle for App Route handlers. */ appRouteHandler: 'app-route-handler', -} +} as const + +export type WebpackLayerName = + (typeof WEBPACK_LAYERS_NAMES)[keyof typeof WEBPACK_LAYERS_NAMES] export const WEBPACK_LAYERS = { ...WEBPACK_LAYERS_NAMES, diff --git a/packages/next/src/server/esm-loader.mts b/packages/next/src/server/esm-loader.mts index 313bde8b39aae..946e73a7075f0 100644 --- a/packages/next/src/server/esm-loader.mts +++ b/packages/next/src/server/esm-loader.mts @@ -3,12 +3,12 @@ import module from 'module' const require = module.createRequire(import.meta.url) export function resolve(specifier: string, context: any, nextResolve: any) { - const { overrideReact, hookPropertyMap } = require(process.env.NEXT_YARN_PNP + const { hookPropertyMap } = require(process.env.NEXT_YARN_PNP ? './import-overrides' : 'next/dist/server/import-overrides') as typeof import('./import-overrides') // In case the environment variable is set after the module is loaded. - overrideReact() + // overrideReact()s const hookResolved = hookPropertyMap.get(specifier) if (hookResolved) { diff --git a/packages/next/src/server/future/route-modules/app-page/module.ts b/packages/next/src/server/future/route-modules/app-page/module.ts index daa0291a1c8b4..fac86c7f73fde 100644 --- a/packages/next/src/server/future/route-modules/app-page/module.ts +++ b/packages/next/src/server/future/route-modules/app-page/module.ts @@ -12,6 +12,9 @@ import { type RouteModuleHandleContext, } from '../route-module' import * as sharedModules from './shared-modules' +import * as vendoredReactRSC from './vendored/rsc/entrypoints' +import * as vendoredReactSSR from './vendored/ssr/entrypoints' +import * as vendoredReactShared from './vendored/shared/entrypoints' type AppPageUserlandModule = { /** @@ -36,6 +39,8 @@ export class AppPageRouteModule extends RouteModule< AppPageUserlandModule > { static readonly sharedModules = sharedModules + // static readonly vendoredReact = vendoredReact + // static readonly vendoredReactSSR = vendoredReactSSR public render( req: IncomingMessage, @@ -52,6 +57,12 @@ export class AppPageRouteModule extends RouteModule< } } -export { renderToHTMLOrFlight } +const vendored = { + 'react-rsc': vendoredReactRSC, + 'react-ssr': vendoredReactSSR, + 'react-shared': vendoredReactShared, +} + +export { renderToHTMLOrFlight, vendored } export default AppPageRouteModule diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/rsc/entrypoints.ts b/packages/next/src/server/future/route-modules/app-page/vendored/rsc/entrypoints.ts new file mode 100644 index 0000000000000..f0c93e41a5b53 --- /dev/null +++ b/packages/next/src/server/future/route-modules/app-page/vendored/rsc/entrypoints.ts @@ -0,0 +1,29 @@ +// module.exports = { +// React: require('react'), +// ReactDOM: require('react-dom/server-rendering-stub'), + +// // TODO: move higher +// ReactJsxRuntime: require('react/jsx-runtime'), +// ReactJsxDevRuntime: require('react/jsx-dev-runtime'), + +// // eslint-disable-next-line import/no-extraneous-dependencies +// ReactServerDOMWebpackServerNode: require('react-server-dom-webpack/server.node'), +// // eslint-disable-next-line import/no-extraneous-dependencies +// ReactServerDOMWebpackServerEdge: require('react-server-dom-webpack/server.edge'), +// } + +import * as React from 'react' + +import * as ReactDOM from 'react-dom/server-rendering-stub' + +// eslint-disable-next-line import/no-extraneous-dependencies +import * as ReactServerDOMWebpackServerNode from 'react-server-dom-webpack/server.node' +// eslint-disable-next-line import/no-extraneous-dependencies +import * as ReactServerDOMWebpackServerEdge from 'react-server-dom-webpack/server.edge' + +export { + React, + ReactDOM, + ReactServerDOMWebpackServerNode, + ReactServerDOMWebpackServerEdge, +} diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/rsc/react-dom.ts b/packages/next/src/server/future/route-modules/app-page/vendored/rsc/react-dom.ts new file mode 100644 index 0000000000000..5d369d4e33771 --- /dev/null +++ b/packages/next/src/server/future/route-modules/app-page/vendored/rsc/react-dom.ts @@ -0,0 +1 @@ +module.exports = require('../../module.compiled').vendored['react-rsc'].ReactDOM diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/rsc/react-server-dom-webpack-server-edge.ts b/packages/next/src/server/future/route-modules/app-page/vendored/rsc/react-server-dom-webpack-server-edge.ts new file mode 100644 index 0000000000000..0ae9701b1e912 --- /dev/null +++ b/packages/next/src/server/future/route-modules/app-page/vendored/rsc/react-server-dom-webpack-server-edge.ts @@ -0,0 +1,3 @@ +module.exports = require('../../module.compiled').vendored[ + 'react-rsc' +].ReactServerDOMWebpackServerEdge diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/rsc/react-server-dom-webpack-server-node.ts b/packages/next/src/server/future/route-modules/app-page/vendored/rsc/react-server-dom-webpack-server-node.ts new file mode 100644 index 0000000000000..fbb7bd17d4ffc --- /dev/null +++ b/packages/next/src/server/future/route-modules/app-page/vendored/rsc/react-server-dom-webpack-server-node.ts @@ -0,0 +1,3 @@ +module.exports = require('../../module.compiled').vendored[ + 'react-rsc' +].ReactServerDOMWebpackServerNode diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/rsc/react.ts b/packages/next/src/server/future/route-modules/app-page/vendored/rsc/react.ts new file mode 100644 index 0000000000000..41b44328775ab --- /dev/null +++ b/packages/next/src/server/future/route-modules/app-page/vendored/rsc/react.ts @@ -0,0 +1 @@ +module.exports = require('../../module.compiled').vendored['react-rsc'].React diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/shared/entrypoints.ts b/packages/next/src/server/future/route-modules/app-page/vendored/shared/entrypoints.ts new file mode 100644 index 0000000000000..b5a1bf1a3fd02 --- /dev/null +++ b/packages/next/src/server/future/route-modules/app-page/vendored/shared/entrypoints.ts @@ -0,0 +1,4 @@ +import * as ReactJsxDevRuntime from 'react/jsx-dev-runtime' +import * as ReactJsxRuntime from 'react/jsx-runtime' + +export { ReactJsxDevRuntime, ReactJsxRuntime } diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/shared/react-jsx-dev-runtime.ts b/packages/next/src/server/future/route-modules/app-page/vendored/shared/react-jsx-dev-runtime.ts new file mode 100644 index 0000000000000..9623bb4a90ae0 --- /dev/null +++ b/packages/next/src/server/future/route-modules/app-page/vendored/shared/react-jsx-dev-runtime.ts @@ -0,0 +1,3 @@ +module.exports = require('../../module.compiled').vendored[ + 'react-shared' +].ReactJsxDevRuntime diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/shared/react-jsx-runtime.ts b/packages/next/src/server/future/route-modules/app-page/vendored/shared/react-jsx-runtime.ts new file mode 100644 index 0000000000000..b7d24f304f96b --- /dev/null +++ b/packages/next/src/server/future/route-modules/app-page/vendored/shared/react-jsx-runtime.ts @@ -0,0 +1,3 @@ +module.exports = require('../../module.compiled').vendored[ + 'react-shared' +].ReactJsxRuntime diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/ssr/entrypoints.ts b/packages/next/src/server/future/route-modules/app-page/vendored/ssr/entrypoints.ts new file mode 100644 index 0000000000000..1b5bdbb161887 --- /dev/null +++ b/packages/next/src/server/future/route-modules/app-page/vendored/ssr/entrypoints.ts @@ -0,0 +1,23 @@ +// module.exports = { +// React: require('react'), +// ReactDOM: require('react-dom/server-rendering-stub'), + +// // todo move higher +// ReactJsxRuntime: require('react/jsx-runtime'), +// ReactJsxDevRuntime: require('react/jsx-dev-runtime'), + +// // ReactDOMServerEdge: require('react-dom/cjs/react-dom-server.browser.production.min'), +// ReactDOMServerEdge: require('react-dom/cjs/react-dom-server.node.production.min'), +// // eslint-disable-next-line import/no-extraneous-dependencies +// ReactServerDOMWebpackClientEdge: require('react-server-dom-webpack/client.edge'), +// } + +import * as React from 'react' +import * as ReactDOM from 'react-dom/server-rendering-stub' + +// eslint-disable-next-line import/no-extraneous-dependencies +import * as ReactDOMServerEdge from 'react-dom/server.edge' +// eslint-disable-next-line import/no-extraneous-dependencies +import * as ReactServerDOMWebpackClientEdge from 'react-server-dom-webpack/client.edge' + +export { React, ReactDOM, ReactDOMServerEdge, ReactServerDOMWebpackClientEdge } diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/ssr/react-dom-server-edge.ts b/packages/next/src/server/future/route-modules/app-page/vendored/ssr/react-dom-server-edge.ts new file mode 100644 index 0000000000000..0908aefd95554 --- /dev/null +++ b/packages/next/src/server/future/route-modules/app-page/vendored/ssr/react-dom-server-edge.ts @@ -0,0 +1,3 @@ +module.exports = require('../../module.compiled').vendored[ + 'react-ssr' +].ReactDOMServerEdge diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/ssr/react-dom.ts b/packages/next/src/server/future/route-modules/app-page/vendored/ssr/react-dom.ts new file mode 100644 index 0000000000000..378577fa80ec2 --- /dev/null +++ b/packages/next/src/server/future/route-modules/app-page/vendored/ssr/react-dom.ts @@ -0,0 +1 @@ +module.exports = require('../../module.compiled').vendored['react-ssr'].ReactDOM diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/ssr/react-server-dom-webpack-client-edge.ts b/packages/next/src/server/future/route-modules/app-page/vendored/ssr/react-server-dom-webpack-client-edge.ts new file mode 100644 index 0000000000000..5398d7eecc700 --- /dev/null +++ b/packages/next/src/server/future/route-modules/app-page/vendored/ssr/react-server-dom-webpack-client-edge.ts @@ -0,0 +1,3 @@ +module.exports = require('../../module.compiled').vendored[ + 'react-ssr' +].ReactServerDOMWebpackClientEdge diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/ssr/react.ts b/packages/next/src/server/future/route-modules/app-page/vendored/ssr/react.ts new file mode 100644 index 0000000000000..c2947601471d3 --- /dev/null +++ b/packages/next/src/server/future/route-modules/app-page/vendored/ssr/react.ts @@ -0,0 +1 @@ +module.exports = require('../../module.compiled').vendored['react-ssr'].React diff --git a/packages/next/src/server/import-overrides.ts b/packages/next/src/server/import-overrides.ts index db203e6d04644..2b60f820834c0 100644 --- a/packages/next/src/server/import-overrides.ts +++ b/packages/next/src/server/import-overrides.ts @@ -23,54 +23,54 @@ export const defaultOverrides = { : resolve('styled-jsx/style', nextPaths), } -export const baseOverrides = { - react: 'next/dist/compiled/react', - 'react/package.json': 'next/dist/compiled/react/package.json', - 'react/jsx-runtime': 'next/dist/compiled/react/jsx-runtime', - 'react/jsx-dev-runtime': 'next/dist/compiled/react/jsx-dev-runtime', - 'react-dom': 'next/dist/compiled/react-dom/server-rendering-stub', - 'react-dom/package.json': 'next/dist/compiled/react-dom/package.json', - 'react-dom/client': 'next/dist/compiled/react-dom/client', - 'react-dom/server': 'next/dist/compiled/react-dom/server', - 'react-dom/server.browser': 'next/dist/compiled/react-dom/server.browser', - 'react-dom/server.edge': 'next/dist/compiled/react-dom/server.edge', - 'react-server-dom-webpack/client': - 'next/dist/compiled/react-server-dom-webpack/client', - 'react-server-dom-webpack/client.edge': - 'next/dist/compiled/react-server-dom-webpack/client.edge', - 'react-server-dom-webpack/server.edge': - 'next/dist/compiled/react-server-dom-webpack/server.edge', - 'react-server-dom-webpack/server.node': - 'next/dist/compiled/react-server-dom-webpack/server.node', -} +// export const baseOverrides = { +// react: 'next/dist/compiled/react', +// 'react/package.json': 'next/dist/compiled/react/package.json', +// 'react/jsx-runtime': 'next/dist/compiled/react/jsx-runtime', +// 'react/jsx-dev-runtime': 'next/dist/compiled/react/jsx-dev-runtime', +// 'react-dom': 'next/dist/compiled/react-dom/server-rendering-stub', +// 'react-dom/package.json': 'next/dist/compiled/react-dom/package.json', +// 'react-dom/client': 'next/dist/compiled/react-dom/client', +// 'react-dom/server': 'next/dist/compiled/react-dom/server', +// 'react-dom/server.browser': 'next/dist/compiled/react-dom/server.browser', +// 'react-dom/server.edge': 'next/dist/compiled/react-dom/server.edge', +// 'react-server-dom-webpack/client': +// 'next/dist/compiled/react-server-dom-webpack/client', +// 'react-server-dom-webpack/client.edge': +// 'next/dist/compiled/react-server-dom-webpack/client.edge', +// 'react-server-dom-webpack/server.edge': +// 'next/dist/compiled/react-server-dom-webpack/server.edge', +// 'react-server-dom-webpack/server.node': +// 'next/dist/compiled/react-server-dom-webpack/server.node', +// } -export const experimentalOverrides = { - react: 'next/dist/compiled/react-experimental', - 'react/jsx-runtime': 'next/dist/compiled/react-experimental/jsx-runtime', - 'react/jsx-dev-runtime': - 'next/dist/compiled/react-experimental/jsx-dev-runtime', - 'react-dom': - 'next/dist/compiled/react-dom-experimental/server-rendering-stub', - 'react/package.json': 'next/dist/compiled/react-experimental/package.json', - 'react-dom/package.json': - 'next/dist/compiled/react-dom-experimental/package.json', - 'react-dom/client': 'next/dist/compiled/react-dom-experimental/client', - 'react-dom/server': 'next/dist/compiled/react-dom-experimental/server', - 'react-dom/server.browser': - 'next/dist/compiled/react-dom-experimental/server.browser', - 'react-dom/server.edge': - 'next/dist/compiled/react-dom-experimental/server.edge', - 'react-server-dom-webpack/client': - 'next/dist/compiled/react-server-dom-webpack-experimental/client', - 'react-server-dom-webpack/client.edge': - 'next/dist/compiled/react-server-dom-webpack-experimental/client.edge', - 'react-server-dom-webpack/server.edge': - 'next/dist/compiled/react-server-dom-webpack-experimental/server.edge', - 'react-server-dom-webpack/server.node': - 'next/dist/compiled/react-server-dom-webpack-experimental/server.node', -} +// export const experimentalOverrides = { +// react: 'next/dist/compiled/react-experimental', +// 'react/jsx-runtime': 'next/dist/compiled/react-experimental/jsx-runtime', +// 'react/jsx-dev-runtime': +// 'next/dist/compiled/react-experimental/jsx-dev-runtime', +// 'react-dom': +// 'next/dist/compiled/react-dom-experimental/server-rendering-stub', +// 'react/package.json': 'next/dist/compiled/react-experimental/package.json', +// 'react-dom/package.json': +// 'next/dist/compiled/react-dom-experimental/package.json', +// 'react-dom/client': 'next/dist/compiled/react-dom-experimental/client', +// 'react-dom/server': 'next/dist/compiled/react-dom-experimental/server', +// 'react-dom/server.browser': +// 'next/dist/compiled/react-dom-experimental/server.browser', +// 'react-dom/server.edge': +// 'next/dist/compiled/react-dom-experimental/server.edge', +// 'react-server-dom-webpack/client': +// 'next/dist/compiled/react-server-dom-webpack-experimental/client', +// 'react-server-dom-webpack/client.edge': +// 'next/dist/compiled/react-server-dom-webpack-experimental/client.edge', +// 'react-server-dom-webpack/server.edge': +// 'next/dist/compiled/react-server-dom-webpack-experimental/server.edge', +// 'react-server-dom-webpack/server.node': +// 'next/dist/compiled/react-server-dom-webpack-experimental/server.node', +// } -let aliasedPrebundledReact = false +// let aliasedPrebundledReact = false const toResolveMap = (map: Record): [string, string][] => Object.entries(map).map(([key, value]) => [key, resolve(value, nextPaths)]) @@ -83,19 +83,19 @@ export function addHookAliases(aliases: [string, string][] = []) { addHookAliases(toResolveMap(defaultOverrides)) -// Override built-in React packages if necessary -export function overrideReact() { - if (process.env.__NEXT_PRIVATE_PREBUNDLED_REACT && !aliasedPrebundledReact) { - aliasedPrebundledReact = true +// // Override built-in React packages if necessary +// export function overrideReact() { +// if (process.env.__NEXT_PRIVATE_PREBUNDLED_REACT && !aliasedPrebundledReact) { +// aliasedPrebundledReact = true - // Require these modules with static paths to make sure they are tracked by - // NFT when building the app in standalone mode, as we are now conditionally - // aliasing them it's tricky to track them in build time. - if (process.env.__NEXT_PRIVATE_PREBUNDLED_REACT === 'experimental') { - addHookAliases(toResolveMap(experimentalOverrides)) - } else { - addHookAliases(toResolveMap(baseOverrides)) - } - } -} -overrideReact() +// // Require these modules with static paths to make sure they are tracked by +// // NFT when building the app in standalone mode, as we are now conditionally +// // aliasing them it's tricky to track them in build time. +// if (process.env.__NEXT_PRIVATE_PREBUNDLED_REACT === 'experimental') { +// addHookAliases(toResolveMap(experimentalOverrides)) +// } else { +// addHookAliases(toResolveMap(baseOverrides)) +// } +// } +// } +// overrideReact() diff --git a/packages/next/src/server/require-hook.js b/packages/next/src/server/require-hook.js index ce9e30e6e9ffe..9b473529c9c6d 100644 --- a/packages/next/src/server/require-hook.js +++ b/packages/next/src/server/require-hook.js @@ -8,7 +8,7 @@ const mod = require('module') const originalRequire = mod.prototype.require const resolveFilename = mod._resolveFilename -const { overrideReact, hookPropertyMap } = require('./import-overrides') +const { hookPropertyMap } = require('./import-overrides') mod._resolveFilename = function ( originalResolveFilename, @@ -19,7 +19,7 @@ mod._resolveFilename = function ( options ) { // In case the environment variable is set after the module is loaded. - overrideReact() + // overrideReact() const hookResolved = requestMap.get(request) if (hookResolved) request = hookResolved diff --git a/packages/next/taskfile.js b/packages/next/taskfile.js index 43da4071afb25..08ce0cc5660cb 100644 --- a/packages/next/taskfile.js +++ b/packages/next/taskfile.js @@ -1738,14 +1738,14 @@ export async function copy_vendor_react(task_) { yield task .source(join(reactDir, 'cjs/**/*.js')) // eslint-disable-next-line require-yield - .run({ every: true }, function* (file) { - const source = file.data.toString() - // We replace the module/chunk loading code with our own implementation in Next.js. - file.data = source.replace( - /require\(["']react["']\)/g, - `require("next/dist/compiled/react${packageSuffix}")` - ) - }) + // .run({ every: true }, function* (file) { + // const source = file.data.toString() + // // We replace the module/chunk loading code with our own implementation in Next.js. + // file.data = source.replace( + // /require\(["']react["']\)/g, + // `require("next/dist/compiled/react${packageSuffix}")` + // ) + // }) .target(`src/compiled/react${packageSuffix}/cjs`) yield task @@ -1763,22 +1763,22 @@ export async function copy_vendor_react(task_) { yield task .source(join(reactDomDir, 'cjs/**/*.js')) // eslint-disable-next-line require-yield - .run({ every: true }, function* (file) { - const source = file.data.toString() - // We replace the module/chunk loading code with our own implementation in Next.js. - file.data = source - .replace( - /require\(["']scheduler["']\)/g, - `require("next/dist/compiled/scheduler${packageSuffix}")` - ) - .replace( - /require\(["']react["']\)/g, - `require("next/dist/compiled/react${packageSuffix}")` - ) - - // Note that we don't replace `react-dom` with `next/dist/compiled/react-dom` - // as it mighe be aliased to the server rendering stub. - }) + // .run({ every: true }, function* (file) { + // const source = file.data.toString() + // // We replace the module/chunk loading code with our own implementation in Next.js. + // file.data = source + // .replace( + // /require\(["']scheduler["']\)/g, + // `require("next/dist/compiled/scheduler${packageSuffix}")` + // ) + // .replace( + // /require\(["']react["']\)/g, + // `require("next/dist/compiled/react${packageSuffix}")` + // ) + + // // Note that we don't replace `react-dom` with `next/dist/compiled/react-dom` + // // as it mighe be aliased to the server rendering stub. + // }) .target(`src/compiled/react-dom${packageSuffix}/cjs`) // Remove unused files @@ -2662,38 +2662,137 @@ export async function release(task) { await task.clear('dist').start('build') } -export async function next_bundle_prod(task, opts) { +export async function next_bundle_app_turbo(task, opts) { + await task.source('dist').webpack({ + watch: opts.dev, + config: require('./webpack.config')({ + turbo: true, + bundleType: 'app', + }), + name: 'next-bundle-app-turbo', + }) +} + +export async function next_bundle_app_prod(task, opts) { + await task.source('dist').webpack({ + watch: opts.dev, + config: require('./webpack.config')({ + dev: false, + bundleType: 'app', + }), + name: 'next-bundle-app-prod', + }) +} + +export async function next_bundle_app_dev(task, opts) { + await task.source('dist').webpack({ + watch: opts.dev, + config: require('./webpack.config')({ + dev: true, + bundleType: 'app', + }), + name: 'next-bundle-app-dev', + }) +} + +export async function next_bundle_app_turbo_experimental(task, opts) { + await task.source('dist').webpack({ + watch: opts.dev, + config: require('./webpack.config')({ + turbo: true, + bundleType: 'app', + experimental: true, + }), + name: 'next-bundle-app-turbo-experimental', + }) +} + +export async function next_bundle_app_prod_experimental(task, opts) { + await task.source('dist').webpack({ + watch: opts.dev, + config: require('./webpack.config')({ + dev: false, + bundleType: 'app', + experimental: true, + }), + name: 'next-bundle-app-prod-experimental', + }) +} + +export async function next_bundle_app_dev_experimental(task, opts) { + await task.source('dist').webpack({ + watch: opts.dev, + config: require('./webpack.config')({ + dev: true, + bundleType: 'app', + experimental: true, + }), + name: 'next-bundle-app-dev-experimental', + }) +} + +export async function next_bundle_pages_prod(task, opts) { await task.source('dist').webpack({ watch: opts.dev, config: require('./webpack.config')({ dev: false, + bundleType: 'pages', }), - name: 'next-bundle-prod', + name: 'next-bundle-pages-prod', }) } -export async function next_bundle_dev(task, opts) { +export async function next_bundle_pages_dev(task, opts) { await task.source('dist').webpack({ watch: opts.dev, config: require('./webpack.config')({ dev: true, + bundleType: 'pages', }), - name: 'next-bundle-dev', + name: 'next-bundle-pages-dev', }) } -export async function next_bundle_turbo_prod(task, opts) { +export async function next_bundle_pages_turbo(task, opts) { await task.source('dist').webpack({ watch: opts.dev, config: require('./webpack.config')({ turbo: true, + bundleType: 'pages', + }), + name: 'next-bundle-pages-turbo', + }) +} + +export async function next_bundle_server(task, opts) { + await task.source('dist').webpack({ + watch: opts.dev, + config: require('./webpack.config')({ + dev: false, + bundleType: 'server', }), - name: 'next-bundle-prod-turbo', + name: 'next-bundle-server', }) } + export async function next_bundle(task, opts) { await task.parallel( - ['next_bundle_prod', 'next_bundle_dev', 'next_bundle_turbo_prod'], + [ + // builds the app (route/page) bundles + 'next_bundle_app_turbo', + 'next_bundle_app_prod', + 'next_bundle_app_dev', + // builds the app (route/page) bundles with react experimental + 'next_bundle_app_turbo_experimental', + 'next_bundle_app_prod_experimental', + 'next_bundle_app_dev_experimental', + // builds the pages (page/api) bundles + 'next_bundle_pages_prod', + 'next_bundle_pages_dev', + 'next_bundle_pages_turbo', + // builds the minimal server + 'next_bundle_server', + ], opts ) } diff --git a/packages/next/types/misc.d.ts b/packages/next/types/misc.d.ts index b22d2bd2957ee..e98312232711d 100644 --- a/packages/next/types/misc.d.ts +++ b/packages/next/types/misc.d.ts @@ -20,8 +20,13 @@ declare module 'next/dist/compiled/react-dom/server' declare module 'next/dist/compiled/react-dom/server.edge' declare module 'next/dist/compiled/react-dom/server.browser' declare module 'next/dist/compiled/browserslist' + declare module 'react-server-dom-webpack/client' declare module 'react-server-dom-webpack/server.edge' +declare module 'react-server-dom-webpack/server.node' +declare module 'react-server-dom-webpack/client.edge' + +declare module 'react-dom/server-rendering-stub' declare module 'react-dom/server.browser' declare module 'react-dom/server.edge' diff --git a/packages/next/webpack.config.js b/packages/next/webpack.config.js index 83fe9d3009877..e00fe36188065 100644 --- a/packages/next/webpack.config.js +++ b/packages/next/webpack.config.js @@ -3,7 +3,7 @@ const path = require('path') const TerserPlugin = require('terser-webpack-plugin') const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer') -const minimalExternals = [ +const pagesExternals = [ 'react', 'react/package.json', 'react/jsx-runtime', @@ -18,6 +18,33 @@ const minimalExternals = [ 'react-server-dom-webpack/client.edge', 'react-server-dom-webpack/server.edge', 'react-server-dom-webpack/server.node', +] + +function makeAppAliases(reactChannel) { + const alias = { + react$: `next/dist/compiled/react${reactChannel}`, + 'react/shared-subset$': `next/dist/compiled/react${reactChannel}/react.shared-subset`, + 'react-dom/server-rendering-stub$': `next/dist/compiled/react-dom${reactChannel}/server-rendering-stub`, + 'react-dom$': `next/dist/compiled/react-dom${reactChannel}/server-rendering-stub`, + 'react/jsx-runtime$': `next/dist/compiled/react${reactChannel}/jsx-runtime`, + 'react/jsx-dev-runtime$': `next/dist/compiled/react${reactChannel}/jsx-dev-runtime`, + 'react-dom/client$': `next/dist/compiled/react-dom${reactChannel}/client`, + 'react-dom/server$': `next/dist/compiled/react-dom${reactChannel}/server`, + 'react-dom/server.edge$': `next/dist/compiled/react-dom${reactChannel}/server.edge`, + 'react-dom/server.browser$': `next/dist/compiled/react-dom${reactChannel}/server.browser`, + 'react-server-dom-webpack/client$': `next/dist/compiled/react-server-dom-webpack${reactChannel}/client`, + 'react-server-dom-webpack/client.edge$': `next/dist/compiled/react-server-dom-webpack${reactChannel}/client.edge`, + 'react-server-dom-webpack/server.edge$': `next/dist/compiled/react-server-dom-webpack${reactChannel}/server.edge`, + 'react-server-dom-webpack/server.node$': `next/dist/compiled/react-server-dom-webpack${reactChannel}/server.node`, + } + + return alias +} + +const appAliases = makeAppAliases('') +const appExperimentalAliases = makeAppAliases('-experimental') + +const sharedExternals = [ 'styled-jsx', 'styled-jsx/style', '@opentelemetry/api', @@ -44,7 +71,33 @@ const externalsRegexMap = { '(.*)trace/tracer$': 'next/dist/server/lib/trace/tracer', } -module.exports = ({ dev, turbo }) => { +const bundleTypes = { + app: { + 'app-page': path.join( + __dirname, + 'dist/esm/server/future/route-modules/app-page/module.js' + ), + 'app-route': path.join( + __dirname, + 'dist/esm/server/future/route-modules/app-route/module.js' + ), + }, + pages: { + pages: path.join( + __dirname, + 'dist/esm/server/future/route-modules/pages/module.js' + ), + 'pages-api': path.join( + __dirname, + 'dist/esm/server/future/route-modules/pages-api/module.js' + ), + }, + server: { + server: path.join(__dirname, 'dist/esm/server/next-server.js'), + }, +} + +module.exports = ({ dev, turbo, bundleType, experimental }) => { const externalHandler = ({ context, request, getResolve }, callback) => { ;(async () => { if ( @@ -72,32 +125,14 @@ module.exports = ({ dev, turbo }) => { /** @type {webpack.Configuration} */ return { - entry: { - server: path.join(__dirname, 'dist/esm/server/next-server.js'), - 'app-page': path.join( - __dirname, - 'dist/esm/server/future/route-modules/app-page/module.js' - ), - 'app-route': path.join( - __dirname, - 'dist/esm/server/future/route-modules/app-route/module.js' - ), - pages: path.join( - __dirname, - 'dist/esm/server/future/route-modules/pages/module.js' - ), - 'pages-api': path.join( - __dirname, - 'dist/esm/server/future/route-modules/pages-api/module.js' - ), - }, + entry: bundleTypes[bundleType], target: 'node', mode: 'production', output: { path: path.join(__dirname, 'dist/compiled/next-server'), - filename: `[name]${turbo ? '-turbo' : ''}.runtime.${ - dev ? 'dev' : 'prod' - }.js`, + filename: `[name]${turbo ? '-turbo' : ''}${ + experimental ? '-experimental' : '' + }.runtime.${dev ? 'dev' : 'prod'}.js`, libraryTarget: 'commonjs2', }, optimization: { @@ -123,6 +158,7 @@ module.exports = ({ dev, turbo }) => { }, plugins: [ new webpack.DefinePlugin({ + // TODO: inject typeof window === 'undefined' 'process.env.NEXT_MINIMAL': JSON.stringify('true'), 'this.serverOptions.experimentalTestProxy': JSON.stringify(false), 'this.minimalMode': JSON.stringify(true), @@ -135,12 +171,81 @@ module.exports = ({ dev, turbo }) => { }), !!process.env.ANALYZE && new BundleAnalyzerPlugin({ - analyzerPort: 8888 + (dev ? 0 : 1) + (turbo ? 1 : 0), + analyzerPort: calculateUniquePort( + dev, + turbo, + experimental, + bundleType + ), + openAnalyzer: false, }), ].filter(Boolean), stats: { optimizationBailout: true, }, - externals: [...minimalExternals, externalsMap, externalHandler], + resolve: { + alias: + bundleType === 'app' + ? experimental + ? appExperimentalAliases + : appAliases + : {}, + }, + module: { + rules: [ + { + include: /vendored\/rsc\/entrypoints/, + resolve: { + conditionNames: ['react-server', '...'], + alias: { + react$: `next/dist/compiled/react${ + experimental ? '-experimental' : '' + }/react.shared-subset`, + }, + }, + layer: 'react-server', + }, + { + issuerLayer: 'react-server', + resolve: { + conditionNames: ['react-server', '...'], + alias: { + react$: `next/dist/compiled/react${ + experimental ? '-experimental' : '' + }/react.shared-subset`, + }, + }, + }, + ], + }, + externals: [ + ...sharedExternals, + ...(bundleType === 'pages' ? pagesExternals : []), + externalsMap, + externalHandler, + ], + experiments: { + layers: true, + }, } } + +function calculateUniquePort(dev, turbo, experimental, bundleType) { + const devOffset = dev ? 1000 : 0 + const turboOffset = turbo ? 200 : 0 + const experimentalOffset = experimental ? 40 : 0 + let bundleTypeOffset + + switch (bundleType) { + case 'app': + bundleTypeOffset = 1 + break + case 'pages': + bundleTypeOffset = 2 + break + default: + bundleTypeOffset = 3 + } + + return 8888 + devOffset + turboOffset + experimentalOffset + bundleTypeOffset +} From a12c76acab76c660add4389d34c2ff48f5c6100f Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Thu, 14 Sep 2023 11:03:35 +0200 Subject: [PATCH 02/48] types --- packages/next/src/build/webpack-config.ts | 2 +- packages/next/src/lib/metadata/metadata.tsx | 1 - packages/next/src/server/app-render/app-render.tsx | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/next/src/build/webpack-config.ts b/packages/next/src/build/webpack-config.ts index 7123a3c94d834..0b5973e55e972 100644 --- a/packages/next/src/build/webpack-config.ts +++ b/packages/next/src/build/webpack-config.ts @@ -87,7 +87,7 @@ const NEXT_PROJECT_ROOT_DIST_CLIENT = path.join( ) const isWebpackServerLayer = (layer: WebpackLayerName | null) => - Boolean(layer && WEBPACK_LAYERS.GROUP.server.includes(layer)) + Boolean(layer && WEBPACK_LAYERS.GROUP.server.includes(layer as any)) if (parseInt(React.version) < 18) { throw new Error('Next.js requires react >= 18.2.0 to be installed.') diff --git a/packages/next/src/lib/metadata/metadata.tsx b/packages/next/src/lib/metadata/metadata.tsx index e32ed342dfae3..fe86008973641 100644 --- a/packages/next/src/lib/metadata/metadata.tsx +++ b/packages/next/src/lib/metadata/metadata.tsx @@ -129,6 +129,5 @@ export function createMetadataComponents({ return null } - // @ts-expect-error async server components return [MetadataTree, MetadataOutlet] } diff --git a/packages/next/src/server/app-render/app-render.tsx b/packages/next/src/server/app-render/app-render.tsx index 11c094e6691de..231333a711a25 100644 --- a/packages/next/src/server/app-render/app-render.tsx +++ b/packages/next/src/server/app-render/app-render.tsx @@ -1105,7 +1105,7 @@ export async function renderToHTMLOrFlight( isPrefetch && !Boolean(components.loading) ? null : // Create component tree using the slice of the loaderTree - // @ts-expect-error TODO-APP: fix async component type + React.createElement(async () => { const { Component } = await createComponentTree( // This ensures flightRouterPath is valid and filters down the tree From 9c45cf03063db067f76275ce744ed5ff8d164b74 Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Thu, 14 Sep 2023 11:10:08 +0200 Subject: [PATCH 03/48] Revert "types" This reverts commit a12c76acab76c660add4389d34c2ff48f5c6100f. --- packages/next/src/lib/metadata/metadata.tsx | 1 + packages/next/src/server/app-render/app-render.tsx | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/next/src/lib/metadata/metadata.tsx b/packages/next/src/lib/metadata/metadata.tsx index fe86008973641..e32ed342dfae3 100644 --- a/packages/next/src/lib/metadata/metadata.tsx +++ b/packages/next/src/lib/metadata/metadata.tsx @@ -129,5 +129,6 @@ export function createMetadataComponents({ return null } + // @ts-expect-error async server components return [MetadataTree, MetadataOutlet] } diff --git a/packages/next/src/server/app-render/app-render.tsx b/packages/next/src/server/app-render/app-render.tsx index 231333a711a25..11c094e6691de 100644 --- a/packages/next/src/server/app-render/app-render.tsx +++ b/packages/next/src/server/app-render/app-render.tsx @@ -1105,7 +1105,7 @@ export async function renderToHTMLOrFlight( isPrefetch && !Boolean(components.loading) ? null : // Create component tree using the slice of the loaderTree - + // @ts-expect-error TODO-APP: fix async component type React.createElement(async () => { const { Component } = await createComponentTree( // This ensures flightRouterPath is valid and filters down the tree From 1e44d5289ff18d75614f36abaf09396f37620efe Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Thu, 14 Sep 2023 13:18:40 +0200 Subject: [PATCH 04/48] fix edge --- packages/next/src/build/webpack-config.ts | 47 +++++++++++-------- .../future/route-modules/app-page/module.ts | 13 +++-- packages/next/webpack.config.js | 4 +- 3 files changed, 40 insertions(+), 24 deletions(-) diff --git a/packages/next/src/build/webpack-config.ts b/packages/next/src/build/webpack-config.ts index 0b5973e55e972..2b68047e07065 100644 --- a/packages/next/src/build/webpack-config.ts +++ b/packages/next/src/build/webpack-config.ts @@ -393,6 +393,7 @@ function createRSCAliases( bundledReactChannel: string, opts: { layer: WebpackLayerName & ('rsc' | 'ssr' | 'app-pages-browser') + isEdgeServer: boolean reactProductionProfiling: boolean // reactSharedSubset: boolean // reactDomServerRenderingStub: boolean @@ -400,7 +401,7 @@ function createRSCAliases( } ) { const alias: Record = - opts.layer === 'app-pages-browser' + opts.layer === 'app-pages-browser' || opts.isEdgeServer ? { react$: `next/dist/compiled/react${bundledReactChannel}`, 'react-dom$': `next/dist/compiled/react-dom${bundledReactChannel}`, @@ -430,24 +431,27 @@ function createRSCAliases( 'react-server-dom-webpack/server.node$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-server-dom-webpack-server-node`, } - // if (opts.reactSharedSubset) { - // // alias[ - // // 'react$' - // // ] = `next/dist/compiled/react${bundledReactChannel}/react.shared-subset` - // alias[ - // 'react$' - // ] = `next/dist/server/future/route-modules/app-page/vendored/react-shared-subset` - // } - // // Use server rendering stub for RSC - // // x-ref: https://github.com/facebook/react/pull/25436 - // if (opts.reactDomServerRenderingStub) { - // // alias[ - // // 'react-dom$' - // // ] = `next/dist/compiled/react-dom${bundledReactChannel}/server-rendering-stub` - // alias[ - // 'react-dom$' - // ] = `next/dist/server/future/route-modules/app-page/vendored/react-server-rendering-stub` - // } + if (opts.isEdgeServer) { + if (opts.layer === 'rsc') { + alias[ + 'react$' + ] = `next/dist/compiled/react${bundledReactChannel}/react.shared-subset` + } + // alias[ + // 'react$' + // ] = `next/dist/server/future/route-modules/app-page/vendored/react-shared-subset` + // } + // Use server rendering stub for RSC + // x-ref: https://github.com/facebook/react/pull/25436 + // if (opts.reactDomServerRenderingStub) { + alias[ + 'react-dom$' + ] = `next/dist/compiled/react-dom${bundledReactChannel}/server-rendering-stub` + // alias[ + // 'react-dom$' + // ] = `next/dist/server/future/route-modules/app-page/vendored/react-server-rendering-stub` + // } + } // Alias `server-only` and `client-only` modules to their server/client only, vendored versions. // These aliases are necessary if the user doesn't have those two packages installed manually. @@ -1164,6 +1168,7 @@ export default async function getBaseWebpackConfig( reactProductionProfiling, // browser: true, layer: 'app-pages-browser', + isEdgeServer, }) : {}), @@ -2198,6 +2203,7 @@ export default async function getBaseWebpackConfig( reactProductionProfiling, // browser: false, layer: WEBPACK_LAYERS.reactServerComponents, + isEdgeServer, }), }, use: { @@ -2262,6 +2268,7 @@ export default async function getBaseWebpackConfig( reactProductionProfiling, // browser: false, layer: WEBPACK_LAYERS.reactServerComponents, + isEdgeServer, }), }, }, @@ -2276,6 +2283,7 @@ export default async function getBaseWebpackConfig( reactProductionProfiling, // browser: true, layer: WEBPACK_LAYERS.serverSideRendering, + isEdgeServer, }), }, }, @@ -2293,6 +2301,7 @@ export default async function getBaseWebpackConfig( reactProductionProfiling, // browser: isClient, layer: WEBPACK_LAYERS.appPagesBrowser, + isEdgeServer, }), }, }, diff --git a/packages/next/src/server/future/route-modules/app-page/module.ts b/packages/next/src/server/future/route-modules/app-page/module.ts index fac86c7f73fde..eb76489885e73 100644 --- a/packages/next/src/server/future/route-modules/app-page/module.ts +++ b/packages/next/src/server/future/route-modules/app-page/module.ts @@ -12,9 +12,16 @@ import { type RouteModuleHandleContext, } from '../route-module' import * as sharedModules from './shared-modules' -import * as vendoredReactRSC from './vendored/rsc/entrypoints' -import * as vendoredReactSSR from './vendored/ssr/entrypoints' -import * as vendoredReactShared from './vendored/shared/entrypoints' + +let vendoredReactRSC +let vendoredReactSSR +let vendoredReactShared + +if (process.env.NEXT_RUNTIME !== 'edge') { + vendoredReactRSC = require('./vendored/rsc/entrypoints') + vendoredReactSSR = require('./vendored/ssr/entrypoints') + vendoredReactShared = require('./vendored/shared/entrypoints') +} type AppPageUserlandModule = { /** diff --git a/packages/next/webpack.config.js b/packages/next/webpack.config.js index e00fe36188065..5d7838fc62833 100644 --- a/packages/next/webpack.config.js +++ b/packages/next/webpack.config.js @@ -20,7 +20,7 @@ const pagesExternals = [ 'react-server-dom-webpack/server.node', ] -function makeAppAliases(reactChannel) { +function makeAppAliases(reactChannel = '') { const alias = { react$: `next/dist/compiled/react${reactChannel}`, 'react/shared-subset$': `next/dist/compiled/react${reactChannel}/react.shared-subset`, @@ -41,7 +41,7 @@ function makeAppAliases(reactChannel) { return alias } -const appAliases = makeAppAliases('') +const appAliases = makeAppAliases() const appExperimentalAliases = makeAppAliases('-experimental') const sharedExternals = [ From 8193d1b3bda3ff6fa48f4c3371446cffc5a8f2cb Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Thu, 14 Sep 2023 13:29:22 +0200 Subject: [PATCH 05/48] tree shake typeof window --- packages/next/src/build/webpack-config.ts | 5 +++++ packages/next/webpack.config.js | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/next/src/build/webpack-config.ts b/packages/next/src/build/webpack-config.ts index 2b68047e07065..6dfd3a9f101c2 100644 --- a/packages/next/src/build/webpack-config.ts +++ b/packages/next/src/build/webpack-config.ts @@ -379,6 +379,11 @@ export function getDefineEnv({ } : undefined), 'process.env.TURBOPACK': JSON.stringify(false), + ...(isNodeOrEdgeCompilation + ? { + 'typeof window': JSON.stringify('undefined'), + } + : undefined), } } diff --git a/packages/next/webpack.config.js b/packages/next/webpack.config.js index 5d7838fc62833..11154886c0704 100644 --- a/packages/next/webpack.config.js +++ b/packages/next/webpack.config.js @@ -158,7 +158,7 @@ module.exports = ({ dev, turbo, bundleType, experimental }) => { }, plugins: [ new webpack.DefinePlugin({ - // TODO: inject typeof window === 'undefined' + 'typeof window': JSON.stringify('undefined'), 'process.env.NEXT_MINIMAL': JSON.stringify('true'), 'this.serverOptions.experimentalTestProxy': JSON.stringify(false), 'this.minimalMode': JSON.stringify(true), From 5c33d38c2171d47ba499a5c913e4a807e3b79397 Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Thu, 14 Sep 2023 14:02:25 +0200 Subject: [PATCH 06/48] fix actions --- packages/next/src/build/webpack-config.ts | 10 ++++++++++ .../route-modules/app-page/module.compiled.ts | 20 ++++++++++++++----- .../src/server/lib/router-utils/setup-dev.ts | 1 + 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/packages/next/src/build/webpack-config.ts b/packages/next/src/build/webpack-config.ts index 6dfd3a9f101c2..15b5f272b71ce 100644 --- a/packages/next/src/build/webpack-config.ts +++ b/packages/next/src/build/webpack-config.ts @@ -202,6 +202,7 @@ export function getDefineEnv({ isNodeServer, middlewareMatchers, previewModeId, + useServerActions, }: { allowedRevalidateHeaderKeys: string[] | undefined clientRouterFilters: Parameters< @@ -218,6 +219,7 @@ export function getDefineEnv({ isNodeServer: boolean middlewareMatchers: MiddlewareMatcher[] | undefined previewModeId: string | undefined + useServerActions: boolean }) { return { // internal field to identify the plugin config @@ -384,6 +386,12 @@ export function getDefineEnv({ 'typeof window': JSON.stringify('undefined'), } : undefined), + ...(isNodeServer + ? { + 'process.env.__NEXT_EXPERIMENTAL_REACT': + JSON.stringify(useServerActions), + } + : undefined), } } @@ -755,6 +763,7 @@ export async function loadProjectInfo({ const UNSAFE_CACHE_REGEX = /[\\/]pages[\\/][^\\/]+(?:$|\?|#)/ +let count = 0 export default async function getBaseWebpackConfig( dir: string, { @@ -2564,6 +2573,7 @@ export default async function getBaseWebpackConfig( isNodeServer, middlewareMatchers, previewModeId, + useServerActions, }) ), isClient && diff --git a/packages/next/src/server/future/route-modules/app-page/module.compiled.ts b/packages/next/src/server/future/route-modules/app-page/module.compiled.ts index 78601739acbe5..f25b70992b1df 100644 --- a/packages/next/src/server/future/route-modules/app-page/module.compiled.ts +++ b/packages/next/src/server/future/route-modules/app-page/module.compiled.ts @@ -1,11 +1,21 @@ if (process.env.NEXT_RUNTIME === 'edge') { module.exports = require('next/dist/server/future/route-modules/app-page/module.js') } else { - if (process.env.NODE_ENV === 'development') { - module.exports = require('next/dist/compiled/next-server/app-page.runtime.dev.js') - } else if (process.env.TURBOPACK) { - module.exports = require('next/dist/compiled/next-server/app-page-turbo.runtime.prod.js') + if (process.env.__NEXT_EXPERIMENTAL_REACT) { + if (process.env.NODE_ENV === 'development') { + module.exports = require('next/dist/compiled/next-server/app-page-experimental.runtime.dev.js') + } else if (process.env.TURBOPACK) { + module.exports = require('next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js') + } else { + module.exports = require('next/dist/compiled/next-server/app-page-experimental.runtime.prod.js') + } } else { - module.exports = require('next/dist/compiled/next-server/app-page.runtime.prod.js') + if (process.env.NODE_ENV === 'development') { + module.exports = require('next/dist/compiled/next-server/app-page.runtime.dev.js') + } else if (process.env.TURBOPACK) { + module.exports = require('next/dist/compiled/next-server/app-page-turbo.runtime.prod.js') + } else { + module.exports = require('next/dist/compiled/next-server/app-page.runtime.prod.js') + } } } 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 41edb225462f8..8d1f115aaf6ee 100644 --- a/packages/next/src/server/lib/router-utils/setup-dev.ts +++ b/packages/next/src/server/lib/router-utils/setup-dev.ts @@ -1698,6 +1698,7 @@ async function startWatcher(opts: SetupOpts) { isNodeServer, middlewareMatchers: undefined, previewModeId: undefined, + useServerActions: !!nextConfig.experimental.serverActions, }) Object.keys(plugin.definitions).forEach((key) => { From d48d793d14eaf51a78f405f6053be40caabffc9c Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Thu, 14 Sep 2023 14:05:36 +0200 Subject: [PATCH 07/48] update test --- test/production/custom-server/custom-server.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/production/custom-server/custom-server.test.ts b/test/production/custom-server/custom-server.test.ts index cb643e015b545..d3514ee0c167a 100644 --- a/test/production/custom-server/custom-server.test.ts +++ b/test/production/custom-server/custom-server.test.ts @@ -21,10 +21,10 @@ createNextDescribe( expect($('body').text()).toMatch(/app: .+-canary/) }) - it('should render pages with react canary', async () => { + it('should not render pages with react canary', async () => { const $ = await next.render$(`/2`) expect($('body').text()).toMatch(/pages:/) - expect($('body').text()).toMatch(/canary/) + expect($('body').text()).not.toMatch(/canary/) }) }) } From eac661a60eff8d9507359d0c1f48a63ce7eb08e1 Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Thu, 14 Sep 2023 15:13:30 +0200 Subject: [PATCH 08/48] temporary HMR fix --- .../nextjs-require-cache-hot-reloader.ts | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/packages/next/src/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts b/packages/next/src/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts index f14071a5df009..6f012c9a56e25 100644 --- a/packages/next/src/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts +++ b/packages/next/src/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts @@ -12,29 +12,30 @@ const originModules = [ require.resolve('../../../server/require'), require.resolve('../../../server/load-components'), require.resolve('../../../server/next-server'), - require.resolve('../../../compiled/react-server-dom-webpack/client.edge'), - require.resolve( - '../../../compiled/react-server-dom-webpack-experimental/client.edge' - ), + // require.resolve('../../../compiled/react-server-dom-webpack/client.edge'), + // require.resolve( + // '../../../compiled/react-server-dom-webpack-experimental/client.edge' + // ), ] const RUNTIME_NAMES = ['webpack-runtime', 'webpack-api-runtime'] export function deleteAppClientCache() { - // ensure we reset the cache for rsc components - // loaded via react-server-dom-webpack - const reactServerDomModId = require.resolve( - 'react-server-dom-webpack/client.edge' - ) - const reactServerDomMod = require.cache[reactServerDomModId] + return + // // ensure we reset the cache for rsc components + // // loaded via react-server-dom-webpack + // const reactServerDomModId = require.resolve( + // 'react-server-dom-webpack/client.edge' + // ) + // const reactServerDomMod = require.cache[reactServerDomModId] - if (reactServerDomMod) { - for (const child of reactServerDomMod.children) { - child.parent = null - delete require.cache[child.id] - } - } - delete require.cache[reactServerDomModId] + // if (reactServerDomMod) { + // for (const child of reactServerDomMod.children) { + // child.parent = null + // delete require.cache[child.id] + // } + // } + // delete require.cache[reactServerDomModId] } export function deleteCache(filePath: string) { From 3eef50884c64fcc9dc1117571829fea7add9951b Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Thu, 14 Sep 2023 15:39:24 +0200 Subject: [PATCH 09/48] fix server actions build --- packages/next/src/build/webpack-config.ts | 1 - packages/next/src/export/index.ts | 1 + packages/next/src/export/worker.ts | 5 +++++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/next/src/build/webpack-config.ts b/packages/next/src/build/webpack-config.ts index 15b5f272b71ce..7dd5a34171429 100644 --- a/packages/next/src/build/webpack-config.ts +++ b/packages/next/src/build/webpack-config.ts @@ -1454,7 +1454,6 @@ export default async function getBaseWebpackConfig( const notExternalModules = /^(?:private-next-pages\/|next\/(?:dist\/pages\/|(?:app|document|link|image|legacy\/image|constants|dynamic|script|navigation|headers|router)$)|string-hash|private-next-rsc-action-validate|private-next-rsc-action-client-wrapper|private-next-rsc-action-proxy$)/ if (notExternalModules.test(request)) { - console.log('notExternalModules', request) return } } diff --git a/packages/next/src/export/index.ts b/packages/next/src/export/index.ts index 7c2fc4ebd89db..f8f32f48d5418 100644 --- a/packages/next/src/export/index.ts +++ b/packages/next/src/export/index.ts @@ -730,6 +730,7 @@ export default async function exportApp( fetchCacheKeyPrefix: nextConfig.experimental.fetchCacheKeyPrefix, incrementalCacheHandlerPath: nextConfig.experimental.incrementalCacheHandlerPath, + serverActions: nextConfig.experimental.serverActions, }) for (const validation of result.ampValidations || []) { diff --git a/packages/next/src/export/worker.ts b/packages/next/src/export/worker.ts index 0a554e32da05e..6fd2bba36e8e4 100644 --- a/packages/next/src/export/worker.ts +++ b/packages/next/src/export/worker.ts @@ -96,6 +96,7 @@ interface ExportPageInput { incrementalCacheHandlerPath?: string fetchCacheKeyPrefix?: string nextConfigOutput?: NextConfigComplete['output'] + serverActions?: boolean } interface ExportPageResults { @@ -152,6 +153,7 @@ export default async function exportPage({ fetchCache, fetchCacheKeyPrefix, incrementalCacheHandlerPath, + serverActions, }: ExportPageInput): Promise { setHttpClientAndAgentOptions({ httpAgentOptions, @@ -168,6 +170,9 @@ export default async function exportPage({ if (renderOpts.deploymentId) { process.env.NEXT_DEPLOYMENT_ID = renderOpts.deploymentId } + if (serverActions) { + process.env.__NEXT_EXPERIMENTAL_REACT = 'true' + } const { query: originalQuery = {} } = pathMap const { page } = pathMap const pathname = normalizeAppPath(page) From 886279b00a307fef9f1618dee0c9df283ecf5b07 Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Thu, 14 Sep 2023 16:51:02 +0200 Subject: [PATCH 10/48] fix bundled react in pages --- packages/next/src/build/webpack-config.ts | 98 ++++++++++--------- packages/next/webpack.config.js | 2 +- .../rsc-basic/app/app-react/client-react.js | 2 +- .../app-dir/rsc-basic/app/app-react/page.js | 2 +- test/e2e/app-dir/rsc-basic/rsc-basic.test.ts | 8 +- 5 files changed, 58 insertions(+), 54 deletions(-) diff --git a/packages/next/src/build/webpack-config.ts b/packages/next/src/build/webpack-config.ts index 7dd5a34171429..7153efb725fb6 100644 --- a/packages/next/src/build/webpack-config.ts +++ b/packages/next/src/build/webpack-config.ts @@ -408,41 +408,46 @@ function createRSCAliases( layer: WebpackLayerName & ('rsc' | 'ssr' | 'app-pages-browser') isEdgeServer: boolean reactProductionProfiling: boolean - // reactSharedSubset: boolean - // reactDomServerRenderingStub: boolean reactServerCondition?: boolean } ) { - const alias: Record = - opts.layer === 'app-pages-browser' || opts.isEdgeServer - ? { - react$: `next/dist/compiled/react${bundledReactChannel}`, - 'react-dom$': `next/dist/compiled/react-dom${bundledReactChannel}`, - 'react/jsx-runtime$': `next/dist/compiled/react${bundledReactChannel}/jsx-runtime`, - 'react/jsx-dev-runtime$': `next/dist/compiled/react${bundledReactChannel}/jsx-dev-runtime`, - 'react-dom/client$': `next/dist/compiled/react-dom${bundledReactChannel}/client`, - 'react-dom/server$': `next/dist/compiled/react-dom${bundledReactChannel}/server`, - 'react-dom/server.edge$': `next/dist/compiled/react-dom${bundledReactChannel}/server.edge`, - 'react-dom/server.browser$': `next/dist/compiled/react-dom${bundledReactChannel}/server.browser`, - 'react-server-dom-webpack/client$': `next/dist/compiled/react-server-dom-webpack${bundledReactChannel}/client`, - 'react-server-dom-webpack/client.edge$': `next/dist/compiled/react-server-dom-webpack${bundledReactChannel}/client.edge`, - 'react-server-dom-webpack/server.edge$': `next/dist/compiled/react-server-dom-webpack${bundledReactChannel}/server.edge`, - 'react-server-dom-webpack/server.node$': `next/dist/compiled/react-server-dom-webpack${bundledReactChannel}/server.node`, - } - : { - react$: `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react`, - 'react-dom$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-dom`, - 'react/jsx-runtime$': `next/dist/server/future/route-modules/app-page/vendored/shared/react-jsx-runtime`, - 'react/jsx-dev-runtime$': `next/dist/server/future/route-modules/app-page/vendored/shared/react-jsx-dev-runtime`, - 'react-dom/client$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-dom-client`, - 'react-dom/server$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-dom-server`, - 'react-dom/server.edge$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-dom-server-edge`, - 'react-dom/server.browser$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-dom-server-browser`, - 'react-server-dom-webpack/client$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-server-dom-webpack-client`, - 'react-server-dom-webpack/client.edge$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-server-dom-webpack-client-edge`, - 'react-server-dom-webpack/server.edge$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-server-dom-webpack-server-edge`, - 'react-server-dom-webpack/server.node$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-server-dom-webpack-server-node`, - } + let alias: Record = {} + if (opts.layer === 'app-pages-browser' || opts.isEdgeServer) { + alias = { + react$: `next/dist/compiled/react${bundledReactChannel}`, + 'react-dom$': `next/dist/compiled/react-dom${bundledReactChannel}`, + 'react/jsx-runtime$': `next/dist/compiled/react${bundledReactChannel}/jsx-runtime`, + 'react/jsx-dev-runtime$': `next/dist/compiled/react${bundledReactChannel}/jsx-dev-runtime`, + 'react-dom/client$': `next/dist/compiled/react-dom${bundledReactChannel}/client`, + 'react-dom/server$': `next/dist/compiled/react-dom${bundledReactChannel}/server`, + 'react-dom/server.edge$': `next/dist/compiled/react-dom${bundledReactChannel}/server.edge`, + 'react-dom/server.browser$': `next/dist/compiled/react-dom${bundledReactChannel}/server.browser`, + 'react-server-dom-webpack/client$': `next/dist/compiled/react-server-dom-webpack${bundledReactChannel}/client`, + 'react-server-dom-webpack/client.edge$': `next/dist/compiled/react-server-dom-webpack${bundledReactChannel}/client.edge`, + 'react-server-dom-webpack/server.edge$': `next/dist/compiled/react-server-dom-webpack${bundledReactChannel}/server.edge`, + 'react-server-dom-webpack/server.node$': `next/dist/compiled/react-server-dom-webpack${bundledReactChannel}/server.node`, + } + } else if (opts.layer === 'ssr') { + alias = { + 'react/jsx-runtime$': `next/dist/server/future/route-modules/app-page/vendored/shared/react-jsx-runtime`, + 'react/jsx-dev-runtime$': `next/dist/server/future/route-modules/app-page/vendored/shared/react-jsx-dev-runtime`, + react$: `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react`, + 'react-dom$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-dom`, + 'react-dom/server.edge$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-dom-server-edge`, + 'react-server-dom-webpack/client.edge$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-server-dom-webpack-client-edge`, + } + } else if (opts.layer === 'rsc') { + alias = { + 'react/jsx-runtime$': `next/dist/server/future/route-modules/app-page/vendored/shared/react-jsx-runtime`, + 'react/jsx-dev-runtime$': `next/dist/server/future/route-modules/app-page/vendored/shared/react-jsx-dev-runtime`, + react$: `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react`, + 'react-dom$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-dom`, + 'react-server-dom-webpack/server.edge$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-server-dom-webpack-server-edge`, + 'react-server-dom-webpack/server.node$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-server-dom-webpack-server-node`, + } + } else { + throw new Error(`Unexpected layer: ${opts.layer}`) + } if (opts.isEdgeServer) { if (opts.layer === 'rsc') { @@ -1175,16 +1180,16 @@ export default async function getBaseWebpackConfig( '@opentelemetry/api': 'next/dist/compiled/@opentelemetry/api', }), - ...(hasAppDir - ? createRSCAliases(bundledReactChannel, { - // reactSharedSubset: false, - // reactDomServerRenderingStub: false, - reactProductionProfiling, - // browser: true, - layer: 'app-pages-browser', - isEdgeServer, - }) - : {}), + // ...(hasAppDir + // ? createRSCAliases(bundledReactChannel, { + // // reactSharedSubset: false, + // // reactDomServerRenderingStub: false, + // reactProductionProfiling, + // // browser: true, + // layer: 'app-pages-browser', + // isEdgeServer, + // }) + // : {}), ...(config.images.loaderFile ? { @@ -1485,11 +1490,10 @@ export default async function getBaseWebpackConfig( const resolveNextExternal = (localRes: string) => { const isSharedRuntime = sharedRuntimePattern.test(localRes) const isExternal = externalPattern.test(localRes) - const isRenderRuntime = genericRuntimePattern.test(localRes) // if the file ends with .external, we need to make it a commonjs require in all cases // this is used mainly to share the async local storage across the routing, rendering and user layers. - if (isExternal || isRenderRuntime) { + if (isExternal) { // it's important we return the path that starts with `next/dist/` here instead of the absolute path // otherwise NFT will get tripped up return `commonjs ${localRes.replace(/.*?next[/\\]dist/, 'next/dist')}` @@ -1498,9 +1502,9 @@ export default async function getBaseWebpackConfig( // this is because each shared-runtime files are unique per bundle, so if you use app-router context in pages, // it'll be a different instance than the one used in the app-router runtime. if (isSharedRuntime) { - if (dev) { - return `commonjs ${localRes}` - } + // if (dev) { + // return `commonjs ${localRes}` + // } const name = path.parse(localRes).name.replace('.shared-runtime', '') diff --git a/packages/next/webpack.config.js b/packages/next/webpack.config.js index 11154886c0704..3712127d09e37 100644 --- a/packages/next/webpack.config.js +++ b/packages/next/webpack.config.js @@ -101,7 +101,7 @@ module.exports = ({ dev, turbo, bundleType, experimental }) => { const externalHandler = ({ context, request, getResolve }, callback) => { ;(async () => { if ( - ((dev || turbo) && request.endsWith('.shared-runtime')) || + (turbo && request.endsWith('.shared-runtime')) || request.endsWith('.external') ) { const resolve = getResolve() diff --git a/test/e2e/app-dir/rsc-basic/app/app-react/client-react.js b/test/e2e/app-dir/rsc-basic/app/app-react/client-react.js index 1220ff4c1154c..2e5f208139730 100644 --- a/test/e2e/app-dir/rsc-basic/app/app-react/client-react.js +++ b/test/e2e/app-dir/rsc-basic/app/app-react/client-react.js @@ -2,7 +2,7 @@ import React from 'react' import ReactDOM from 'react-dom' -import ReactDOMServer from 'react-dom/server' +import ReactDOMServer from 'react-dom/server.edge' export default function ClientReact() { return ( diff --git a/test/e2e/app-dir/rsc-basic/app/app-react/page.js b/test/e2e/app-dir/rsc-basic/app/app-react/page.js index 00c968a2b391f..fb989e12ebbd7 100644 --- a/test/e2e/app-dir/rsc-basic/app/app-react/page.js +++ b/test/e2e/app-dir/rsc-basic/app/app-react/page.js @@ -1,6 +1,6 @@ import React from 'react' import ReactDOM from 'react-dom' -import ReactDOMServer from 'react-dom/server.edge' +import ReactDOMServer from 'react-dom/server.browser' import ClientReact from './client-react' export default function Page() { diff --git a/test/e2e/app-dir/rsc-basic/rsc-basic.test.ts b/test/e2e/app-dir/rsc-basic/rsc-basic.test.ts index fc1916897c808..a4c97d332b36e 100644 --- a/test/e2e/app-dir/rsc-basic/rsc-basic.test.ts +++ b/test/e2e/app-dir/rsc-basic/rsc-basic.test.ts @@ -450,7 +450,7 @@ createNextDescribe( expect(await res.text()).toBe('Hello from import-test.js') }) - it('should use bundled react for pages with app', async () => { + it('should not use bundled react for pages with app', async () => { const ssrPaths = ['/pages-react', '/edge-pages-react'] const promises = ssrPaths.map(async (pathname) => { const resPages$ = await next.render$(pathname) @@ -461,7 +461,7 @@ createNextDescribe( ] ssrPagesReactVersions.forEach((version) => { - expect(version).toMatch('-canary-') + expect(version).not.toMatch('-canary-') }) }) await Promise.all(promises) @@ -496,10 +496,10 @@ createNextDescribe( `) browserPagesReactVersions.forEach((version) => - expect(version).toMatch('-canary-') + expect(version).not.toMatch('-canary-') ) browserEdgePagesReactVersions.forEach((version) => - expect(version).toMatch('-canary-') + expect(version).not.toMatch('-canary-') ) }) From 1eeadc63523e81689019e33b2d5885cd51154ed5 Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Thu, 14 Sep 2023 17:35:02 +0200 Subject: [PATCH 11/48] tentative require cache fix Co-authored-by: Tobias Koppers --- .../nextjs-require-cache-hot-reloader.ts | 22 +++++++++---------- .../app-page/vendored/ssr/entrypoints.ts | 17 ++++++++++++-- .../react-server-dom-webpack-client-edge.ts | 10 ++++++--- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/packages/next/src/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts b/packages/next/src/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts index a96588f2de8c0..181a13d1614f5 100644 --- a/packages/next/src/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts +++ b/packages/next/src/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts @@ -49,17 +49,17 @@ function deleteFromRequireCache(filePath: string) { export function deleteAppClientCache() { // ensure we reset the cache for rsc components // loaded via react-server-dom-webpack - const reactServerDomModId = require.resolve( - 'react-server-dom-webpack/client.edge' - ) - const reactServerDomMod = require.cache[reactServerDomModId] - - if (reactServerDomMod) { - for (const child of [...reactServerDomMod.children]) { - deleteFromRequireCache(child.id) - } - deleteFromRequireCache(reactServerDomModId) - } + // const reactServerDomModId = require.resolve( + // 'react-server-dom-webpack/client.edge' + // ) + // const reactServerDomMod = require.cache[reactServerDomModId] + // if (reactServerDomMod) { + // for (const child of [...reactServerDomMod.children]) { + // deleteFromRequireCache(child.id) + // } + // deleteFromRequireCache(reactServerDomModId) + // } + // clearChunkCache() } export function deleteCache(filePath: string) { diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/ssr/entrypoints.ts b/packages/next/src/server/future/route-modules/app-page/vendored/ssr/entrypoints.ts index 1b5bdbb161887..83fa93f98e057 100644 --- a/packages/next/src/server/future/route-modules/app-page/vendored/ssr/entrypoints.ts +++ b/packages/next/src/server/future/route-modules/app-page/vendored/ssr/entrypoints.ts @@ -17,7 +17,20 @@ import * as ReactDOM from 'react-dom/server-rendering-stub' // eslint-disable-next-line import/no-extraneous-dependencies import * as ReactDOMServerEdge from 'react-dom/server.edge' +export { React, ReactDOM, ReactDOMServerEdge } + // eslint-disable-next-line import/no-extraneous-dependencies -import * as ReactServerDOMWebpackClientEdge from 'react-server-dom-webpack/client.edge' +export let ReactServerDOMWebpackClientEdge = require('react-server-dom-webpack/client.edge') -export { React, ReactDOM, ReactDOMServerEdge, ReactServerDOMWebpackClientEdge } +export function clearChunkCache() { + delete require.cache[require.resolve('react-server-dom-webpack/client.edge')] + if (process.env.NODE_ENV !== 'production') { + delete require.cache[ + require.resolve( + 'react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js' + ) + ] + } + // eslint-disable-next-line import/no-extraneous-dependencies + ReactServerDOMWebpackClientEdge = require('react-server-dom-webpack/client.edge') +} diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/ssr/react-server-dom-webpack-client-edge.ts b/packages/next/src/server/future/route-modules/app-page/vendored/ssr/react-server-dom-webpack-client-edge.ts index 5398d7eecc700..04cff3e520523 100644 --- a/packages/next/src/server/future/route-modules/app-page/vendored/ssr/react-server-dom-webpack-client-edge.ts +++ b/packages/next/src/server/future/route-modules/app-page/vendored/ssr/react-server-dom-webpack-client-edge.ts @@ -1,3 +1,7 @@ -module.exports = require('../../module.compiled').vendored[ - 'react-ssr' -].ReactServerDOMWebpackClientEdge +// Need to be a getter as ReactServerDOMWebpackClientEdge might change when clearChunkCache is called +Object.defineProperty(module, 'exports', { + get() { + return require('../../module.compiled').vendored['react-ssr'] + .ReactServerDOMWebpackClientEdge + }, +}) From 8b0c25b9731561a6612f0a50aabf7524ad75b63f Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Thu, 14 Sep 2023 17:57:49 +0200 Subject: [PATCH 12/48] add env var --- packages/next-swc/crates/next-core/src/next_server/context.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/next-swc/crates/next-core/src/next_server/context.rs b/packages/next-swc/crates/next-core/src/next_server/context.rs index 1c6418a188314..cc830b5e11bde 100644 --- a/packages/next-swc/crates/next-core/src/next_server/context.rs +++ b/packages/next-swc/crates/next-core/src/next_server/context.rs @@ -175,7 +175,8 @@ fn defines(mode: NextMode) -> CompileTimeDefines { process.turbopack = true, process.env.NODE_ENV = mode.node_env(), process.env.__NEXT_CLIENT_ROUTER_FILTER_ENABLED = false, - process.env.NEXT_RUNTIME = "nodejs" + process.env.NEXT_RUNTIME = "nodejs", + process.env.__NEXT_EXPERIMENTAL_REACT = false, ) // TODO(WEB-937) there are more defines needed, see // packages/next/src/build/webpack-config.ts From a3ceceba1b37623003e36904f7ab46172c716e21 Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Thu, 14 Sep 2023 17:59:03 +0200 Subject: [PATCH 13/48] fix server config --- packages/next/config.d.ts | 4 ++-- packages/next/config.js | 2 +- packages/next/src/build/utils.ts | 10 +++------- packages/next/src/client/index.tsx | 2 +- packages/next/src/export/worker.ts | 2 +- packages/next/src/server/base-server.ts | 2 +- .../next/src/server/dev/static-paths-worker.ts | 2 +- .../route-modules/app-page/shared-modules.ts | 2 +- .../app-page/vendored/ssr/entrypoints.ts | 14 +++++++------- .../future/route-modules/pages/shared-modules.ts | 1 - ...hared-runtime.ts => runtime-config.external.ts} | 0 11 files changed, 18 insertions(+), 23 deletions(-) rename packages/next/src/shared/lib/{runtime-config.shared-runtime.ts => runtime-config.external.ts} (100%) diff --git a/packages/next/config.d.ts b/packages/next/config.d.ts index 2da1ee3c4029c..20c292fb467ef 100644 --- a/packages/next/config.d.ts +++ b/packages/next/config.d.ts @@ -1,3 +1,3 @@ -import getConfig from './dist/shared/lib/runtime-config.shared-runtime' -export * from './dist/shared/lib/runtime-config.shared-runtime' +import getConfig from './dist/shared/lib/runtime-config.external' +export * from './dist/shared/lib/runtime-config.external' export default getConfig diff --git a/packages/next/config.js b/packages/next/config.js index 6510748638097..668ee7c54f0e0 100644 --- a/packages/next/config.js +++ b/packages/next/config.js @@ -1 +1 @@ -module.exports = require('./dist/shared/lib/runtime-config.shared-runtime') +module.exports = require('./dist/shared/lib/runtime-config.external') diff --git a/packages/next/src/build/utils.ts b/packages/next/src/build/utils.ts index 1e973c50d3ae2..117c51bd9ed70 100644 --- a/packages/next/src/build/utils.ts +++ b/packages/next/src/build/utils.ts @@ -1409,7 +1409,7 @@ export async function isPageStatic({ const isPageStaticSpan = trace('is-page-static-utils', parentId) return isPageStaticSpan .traceAsyncFn(async () => { - require('../shared/lib/runtime-config.shared-runtime').setConfig( + require('../shared/lib/runtime-config.external').setConfig( runtimeEnvConfig ) setHttpClientAndAgentOptions({ @@ -1695,9 +1695,7 @@ export async function hasCustomGetInitialProps( runtimeEnvConfig: any, checkingApp: boolean ): Promise { - require('../shared/lib/runtime-config.shared-runtime').setConfig( - runtimeEnvConfig - ) + require('../shared/lib/runtime-config.external').setConfig(runtimeEnvConfig) const components = await loadComponents({ distDir, @@ -1720,9 +1718,7 @@ export async function getDefinedNamedExports( distDir: string, runtimeEnvConfig: any ): Promise> { - require('../shared/lib/runtime-config.shared-runtime').setConfig( - runtimeEnvConfig - ) + require('../shared/lib/runtime-config.external').setConfig(runtimeEnvConfig) const components = await loadComponents({ distDir, page: page, diff --git a/packages/next/src/client/index.tsx b/packages/next/src/client/index.tsx index 45cdbf650e591..84acac734e92e 100644 --- a/packages/next/src/client/index.tsx +++ b/packages/next/src/client/index.tsx @@ -19,7 +19,7 @@ import { urlQueryToSearchParams, assign, } from '../shared/lib/router/utils/querystring' -import { setConfig } from '../shared/lib/runtime-config.shared-runtime' +import { setConfig } from '../shared/lib/runtime-config.external' import { getURL, loadGetInitialProps, diff --git a/packages/next/src/export/worker.ts b/packages/next/src/export/worker.ts index 6fd2bba36e8e4..1144d7e19ae6c 100644 --- a/packages/next/src/export/worker.ts +++ b/packages/next/src/export/worker.ts @@ -59,7 +59,7 @@ import { RSC, } from '../client/components/app-router-headers' -const envConfig = require('../shared/lib/runtime-config.shared-runtime') +const envConfig = require('../shared/lib/runtime-config.external') ;(globalThis as any).__NEXT_DATA__ = { nextExport: true, diff --git a/packages/next/src/server/base-server.ts b/packages/next/src/server/base-server.ts index 4e6ed0a307a49..4700430502f46 100644 --- a/packages/next/src/server/base-server.ts +++ b/packages/next/src/server/base-server.ts @@ -55,7 +55,7 @@ import { getCookieParser, checkIsOnDemandRevalidate, } from './api-utils' -import { setConfig } from '../shared/lib/runtime-config.shared-runtime' +import { setConfig } from '../shared/lib/runtime-config.external' import { setRevalidateHeaders } from './send-payload/revalidate-headers' import { execOnce } from '../shared/lib/utils' diff --git a/packages/next/src/server/dev/static-paths-worker.ts b/packages/next/src/server/dev/static-paths-worker.ts index cc870052e9394..cd7d5305fa306 100644 --- a/packages/next/src/server/dev/static-paths-worker.ts +++ b/packages/next/src/server/dev/static-paths-worker.ts @@ -58,7 +58,7 @@ export async function loadStaticPaths({ fallback?: boolean | 'blocking' }> { // update work memory runtime-config - require('../../shared/lib/runtime-config.shared-runtime').setConfig(config) + require('../../shared/lib/runtime-config.external').setConfig(config) setHttpClientAndAgentOptions({ httpAgentOptions, }) diff --git a/packages/next/src/server/future/route-modules/app-page/shared-modules.ts b/packages/next/src/server/future/route-modules/app-page/shared-modules.ts index e986c1bad3894..b485fca72c6dc 100644 --- a/packages/next/src/server/future/route-modules/app-page/shared-modules.ts +++ b/packages/next/src/server/future/route-modules/app-page/shared-modules.ts @@ -9,5 +9,5 @@ export * as ampContext from '../../../../shared/lib/amp-context.shared-runtime' export * as adapters from '../../../../shared/lib/router/adapters.shared-runtime' export * as loadableContext from '../../../../shared/lib/loadable-context.shared-runtime' export * as imageConfigContext from '../../../../shared/lib/image-config-context.shared-runtime' -export * as runtimeConfig from '../../../../shared/lib/runtime-config.shared-runtime' +export * as runtimeConfig from '../../../../shared/lib/runtime-config.external' export * as loadable from '../../../../shared/lib/loadable.shared-runtime' diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/ssr/entrypoints.ts b/packages/next/src/server/future/route-modules/app-page/vendored/ssr/entrypoints.ts index 83fa93f98e057..1559ad087ccbd 100644 --- a/packages/next/src/server/future/route-modules/app-page/vendored/ssr/entrypoints.ts +++ b/packages/next/src/server/future/route-modules/app-page/vendored/ssr/entrypoints.ts @@ -24,13 +24,13 @@ export let ReactServerDOMWebpackClientEdge = require('react-server-dom-webpack/c export function clearChunkCache() { delete require.cache[require.resolve('react-server-dom-webpack/client.edge')] - if (process.env.NODE_ENV !== 'production') { - delete require.cache[ - require.resolve( - 'react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js' - ) - ] - } + // if (process.env.NODE_ENV !== 'production') { + // delete require.cache[ + // require.resolve( + // 'react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js' + // ) + // ] + // } // eslint-disable-next-line import/no-extraneous-dependencies ReactServerDOMWebpackClientEdge = require('react-server-dom-webpack/client.edge') } diff --git a/packages/next/src/server/future/route-modules/pages/shared-modules.ts b/packages/next/src/server/future/route-modules/pages/shared-modules.ts index 55cdfbdeca37c..ece3e95de98a0 100644 --- a/packages/next/src/server/future/route-modules/pages/shared-modules.ts +++ b/packages/next/src/server/future/route-modules/pages/shared-modules.ts @@ -8,5 +8,4 @@ export * as loadableContext from '../../../../shared/lib/loadable-context.shared export * as appRouterContext from '../../../../shared/lib/app-router-context.shared-runtime' export * as hooksClientContext from '../../../../shared/lib/hooks-client-context.shared-runtime' export * as imageConfigContext from '../../../../shared/lib/image-config-context.shared-runtime' -export * as runtimeConfig from '../../../../shared/lib/runtime-config.shared-runtime' export * as loadable from '../../../../shared/lib/loadable.shared-runtime' diff --git a/packages/next/src/shared/lib/runtime-config.shared-runtime.ts b/packages/next/src/shared/lib/runtime-config.external.ts similarity index 100% rename from packages/next/src/shared/lib/runtime-config.shared-runtime.ts rename to packages/next/src/shared/lib/runtime-config.external.ts From c5b5e514f75ba597578fe0d7a3f936129988bba0 Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Thu, 14 Sep 2023 18:09:27 +0200 Subject: [PATCH 14/48] fix hmr --- .../future/route-modules/app-page/vendored/ssr/entrypoints.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/ssr/entrypoints.ts b/packages/next/src/server/future/route-modules/app-page/vendored/ssr/entrypoints.ts index 1559ad087ccbd..a6876268a7e2b 100644 --- a/packages/next/src/server/future/route-modules/app-page/vendored/ssr/entrypoints.ts +++ b/packages/next/src/server/future/route-modules/app-page/vendored/ssr/entrypoints.ts @@ -23,7 +23,7 @@ export { React, ReactDOM, ReactDOMServerEdge } export let ReactServerDOMWebpackClientEdge = require('react-server-dom-webpack/client.edge') export function clearChunkCache() { - delete require.cache[require.resolve('react-server-dom-webpack/client.edge')] + // delete require.cache[require.resolve('react-server-dom-webpack/client.edge')] // if (process.env.NODE_ENV !== 'production') { // delete require.cache[ // require.resolve( From f4dd6ee6067c5526fb127bd49e06032f04a3e74c Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Thu, 14 Sep 2023 18:14:03 +0200 Subject: [PATCH 15/48] Revert "tentative require cache fix" This reverts commit 1eeadc63523e81689019e33b2d5885cd51154ed5. --- .../nextjs-require-cache-hot-reloader.ts | 1 - .../app-page/vendored/ssr/entrypoints.ts | 17 ++--------------- .../ssr/react-server-dom-webpack-client-edge.ts | 10 +++------- 3 files changed, 5 insertions(+), 23 deletions(-) diff --git a/packages/next/src/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts b/packages/next/src/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts index 181a13d1614f5..ebcf1d78452c9 100644 --- a/packages/next/src/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts +++ b/packages/next/src/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts @@ -59,7 +59,6 @@ export function deleteAppClientCache() { // } // deleteFromRequireCache(reactServerDomModId) // } - // clearChunkCache() } export function deleteCache(filePath: string) { diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/ssr/entrypoints.ts b/packages/next/src/server/future/route-modules/app-page/vendored/ssr/entrypoints.ts index a6876268a7e2b..1b5bdbb161887 100644 --- a/packages/next/src/server/future/route-modules/app-page/vendored/ssr/entrypoints.ts +++ b/packages/next/src/server/future/route-modules/app-page/vendored/ssr/entrypoints.ts @@ -17,20 +17,7 @@ import * as ReactDOM from 'react-dom/server-rendering-stub' // eslint-disable-next-line import/no-extraneous-dependencies import * as ReactDOMServerEdge from 'react-dom/server.edge' -export { React, ReactDOM, ReactDOMServerEdge } - // eslint-disable-next-line import/no-extraneous-dependencies -export let ReactServerDOMWebpackClientEdge = require('react-server-dom-webpack/client.edge') +import * as ReactServerDOMWebpackClientEdge from 'react-server-dom-webpack/client.edge' -export function clearChunkCache() { - // delete require.cache[require.resolve('react-server-dom-webpack/client.edge')] - // if (process.env.NODE_ENV !== 'production') { - // delete require.cache[ - // require.resolve( - // 'react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js' - // ) - // ] - // } - // eslint-disable-next-line import/no-extraneous-dependencies - ReactServerDOMWebpackClientEdge = require('react-server-dom-webpack/client.edge') -} +export { React, ReactDOM, ReactDOMServerEdge, ReactServerDOMWebpackClientEdge } diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/ssr/react-server-dom-webpack-client-edge.ts b/packages/next/src/server/future/route-modules/app-page/vendored/ssr/react-server-dom-webpack-client-edge.ts index 04cff3e520523..5398d7eecc700 100644 --- a/packages/next/src/server/future/route-modules/app-page/vendored/ssr/react-server-dom-webpack-client-edge.ts +++ b/packages/next/src/server/future/route-modules/app-page/vendored/ssr/react-server-dom-webpack-client-edge.ts @@ -1,7 +1,3 @@ -// Need to be a getter as ReactServerDOMWebpackClientEdge might change when clearChunkCache is called -Object.defineProperty(module, 'exports', { - get() { - return require('../../module.compiled').vendored['react-ssr'] - .ReactServerDOMWebpackClientEdge - }, -}) +module.exports = require('../../module.compiled').vendored[ + 'react-ssr' +].ReactServerDOMWebpackClientEdge From e303a7e42690a1a74c2b6359f359ea485717a816 Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Thu, 14 Sep 2023 18:49:49 +0200 Subject: [PATCH 16/48] fix use flight response --- ...-dom-webpack-client.edge.production.min.js | 729 +++++++++++++++++- .../server/app-render/use-flight-response.tsx | 7 +- 2 files changed, 705 insertions(+), 31 deletions(-) diff --git a/packages/next/src/compiled/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.min.js b/packages/next/src/compiled/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.min.js index 9b451ab971a4c..c443448096ca1 100644 --- a/packages/next/src/compiled/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.min.js +++ b/packages/next/src/compiled/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.min.js @@ -7,30 +7,705 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -'use strict';var r=require("react-dom"),t=require("react"),u={stream:!0};function v(a,b){if(a){var c=a[b.id];if(a=c[b.name])c=a.name;else{a=c["*"];if(!a)throw Error('Could not find the module "'+b.id+'" in the React SSR Manifest. This is probably a bug in the React Server Components bundler.');c=b.name}return{id:a.id,chunks:a.chunks,name:c,async:!!b.async}}return b}var w=new Map; -function x(a){var b=globalThis.__next_require__(a);if("function"!==typeof b.then||"fulfilled"===b.status)return null;b.then(function(c){b.status="fulfilled";b.value=c},function(c){b.status="rejected";b.reason=c});return b}function y(){} -function z(a){for(var b=a.chunks,c=[],d=0;dl?(k=l,l=3,f++):(k=0,l=3);continue;case 2:p=n[f++];44===p?l=4:m=m<<4|(96n.length&&(p=-1)}var q=n.byteOffset+f;if(-1 l + ? ((k = l), (l = 3), f++) + : ((k = 0), (l = 3)) + continue + case 2: + p = n[f++] + 44 === p ? (l = 4) : (m = (m << 4) | (96 < p ? p - 87 : p - 48)) + continue + case 3: + p = n.indexOf(10, f) + break + case 4: + ;(p = f + m), p > n.length && (p = -1) + } + var q = n.byteOffset + f + if (-1 < p) { + f = new Uint8Array(n.buffer, q, p - f) + m = a + q = k + var S = m._stringDecoder + k = '' + for (var I = 0; I < h.length; I++) k += S.decode(h[I], u) + k += S.decode(f) + switch (q) { + case 73: + pa(m, e, k) + break + case 72: + e = k[0] + k = k.slice(1) + m = JSON.parse(k, m._fromJSON) + k = void 0 + if ((q = A.current)) + switch ( + ('string' === typeof m ? (f = m) : ((f = m[0]), (k = m[1])), + e) + ) { + case 'D': + q.prefetchDNS(f, k) + break + case 'C': + q.preconnect(f, k) + break + case 'L': + q.preload(f, k) + break + case 'm': + q.preloadModule(f, k) + break + case 'I': + q.preinit(f, k) + break + case 'M': + q.preinitModule(f, k) + } + break + case 69: + k = JSON.parse(k) + f = k.digest + k = Error( + 'An error occurred in the Server Components render. The specific message is omitted in production builds to avoid leaking sensitive details. A digest property is included on this error instance which may provide additional details about the nature of the error.' + ) + k.stack = 'Error: ' + k.message + k.digest = f + f = m._chunks + ;(q = f.get(e)) + ? P(q, k) + : f.set(e, new K('rejected', null, k, m)) + break + case 84: + m._chunks.set(e, new K('fulfilled', k, null, m)) + break + default: + ;(f = m._chunks), + (q = f.get(e)) + ? ((m = q), + (e = k), + 'pending' === m.status && + ((k = m.value), + (f = m.reason), + (m.status = 'resolved_model'), + (m.value = e), + null !== k && (L(m), O(m, k, f)))) + : f.set(e, new K('resolved_model', k, null, m)) + } + f = p + 3 === l && f++ + m = e = k = l = 0 + h.length = 0 + } else { + n = new Uint8Array(n.buffer, q, n.byteLength - f) + h.push(n) + m -= n.byteLength + break + } + } + a._rowState = l + a._rowID = e + a._rowTag = k + a._rowLength = m + return g.read().then(c).catch(d) + } + } + function d(h) { + U(a, h) + } + var g = b.getReader() + g.read().then(c).catch(d) +} +exports.createFromFetch = function (a, b) { + var c = X(b && b.moduleMap ? b.moduleMap : null, Y) + a.then( + function (d) { + Z(c, d.body) + }, + function (d) { + U(c, d) + } + ) + return V(c, 0) +} +exports.createFromReadableStream = function (a, b) { + b = X(b && b.moduleMap ? b.moduleMap : null, Y) + Z(b, a) + return V(b, 0) +} +exports.createServerReference = function (a) { + return ha(a, Y) +} diff --git a/packages/next/src/server/app-render/use-flight-response.tsx b/packages/next/src/server/app-render/use-flight-response.tsx index 0f09406806fca..a7d0318eeb70c 100644 --- a/packages/next/src/server/app-render/use-flight-response.tsx +++ b/packages/next/src/server/app-render/use-flight-response.tsx @@ -21,10 +21,9 @@ export function useFlightResponse( return flightResponseRef.current } // react-server-dom-webpack/client.edge must not be hoisted for require cache clearing to work correctly - const { createFromReadableStream } = process.env.NEXT_MINIMAL - ? // @ts-ignore - __non_webpack_require__(`react-server-dom-webpack/client.edge`) - : require(`react-server-dom-webpack/client.edge`) + const { + createFromReadableStream, + } = require(`react-server-dom-webpack/client.edge`) const [renderStream, forwardStream] = req.tee() const res = createFromReadableStream(renderStream, { From 80e946bfe576647c60debb08bf1b6dbba4ac4d32 Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Thu, 14 Sep 2023 19:48:53 +0200 Subject: [PATCH 17/48] tentatively fix shared-runtimes --- packages/next/src/server/require-hook.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/next/src/server/require-hook.js b/packages/next/src/server/require-hook.js index 9b473529c9c6d..fba56419b1e6e 100644 --- a/packages/next/src/server/require-hook.js +++ b/packages/next/src/server/require-hook.js @@ -33,7 +33,7 @@ mod._resolveFilename = function ( // that needs to point to the rendering runtime version, it will point to the correct one. // This can happen on `pages` when a user requires a dependency that uses next/image for example. // This is only needed in production as in development we fallback to the external version. -if (process.env.NODE_ENV !== 'development' && !process.env.TURBOPACK) { +if (!process.env.TURBOPACK) { mod.prototype.require = function (request) { if (request.endsWith('.shared-runtime')) { const isAppRequire = process.env.__NEXT_PRIVATE_RUNTIME_TYPE === 'app' @@ -41,7 +41,7 @@ if (process.env.NODE_ENV !== 'development' && !process.env.TURBOPACK) { isAppRequire ? 'next/dist/compiled/next-server/app-page.runtime' : 'next/dist/compiled/next-server/pages.runtime' - }.prod` + }.${process.env.NODE_ENV === 'production' ? 'prod' : 'dev'}` const base = path.basename(request, '.shared-runtime') const camelized = base.replace(/-([a-z])/g, (g) => g[1].toUpperCase()) const instance = originalRequire.call(this, currentRuntime) From 8bc4fcbbe67aee867a50fdb4ea3402b787644a4d Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Thu, 14 Sep 2023 21:00:20 +0200 Subject: [PATCH 18/48] update vendored stub --- .../cjs/react-dom-server-rendering-stub.development.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/src/compiled/react-dom/cjs/react-dom-server-rendering-stub.development.js b/packages/next/src/compiled/react-dom/cjs/react-dom-server-rendering-stub.development.js index f08d1972eb7bc..b783bd3a5a46c 100644 --- a/packages/next/src/compiled/react-dom/cjs/react-dom-server-rendering-stub.development.js +++ b/packages/next/src/compiled/react-dom/cjs/react-dom-server-rendering-stub.development.js @@ -14,7 +14,7 @@ if (process.env.NODE_ENV !== "production") { (function() { 'use strict'; -var React = require("next/dist/compiled/react"); +var React = require('react'); var ReactVersion = '18.3.0-canary-d6dcad6a8-20230914'; From 9771525ddd01ec04dc14076fc66c3bbaab750e63 Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Thu, 14 Sep 2023 22:25:05 +0200 Subject: [PATCH 19/48] re-do vendored contexts --- packages/next/src/build/webpack-config.ts | 94 ++++++++++++------- .../future/route-modules/app-page/module.ts | 8 +- .../route-modules/app-page/shared-modules.ts | 13 --- .../app-page/vendored/contexts/amp-context.ts | 3 + .../vendored/contexts/app-router-context.ts | 3 + .../app-page/vendored/contexts/entrypoints.ts | 12 +++ .../vendored/contexts/head-manager-context.ts | 3 + .../vendored/contexts/hooks-client-context.ts | 3 + .../vendored/contexts/html-context.ts | 3 + .../vendored/contexts/image-config-context.ts | 3 + .../vendored/contexts/loadable-context.ts | 3 + .../app-page/vendored/contexts/loadable.ts | 1 + .../vendored/contexts/router-context.ts | 3 + .../vendored/contexts/server-inserted-html.ts | 3 + .../future/route-modules/pages/module.ts | 10 +- .../route-modules/pages/shared-modules.ts | 11 --- .../pages/vendored/contexts/amp-context.ts | 3 + .../vendored/contexts/app-router-context.ts | 3 + .../pages/vendored/contexts/entrypoints.ts | 11 +++ .../vendored/contexts/head-manager-context.ts | 3 + .../vendored/contexts/hooks-client-context.ts | 3 + .../pages/vendored/contexts/html-context.ts | 3 + .../vendored/contexts/image-config-context.ts | 3 + .../vendored/contexts/loadable-context.ts | 3 + .../pages/vendored/contexts/loadable.ts | 1 + .../pages/vendored/contexts/router-context.ts | 3 + packages/next/src/server/require-hook.js | 26 ++--- 27 files changed, 155 insertions(+), 83 deletions(-) delete mode 100644 packages/next/src/server/future/route-modules/app-page/shared-modules.ts create mode 100644 packages/next/src/server/future/route-modules/app-page/vendored/contexts/amp-context.ts create mode 100644 packages/next/src/server/future/route-modules/app-page/vendored/contexts/app-router-context.ts create mode 100644 packages/next/src/server/future/route-modules/app-page/vendored/contexts/entrypoints.ts create mode 100644 packages/next/src/server/future/route-modules/app-page/vendored/contexts/head-manager-context.ts create mode 100644 packages/next/src/server/future/route-modules/app-page/vendored/contexts/hooks-client-context.ts create mode 100644 packages/next/src/server/future/route-modules/app-page/vendored/contexts/html-context.ts create mode 100644 packages/next/src/server/future/route-modules/app-page/vendored/contexts/image-config-context.ts create mode 100644 packages/next/src/server/future/route-modules/app-page/vendored/contexts/loadable-context.ts create mode 100644 packages/next/src/server/future/route-modules/app-page/vendored/contexts/loadable.ts create mode 100644 packages/next/src/server/future/route-modules/app-page/vendored/contexts/router-context.ts create mode 100644 packages/next/src/server/future/route-modules/app-page/vendored/contexts/server-inserted-html.ts delete mode 100644 packages/next/src/server/future/route-modules/pages/shared-modules.ts create mode 100644 packages/next/src/server/future/route-modules/pages/vendored/contexts/amp-context.ts create mode 100644 packages/next/src/server/future/route-modules/pages/vendored/contexts/app-router-context.ts create mode 100644 packages/next/src/server/future/route-modules/pages/vendored/contexts/entrypoints.ts create mode 100644 packages/next/src/server/future/route-modules/pages/vendored/contexts/head-manager-context.ts create mode 100644 packages/next/src/server/future/route-modules/pages/vendored/contexts/hooks-client-context.ts create mode 100644 packages/next/src/server/future/route-modules/pages/vendored/contexts/html-context.ts create mode 100644 packages/next/src/server/future/route-modules/pages/vendored/contexts/image-config-context.ts create mode 100644 packages/next/src/server/future/route-modules/pages/vendored/contexts/loadable-context.ts create mode 100644 packages/next/src/server/future/route-modules/pages/vendored/contexts/loadable.ts create mode 100644 packages/next/src/server/future/route-modules/pages/vendored/contexts/router-context.ts diff --git a/packages/next/src/build/webpack-config.ts b/packages/next/src/build/webpack-config.ts index ac4e0befcecab..dff9befbe34a9 100644 --- a/packages/next/src/build/webpack-config.ts +++ b/packages/next/src/build/webpack-config.ts @@ -1489,7 +1489,6 @@ export default async function getBaseWebpackConfig( * will rewrite the require to the correct bundle location depending on the layer at which the file is being used. */ const resolveNextExternal = (localRes: string) => { - const isSharedRuntime = sharedRuntimePattern.test(localRes) const isExternal = externalPattern.test(localRes) // if the file ends with .external, we need to make it a commonjs require in all cases @@ -1502,39 +1501,40 @@ export default async function getBaseWebpackConfig( // if the file ends with .shared-runtime, we need to make it point to the correct bundle depending on the layer // this is because each shared-runtime files are unique per bundle, so if you use app-router context in pages, // it'll be a different instance than the one used in the app-router runtime. - if (isSharedRuntime) { - // if (dev) { - // return `commonjs ${localRes}` - // } - - const name = path.parse(localRes).name.replace('.shared-runtime', '') - - const camelCaseName = name.replace(/-([a-z])/g, (_, w) => - w.toUpperCase() - ) - - // there's no externals for API routes but if need be, they'll need to be added here and have - // their own layer - const runtime = - layer === 'app-route-handler' - ? 'app-route' - : isAppLayer - ? 'app-page' - : 'pages' - return [ - 'commonjs ' + - path.posix.join( - 'next', - 'dist', - 'compiled', - 'next-server', - `${runtime}.runtime.${dev ? 'dev' : 'prod'}` - ), - 'default', - 'sharedModules', - camelCaseName, - ] - } + // const isSharedRuntime = sharedRuntimePattern.test(localRes) + // if (isSharedRuntime) { + // // if (dev) { + // // return `commonjs ${localRes}` + // // } + + // const name = path.parse(localRes).name.replace('.shared-runtime', '') + + // const camelCaseName = name.replace(/-([a-z])/g, (_, w) => + // w.toUpperCase() + // ) + + // // there's no externals for API routes but if need be, they'll need to be added here and have + // // their own layer + // const runtime = + // layer === 'app-route-handler' + // ? 'app-route' + // : isAppLayer + // ? 'app-page' + // : 'pages' + // return [ + // 'commonjs ' + + // path.posix.join( + // 'next', + // 'dist', + // 'compiled', + // 'next-server', + // `${runtime}.runtime.${dev ? 'dev' : 'prod'}` + // ), + // 'default', + // 'sharedModules', + // camelCaseName, + // ] + // } } // Don't bundle @vercel/og nodejs bundle for nodejs runtime. @@ -2552,6 +2552,32 @@ export default async function getBaseWebpackConfig( ].filter(Boolean), }, plugins: [ + isNodeServer && + new webpack.NormalModuleReplacementPlugin( + /\.\/(.+)\.shared-runtime$/, + function (resource) { + const moduleName = path.basename( + resource.request, + '.shared-runtime' + ) + const layer = resource.contextInfo.issuerLayer + + const runtime = + layer === 'app-route-handler' + ? 'app-route' + : [ + WEBPACK_LAYERS.reactServerComponents, + WEBPACK_LAYERS.serverSideRendering, + WEBPACK_LAYERS.appPagesBrowser, + WEBPACK_LAYERS.actionBrowser, + WEBPACK_LAYERS.appRouteHandler, + ].includes(layer as any) + ? 'app-page' + : 'pages' + + resource.request = `next/dist/server/future/route-modules/${runtime}/vendored/contexts/${moduleName}` + } + ), dev && new MemoryWithGcCachePlugin({ maxGenerations: 5 }), dev && isClient && new ReactRefreshWebpackPlugin(webpack), // Makes sure `Buffer` and `process` are polyfilled in client and flight bundles (same behavior as webpack 4) diff --git a/packages/next/src/server/future/route-modules/app-page/module.ts b/packages/next/src/server/future/route-modules/app-page/module.ts index eb76489885e73..5cc33c1a60376 100644 --- a/packages/next/src/server/future/route-modules/app-page/module.ts +++ b/packages/next/src/server/future/route-modules/app-page/module.ts @@ -11,12 +11,13 @@ import { type RouteModuleOptions, type RouteModuleHandleContext, } from '../route-module' -import * as sharedModules from './shared-modules' +import * as vendoredContexts from './vendored/contexts/entrypoints' let vendoredReactRSC let vendoredReactSSR let vendoredReactShared +// the vendored Reacts are loaded from their original source in the edge runtime if (process.env.NEXT_RUNTIME !== 'edge') { vendoredReactRSC = require('./vendored/rsc/entrypoints') vendoredReactSSR = require('./vendored/ssr/entrypoints') @@ -45,10 +46,6 @@ export class AppPageRouteModule extends RouteModule< AppPageRouteDefinition, AppPageUserlandModule > { - static readonly sharedModules = sharedModules - // static readonly vendoredReact = vendoredReact - // static readonly vendoredReactSSR = vendoredReactSSR - public render( req: IncomingMessage, res: ServerResponse, @@ -68,6 +65,7 @@ const vendored = { 'react-rsc': vendoredReactRSC, 'react-ssr': vendoredReactSSR, 'react-shared': vendoredReactShared, + contexts: vendoredContexts, } export { renderToHTMLOrFlight, vendored } diff --git a/packages/next/src/server/future/route-modules/app-page/shared-modules.ts b/packages/next/src/server/future/route-modules/app-page/shared-modules.ts deleted file mode 100644 index b485fca72c6dc..0000000000000 --- a/packages/next/src/server/future/route-modules/app-page/shared-modules.ts +++ /dev/null @@ -1,13 +0,0 @@ -// the name of the export has to be the camelCase version of the file name (without the extension) -export * as headManagerContext from '../../../../shared/lib/head-manager-context.shared-runtime' -export * as serverInsertedHtml from '../../../../shared/lib/server-inserted-html.shared-runtime' -export * as appRouterContext from '../../../../shared/lib/app-router-context.shared-runtime' -export * as hooksClientContext from '../../../../shared/lib/hooks-client-context.shared-runtime' -export * as routerContext from '../../../../shared/lib/router-context.shared-runtime' -export * as htmlContext from '../../../../shared/lib/html-context.shared-runtime' -export * as ampContext from '../../../../shared/lib/amp-context.shared-runtime' -export * as adapters from '../../../../shared/lib/router/adapters.shared-runtime' -export * as loadableContext from '../../../../shared/lib/loadable-context.shared-runtime' -export * as imageConfigContext from '../../../../shared/lib/image-config-context.shared-runtime' -export * as runtimeConfig from '../../../../shared/lib/runtime-config.external' -export * as loadable from '../../../../shared/lib/loadable.shared-runtime' diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/contexts/amp-context.ts b/packages/next/src/server/future/route-modules/app-page/vendored/contexts/amp-context.ts new file mode 100644 index 0000000000000..474e4f387711e --- /dev/null +++ b/packages/next/src/server/future/route-modules/app-page/vendored/contexts/amp-context.ts @@ -0,0 +1,3 @@ +module.exports = require('../../module.compiled').vendored[ + 'contexts' +].AmpContext diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/contexts/app-router-context.ts b/packages/next/src/server/future/route-modules/app-page/vendored/contexts/app-router-context.ts new file mode 100644 index 0000000000000..a112b6b26738f --- /dev/null +++ b/packages/next/src/server/future/route-modules/app-page/vendored/contexts/app-router-context.ts @@ -0,0 +1,3 @@ +module.exports = require('../../module.compiled').vendored[ + 'contexts' +].AppRouterContext diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/contexts/entrypoints.ts b/packages/next/src/server/future/route-modules/app-page/vendored/contexts/entrypoints.ts new file mode 100644 index 0000000000000..09a0a23406171 --- /dev/null +++ b/packages/next/src/server/future/route-modules/app-page/vendored/contexts/entrypoints.ts @@ -0,0 +1,12 @@ +export * as HeadManagerContext from '../../../../../../shared/lib/head-manager-context.shared-runtime' +export * as ServerInsertedHtml from '../../../../../../shared/lib/server-inserted-html.shared-runtime' +export * as AppRouterContext from '../../../../../../shared/lib/app-router-context.shared-runtime' +export * as HooksClientContext from '../../../../../../shared/lib/hooks-client-context.shared-runtime' +export * as RouterContext from '../../../../../../shared/lib/router-context.shared-runtime' +export * as HtmlContext from '../../../../../../shared/lib/html-context.shared-runtime' +export * as AmpContext from '../../../../../../shared/lib/amp-context.shared-runtime' +export * as LoadableContext from '../../../../../../shared/lib/loadable-context.shared-runtime' +export * as ImageConfigContext from '../../../../../../shared/lib/image-config-context.shared-runtime' +export * as Loadable from '../../../../../../shared/lib/loadable.shared-runtime' +// export * as adapters from '../../../../../../shared/lib/router/adapters.shared-runtime' +// export * as runtimeConfig from '../../../../../../shared/lib/runtime-config.external' diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/contexts/head-manager-context.ts b/packages/next/src/server/future/route-modules/app-page/vendored/contexts/head-manager-context.ts new file mode 100644 index 0000000000000..b7f082e3339de --- /dev/null +++ b/packages/next/src/server/future/route-modules/app-page/vendored/contexts/head-manager-context.ts @@ -0,0 +1,3 @@ +module.exports = require('../../module.compiled').vendored[ + 'contexts' +].HeadManagerContext diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/contexts/hooks-client-context.ts b/packages/next/src/server/future/route-modules/app-page/vendored/contexts/hooks-client-context.ts new file mode 100644 index 0000000000000..29aa771033f15 --- /dev/null +++ b/packages/next/src/server/future/route-modules/app-page/vendored/contexts/hooks-client-context.ts @@ -0,0 +1,3 @@ +module.exports = require('../../module.compiled').vendored[ + 'contexts' +].HooksClientContext diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/contexts/html-context.ts b/packages/next/src/server/future/route-modules/app-page/vendored/contexts/html-context.ts new file mode 100644 index 0000000000000..ae1126abb6f99 --- /dev/null +++ b/packages/next/src/server/future/route-modules/app-page/vendored/contexts/html-context.ts @@ -0,0 +1,3 @@ +module.exports = require('../../module.compiled').vendored[ + 'contexts' +].HtmlContext diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/contexts/image-config-context.ts b/packages/next/src/server/future/route-modules/app-page/vendored/contexts/image-config-context.ts new file mode 100644 index 0000000000000..3537107ae9982 --- /dev/null +++ b/packages/next/src/server/future/route-modules/app-page/vendored/contexts/image-config-context.ts @@ -0,0 +1,3 @@ +module.exports = require('../../module.compiled').vendored[ + 'contexts' +].ImageConfigContext diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/contexts/loadable-context.ts b/packages/next/src/server/future/route-modules/app-page/vendored/contexts/loadable-context.ts new file mode 100644 index 0000000000000..de9e07464c6fb --- /dev/null +++ b/packages/next/src/server/future/route-modules/app-page/vendored/contexts/loadable-context.ts @@ -0,0 +1,3 @@ +module.exports = require('../../module.compiled').vendored[ + 'contexts' +].LoadableContext diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/contexts/loadable.ts b/packages/next/src/server/future/route-modules/app-page/vendored/contexts/loadable.ts new file mode 100644 index 0000000000000..f67d05a251655 --- /dev/null +++ b/packages/next/src/server/future/route-modules/app-page/vendored/contexts/loadable.ts @@ -0,0 +1 @@ +module.exports = require('../../module.compiled').vendored['contexts'].Loadable diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/contexts/router-context.ts b/packages/next/src/server/future/route-modules/app-page/vendored/contexts/router-context.ts new file mode 100644 index 0000000000000..5a2f92e05309e --- /dev/null +++ b/packages/next/src/server/future/route-modules/app-page/vendored/contexts/router-context.ts @@ -0,0 +1,3 @@ +module.exports = require('../../module.compiled').vendored[ + 'contexts' +].RouterContext diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/contexts/server-inserted-html.ts b/packages/next/src/server/future/route-modules/app-page/vendored/contexts/server-inserted-html.ts new file mode 100644 index 0000000000000..78f8ccfff52a5 --- /dev/null +++ b/packages/next/src/server/future/route-modules/app-page/vendored/contexts/server-inserted-html.ts @@ -0,0 +1,3 @@ +module.exports = require('../../module.compiled').vendored[ + 'contexts' +].ServerInsertedHTML diff --git a/packages/next/src/server/future/route-modules/pages/module.ts b/packages/next/src/server/future/route-modules/pages/module.ts index e2730ef668901..3abbe1da064ec 100644 --- a/packages/next/src/server/future/route-modules/pages/module.ts +++ b/packages/next/src/server/future/route-modules/pages/module.ts @@ -18,7 +18,7 @@ import { type RouteModuleOptions, } from '../route-module' import { renderToHTMLImpl, renderToHTML } from '../../../render' -import * as sharedModules from './shared-modules' +import * as vendoredContexts from './vendored/contexts/entrypoints' /** * The userland module for a page. This is the module that is exported from the @@ -105,8 +105,6 @@ export class PagesRouteModule extends RouteModule< > { private readonly components: PagesComponents - static readonly sharedModules = sharedModules - constructor(options: PagesRouteModuleOptions) { super(options) @@ -132,7 +130,11 @@ export class PagesRouteModule extends RouteModule< } } +const vendored = { + contexts: vendoredContexts, +} + // needed for the static build -export { renderToHTML } +export { renderToHTML, vendored } export default PagesRouteModule diff --git a/packages/next/src/server/future/route-modules/pages/shared-modules.ts b/packages/next/src/server/future/route-modules/pages/shared-modules.ts deleted file mode 100644 index ece3e95de98a0..0000000000000 --- a/packages/next/src/server/future/route-modules/pages/shared-modules.ts +++ /dev/null @@ -1,11 +0,0 @@ -// the name of the export has to be the camelCase version of the file name (without the extension) -export * as htmlContext from '../../../../shared/lib/html-context.shared-runtime' -export * as routerContext from '../../../../shared/lib/router-context.shared-runtime' -export * as ampContext from '../../../../shared/lib/amp-context.shared-runtime' -export * as headManagerContext from '../../../../shared/lib/head-manager-context.shared-runtime' -export * as adapters from '../../../../shared/lib/router/adapters.shared-runtime' -export * as loadableContext from '../../../../shared/lib/loadable-context.shared-runtime' -export * as appRouterContext from '../../../../shared/lib/app-router-context.shared-runtime' -export * as hooksClientContext from '../../../../shared/lib/hooks-client-context.shared-runtime' -export * as imageConfigContext from '../../../../shared/lib/image-config-context.shared-runtime' -export * as loadable from '../../../../shared/lib/loadable.shared-runtime' diff --git a/packages/next/src/server/future/route-modules/pages/vendored/contexts/amp-context.ts b/packages/next/src/server/future/route-modules/pages/vendored/contexts/amp-context.ts new file mode 100644 index 0000000000000..474e4f387711e --- /dev/null +++ b/packages/next/src/server/future/route-modules/pages/vendored/contexts/amp-context.ts @@ -0,0 +1,3 @@ +module.exports = require('../../module.compiled').vendored[ + 'contexts' +].AmpContext diff --git a/packages/next/src/server/future/route-modules/pages/vendored/contexts/app-router-context.ts b/packages/next/src/server/future/route-modules/pages/vendored/contexts/app-router-context.ts new file mode 100644 index 0000000000000..a112b6b26738f --- /dev/null +++ b/packages/next/src/server/future/route-modules/pages/vendored/contexts/app-router-context.ts @@ -0,0 +1,3 @@ +module.exports = require('../../module.compiled').vendored[ + 'contexts' +].AppRouterContext diff --git a/packages/next/src/server/future/route-modules/pages/vendored/contexts/entrypoints.ts b/packages/next/src/server/future/route-modules/pages/vendored/contexts/entrypoints.ts new file mode 100644 index 0000000000000..4d64a3d827459 --- /dev/null +++ b/packages/next/src/server/future/route-modules/pages/vendored/contexts/entrypoints.ts @@ -0,0 +1,11 @@ +export * as RouterContext from '../../../../../../shared/lib/router-context.shared-runtime' +export * as LoadableContext from '../../../../../../shared/lib/loadable-context.shared-runtime' +export * as Loadable from '../../../../../../shared/lib/loadable.shared-runtime' +export * as ImageConfigContext from '../../../../../../shared/lib/image-config-context.shared-runtime' +export * as HtmlContext from '../../../../../../shared/lib/html-context.shared-runtime' +export * as HooksClientContext from '../../../../../../shared/lib/hooks-client-context.shared-runtime' +export * as HeadManagerContext from '../../../../../../shared/lib/head-manager-context.shared-runtime' +export * as AppRouterContext from '../../../../../../shared/lib/app-router-context.shared-runtime' +export * as AmpContext from '../../../../../../shared/lib/amp-context.shared-runtime' +// export * as runtimeConfig from '../../../../../../shared/lib/runtime-config.external' +// export * as adapters from '../../../../../../shared/lib/router/adapters.shared-runtime' diff --git a/packages/next/src/server/future/route-modules/pages/vendored/contexts/head-manager-context.ts b/packages/next/src/server/future/route-modules/pages/vendored/contexts/head-manager-context.ts new file mode 100644 index 0000000000000..b7f082e3339de --- /dev/null +++ b/packages/next/src/server/future/route-modules/pages/vendored/contexts/head-manager-context.ts @@ -0,0 +1,3 @@ +module.exports = require('../../module.compiled').vendored[ + 'contexts' +].HeadManagerContext diff --git a/packages/next/src/server/future/route-modules/pages/vendored/contexts/hooks-client-context.ts b/packages/next/src/server/future/route-modules/pages/vendored/contexts/hooks-client-context.ts new file mode 100644 index 0000000000000..29aa771033f15 --- /dev/null +++ b/packages/next/src/server/future/route-modules/pages/vendored/contexts/hooks-client-context.ts @@ -0,0 +1,3 @@ +module.exports = require('../../module.compiled').vendored[ + 'contexts' +].HooksClientContext diff --git a/packages/next/src/server/future/route-modules/pages/vendored/contexts/html-context.ts b/packages/next/src/server/future/route-modules/pages/vendored/contexts/html-context.ts new file mode 100644 index 0000000000000..ae1126abb6f99 --- /dev/null +++ b/packages/next/src/server/future/route-modules/pages/vendored/contexts/html-context.ts @@ -0,0 +1,3 @@ +module.exports = require('../../module.compiled').vendored[ + 'contexts' +].HtmlContext diff --git a/packages/next/src/server/future/route-modules/pages/vendored/contexts/image-config-context.ts b/packages/next/src/server/future/route-modules/pages/vendored/contexts/image-config-context.ts new file mode 100644 index 0000000000000..3537107ae9982 --- /dev/null +++ b/packages/next/src/server/future/route-modules/pages/vendored/contexts/image-config-context.ts @@ -0,0 +1,3 @@ +module.exports = require('../../module.compiled').vendored[ + 'contexts' +].ImageConfigContext diff --git a/packages/next/src/server/future/route-modules/pages/vendored/contexts/loadable-context.ts b/packages/next/src/server/future/route-modules/pages/vendored/contexts/loadable-context.ts new file mode 100644 index 0000000000000..de9e07464c6fb --- /dev/null +++ b/packages/next/src/server/future/route-modules/pages/vendored/contexts/loadable-context.ts @@ -0,0 +1,3 @@ +module.exports = require('../../module.compiled').vendored[ + 'contexts' +].LoadableContext diff --git a/packages/next/src/server/future/route-modules/pages/vendored/contexts/loadable.ts b/packages/next/src/server/future/route-modules/pages/vendored/contexts/loadable.ts new file mode 100644 index 0000000000000..f67d05a251655 --- /dev/null +++ b/packages/next/src/server/future/route-modules/pages/vendored/contexts/loadable.ts @@ -0,0 +1 @@ +module.exports = require('../../module.compiled').vendored['contexts'].Loadable diff --git a/packages/next/src/server/future/route-modules/pages/vendored/contexts/router-context.ts b/packages/next/src/server/future/route-modules/pages/vendored/contexts/router-context.ts new file mode 100644 index 0000000000000..5a2f92e05309e --- /dev/null +++ b/packages/next/src/server/future/route-modules/pages/vendored/contexts/router-context.ts @@ -0,0 +1,3 @@ +module.exports = require('../../module.compiled').vendored[ + 'contexts' +].RouterContext diff --git a/packages/next/src/server/require-hook.js b/packages/next/src/server/require-hook.js index fba56419b1e6e..3b9fe4438a4f6 100644 --- a/packages/next/src/server/require-hook.js +++ b/packages/next/src/server/require-hook.js @@ -32,21 +32,15 @@ mod._resolveFilename = function ( // This is a hack to make sure that if a user requires a Next.js module that wasn't bundled // that needs to point to the rendering runtime version, it will point to the correct one. // This can happen on `pages` when a user requires a dependency that uses next/image for example. -// This is only needed in production as in development we fallback to the external version. -if (!process.env.TURBOPACK) { - mod.prototype.require = function (request) { - if (request.endsWith('.shared-runtime')) { - const isAppRequire = process.env.__NEXT_PRIVATE_RUNTIME_TYPE === 'app' - const currentRuntime = `${ - isAppRequire - ? 'next/dist/compiled/next-server/app-page.runtime' - : 'next/dist/compiled/next-server/pages.runtime' - }.${process.env.NODE_ENV === 'production' ? 'prod' : 'dev'}` - const base = path.basename(request, '.shared-runtime') - const camelized = base.replace(/-([a-z])/g, (g) => g[1].toUpperCase()) - const instance = originalRequire.call(this, currentRuntime) - return instance.default.sharedModules[camelized] - } - return originalRequire.call(this, request) +mod.prototype.require = function (request) { + if (request.endsWith('.shared-runtime')) { + const currentRuntime = `next/dist/compiled/next-server/pages${ + process.env.TURBOPACK ? '-turbo' : '' + }.runtime.${process.env.NODE_ENV === 'production' ? 'prod' : 'dev'}` + const base = path.basename(request, '.shared-runtime') + const instance = originalRequire.call(this, currentRuntime) + return instance.vendored.contexts[base] } + + return originalRequire.call(this, request) } From f0a412472baa2e688616d58f79c9bf657ba20706 Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Thu, 14 Sep 2023 22:36:07 +0200 Subject: [PATCH 20/48] simplify require hook --- packages/next/src/client/index.tsx | 2 +- packages/next/src/server/render.tsx | 2 +- packages/next/src/server/require-hook.js | 19 +++++++++++++------ .../src/shared/lib/router/adapters.test.tsx | 2 +- ...apters.shared-runtime.tsx => adapters.tsx} | 0 5 files changed, 16 insertions(+), 9 deletions(-) rename packages/next/src/shared/lib/router/{adapters.shared-runtime.tsx => adapters.tsx} (100%) diff --git a/packages/next/src/client/index.tsx b/packages/next/src/client/index.tsx index 84acac734e92e..487386b781745 100644 --- a/packages/next/src/client/index.tsx +++ b/packages/next/src/client/index.tsx @@ -43,7 +43,7 @@ import { adaptForAppRouterInstance, adaptForSearchParams, PathnameContextProviderAdapter, -} from '../shared/lib/router/adapters.shared-runtime' +} from '../shared/lib/router/adapters' import { SearchParamsContext } from '../shared/lib/hooks-client-context.shared-runtime' import onRecoverableError from './on-recoverable-error' import tracer from './tracing/tracer' diff --git a/packages/next/src/server/render.tsx b/packages/next/src/server/render.tsx index 9a9843d9e32ec..1ea9a281a1de8 100644 --- a/packages/next/src/server/render.tsx +++ b/packages/next/src/server/render.tsx @@ -86,7 +86,7 @@ import { adaptForAppRouterInstance, adaptForSearchParams, PathnameContextProviderAdapter, -} from '../shared/lib/router/adapters.shared-runtime' +} from '../shared/lib/router/adapters' import { AppRouterContext } from '../shared/lib/app-router-context.shared-runtime' import { SearchParamsContext } from '../shared/lib/hooks-client-context.shared-runtime' import { getTracer } from './lib/trace/tracer' diff --git a/packages/next/src/server/require-hook.js b/packages/next/src/server/require-hook.js index 3b9fe4438a4f6..5b5554d10ca01 100644 --- a/packages/next/src/server/require-hook.js +++ b/packages/next/src/server/require-hook.js @@ -34,12 +34,19 @@ mod._resolveFilename = function ( // This can happen on `pages` when a user requires a dependency that uses next/image for example. mod.prototype.require = function (request) { if (request.endsWith('.shared-runtime')) { - const currentRuntime = `next/dist/compiled/next-server/pages${ - process.env.TURBOPACK ? '-turbo' : '' - }.runtime.${process.env.NODE_ENV === 'production' ? 'prod' : 'dev'}` - const base = path.basename(request, '.shared-runtime') - const instance = originalRequire.call(this, currentRuntime) - return instance.vendored.contexts[base] + // const currentRuntime = `next/dist/compiled/next-server/pages${ + // process.env.TURBOPACK ? '-turbo' : '' + // }.runtime.${process.env.NODE_ENV === 'production' ? 'prod' : 'dev'}` + // const base = path.basename(request, '.shared-runtime') + // const instance = originalRequire.call(this, currentRuntime) + // return instance.vendored.contexts[base] + return originalRequire.call( + this, + `next/dist/server/future/route-modules/pages/vendored/contexts/${path.basename( + request, + '.shared-runtime' + )}` + ) } return originalRequire.call(this, request) diff --git a/packages/next/src/shared/lib/router/adapters.test.tsx b/packages/next/src/shared/lib/router/adapters.test.tsx index e47ce2174dd35..fa8e48f2fc088 100644 --- a/packages/next/src/shared/lib/router/adapters.test.tsx +++ b/packages/next/src/shared/lib/router/adapters.test.tsx @@ -1,4 +1,4 @@ -import { adaptForAppRouterInstance } from './adapters.shared-runtime' +import { adaptForAppRouterInstance } from './adapters' import { NextRouter } from './router' describe('adaptForAppRouterInstance', () => { diff --git a/packages/next/src/shared/lib/router/adapters.shared-runtime.tsx b/packages/next/src/shared/lib/router/adapters.tsx similarity index 100% rename from packages/next/src/shared/lib/router/adapters.shared-runtime.tsx rename to packages/next/src/shared/lib/router/adapters.tsx From a4dc693006a75a9a6bc8420c193751b77aa25fd4 Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Thu, 14 Sep 2023 22:55:30 +0200 Subject: [PATCH 21/48] disable require hook in worker --- .../app-page/vendored/contexts/server-inserted-html.ts | 2 +- packages/next/src/server/require-hook.js | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/contexts/server-inserted-html.ts b/packages/next/src/server/future/route-modules/app-page/vendored/contexts/server-inserted-html.ts index 78f8ccfff52a5..3c488b0db8ee3 100644 --- a/packages/next/src/server/future/route-modules/app-page/vendored/contexts/server-inserted-html.ts +++ b/packages/next/src/server/future/route-modules/app-page/vendored/contexts/server-inserted-html.ts @@ -1,3 +1,3 @@ module.exports = require('../../module.compiled').vendored[ 'contexts' -].ServerInsertedHTML +].ServerInsertedHtml diff --git a/packages/next/src/server/require-hook.js b/packages/next/src/server/require-hook.js index 5b5554d10ca01..802540ce98a8f 100644 --- a/packages/next/src/server/require-hook.js +++ b/packages/next/src/server/require-hook.js @@ -33,7 +33,10 @@ mod._resolveFilename = function ( // that needs to point to the rendering runtime version, it will point to the correct one. // This can happen on `pages` when a user requires a dependency that uses next/image for example. mod.prototype.require = function (request) { - if (request.endsWith('.shared-runtime')) { + if ( + !(global.__NEXT_DATA__ && global.__NEXT_DATA__.nextExport) && + request.endsWith('.shared-runtime') + ) { // const currentRuntime = `next/dist/compiled/next-server/pages${ // process.env.TURBOPACK ? '-turbo' : '' // }.runtime.${process.env.NODE_ENV === 'production' ? 'prod' : 'dev'}` From b92c0e85dfd88debfa959a149fe37418ff20db53 Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Thu, 14 Sep 2023 23:02:53 +0200 Subject: [PATCH 22/48] add server inserted HTML to pages --- .../route-modules/pages/vendored/contexts/entrypoints.ts | 1 + .../pages/vendored/contexts/server-inserted-html.ts | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 packages/next/src/server/future/route-modules/pages/vendored/contexts/server-inserted-html.ts diff --git a/packages/next/src/server/future/route-modules/pages/vendored/contexts/entrypoints.ts b/packages/next/src/server/future/route-modules/pages/vendored/contexts/entrypoints.ts index 4d64a3d827459..5740225ca8e9d 100644 --- a/packages/next/src/server/future/route-modules/pages/vendored/contexts/entrypoints.ts +++ b/packages/next/src/server/future/route-modules/pages/vendored/contexts/entrypoints.ts @@ -7,5 +7,6 @@ export * as HooksClientContext from '../../../../../../shared/lib/hooks-client-c export * as HeadManagerContext from '../../../../../../shared/lib/head-manager-context.shared-runtime' export * as AppRouterContext from '../../../../../../shared/lib/app-router-context.shared-runtime' export * as AmpContext from '../../../../../../shared/lib/amp-context.shared-runtime' +export * as ServerInsertedHtml from '../../../../../../shared/lib/server-inserted-html.shared-runtime' // export * as runtimeConfig from '../../../../../../shared/lib/runtime-config.external' // export * as adapters from '../../../../../../shared/lib/router/adapters.shared-runtime' diff --git a/packages/next/src/server/future/route-modules/pages/vendored/contexts/server-inserted-html.ts b/packages/next/src/server/future/route-modules/pages/vendored/contexts/server-inserted-html.ts new file mode 100644 index 0000000000000..3c488b0db8ee3 --- /dev/null +++ b/packages/next/src/server/future/route-modules/pages/vendored/contexts/server-inserted-html.ts @@ -0,0 +1,3 @@ +module.exports = require('../../module.compiled').vendored[ + 'contexts' +].ServerInsertedHtml From a598f5eceef079f163d9e1bc2d0c8ee9d7c9977e Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Thu, 14 Sep 2023 23:27:08 +0200 Subject: [PATCH 23/48] fix require hook --- packages/next/src/server/require-hook.js | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/packages/next/src/server/require-hook.js b/packages/next/src/server/require-hook.js index 802540ce98a8f..b5711fd1c6248 100644 --- a/packages/next/src/server/require-hook.js +++ b/packages/next/src/server/require-hook.js @@ -9,6 +9,7 @@ const originalRequire = mod.prototype.require const resolveFilename = mod._resolveFilename const { hookPropertyMap } = require('./import-overrides') +const { PHASE_PRODUCTION_BUILD } = require('../shared/lib/constants') mod._resolveFilename = function ( originalResolveFilename, @@ -34,15 +35,9 @@ mod._resolveFilename = function ( // This can happen on `pages` when a user requires a dependency that uses next/image for example. mod.prototype.require = function (request) { if ( - !(global.__NEXT_DATA__ && global.__NEXT_DATA__.nextExport) && + process.env.NEXT_PHASE !== PHASE_PRODUCTION_BUILD && request.endsWith('.shared-runtime') ) { - // const currentRuntime = `next/dist/compiled/next-server/pages${ - // process.env.TURBOPACK ? '-turbo' : '' - // }.runtime.${process.env.NODE_ENV === 'production' ? 'prod' : 'dev'}` - // const base = path.basename(request, '.shared-runtime') - // const instance = originalRequire.call(this, currentRuntime) - // return instance.vendored.contexts[base] return originalRequire.call( this, `next/dist/server/future/route-modules/pages/vendored/contexts/${path.basename( From bf86e06ce8ac13c88e72b58ba9c07d2fec3ebf3e Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Thu, 14 Sep 2023 23:36:10 +0200 Subject: [PATCH 24/48] add other aliases for react --- packages/next/src/build/webpack-config.ts | 6 ++++++ test/e2e/app-dir/rsc-basic/app/app-react/page.js | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/next/src/build/webpack-config.ts b/packages/next/src/build/webpack-config.ts index dff9befbe34a9..c7990f242ab15 100644 --- a/packages/next/src/build/webpack-config.ts +++ b/packages/next/src/build/webpack-config.ts @@ -436,6 +436,8 @@ function createRSCAliases( 'react-dom$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-dom`, 'react-dom/server.edge$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-dom-server-edge`, 'react-server-dom-webpack/client.edge$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-server-dom-webpack-client-edge`, + // not essential but we're providing this alias for people who might use it + 'react-dom/server$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-dom-server-edge`, } } else if (opts.layer === 'rsc') { alias = { @@ -445,6 +447,10 @@ function createRSCAliases( 'react-dom$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-dom`, 'react-server-dom-webpack/server.edge$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-server-dom-webpack-server-edge`, 'react-server-dom-webpack/server.node$': `next/dist/server/future/route-modules/app-page/vendored/${opts.layer}/react-server-dom-webpack-server-node`, + // not essential but we're providing this alias for people who might use it. + // A note here is that this will point toward the ReactDOMServer on the SSR layer + // TODO: add the rests + 'react-dom/server.edge$': `next/dist/server/future/route-modules/app-page/vendored/ssr/react-dom-server-edge`, } } else { throw new Error(`Unexpected layer: ${opts.layer}`) diff --git a/test/e2e/app-dir/rsc-basic/app/app-react/page.js b/test/e2e/app-dir/rsc-basic/app/app-react/page.js index fb989e12ebbd7..00c968a2b391f 100644 --- a/test/e2e/app-dir/rsc-basic/app/app-react/page.js +++ b/test/e2e/app-dir/rsc-basic/app/app-react/page.js @@ -1,6 +1,6 @@ import React from 'react' import ReactDOM from 'react-dom' -import ReactDOMServer from 'react-dom/server.browser' +import ReactDOMServer from 'react-dom/server.edge' import ClientReact from './client-react' export default function Page() { From 57bb3bcea8693b0dd3cf2021dcfab0a80609e70c Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Thu, 14 Sep 2023 23:54:53 +0200 Subject: [PATCH 25/48] fix require hook (again) --- packages/next/src/export/worker.ts | 1 + packages/next/src/server/require-hook.js | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/next/src/export/worker.ts b/packages/next/src/export/worker.ts index 1144d7e19ae6c..6e48280dbc20c 100644 --- a/packages/next/src/export/worker.ts +++ b/packages/next/src/export/worker.ts @@ -167,6 +167,7 @@ export default async function exportPage({ } try { + process.env.NEXT_IS_EXPORT_WORKER = 'true' if (renderOpts.deploymentId) { process.env.NEXT_DEPLOYMENT_ID = renderOpts.deploymentId } diff --git a/packages/next/src/server/require-hook.js b/packages/next/src/server/require-hook.js index b5711fd1c6248..d8c99fda483e1 100644 --- a/packages/next/src/server/require-hook.js +++ b/packages/next/src/server/require-hook.js @@ -35,7 +35,8 @@ mod._resolveFilename = function ( // This can happen on `pages` when a user requires a dependency that uses next/image for example. mod.prototype.require = function (request) { if ( - process.env.NEXT_PHASE !== PHASE_PRODUCTION_BUILD && + (process.env.NEXT_PHASE !== PHASE_PRODUCTION_BUILD || + process.env.NEXT_IS_EXPORT_WORKER) && request.endsWith('.shared-runtime') ) { return originalRequire.call( From 25a9a8ff18c5a11a9706c7ffdc4b7402e39155de Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Fri, 15 Sep 2023 00:57:17 +0200 Subject: [PATCH 26/48] update import map --- .../crates/next-core/src/next_import_map.rs | 179 ++++++++++-------- 1 file changed, 97 insertions(+), 82 deletions(-) diff --git a/packages/next-swc/crates/next-core/src/next_import_map.rs b/packages/next-swc/crates/next-core/src/next_import_map.rs index 93572d8a68a90..bc0d9f578c0a7 100644 --- a/packages/next-swc/crates/next-core/src/next_import_map.rs +++ b/packages/next-swc/crates/next-core/src/next_import_map.rs @@ -429,7 +429,10 @@ async fn insert_next_server_special_aliases( (_, ServerContextType::PagesData { .. }) => {} // In development, we *always* use the bundled version of React, even in // SSR, since we're bundling Next.js alongside it. - (NextMode::DevServer, ServerContextType::AppSSR { app_dir }) => { + ( + NextMode::DevServer | NextMode::Build | NextMode::Development, + ServerContextType::AppSSR { app_dir }, + ) => { import_map.insert_exact_alias( "@opentelemetry/api", // TODO(WEB-625) this actually need to prefer the local version of @@ -437,51 +440,71 @@ async fn insert_next_server_special_aliases( request_to_import_mapping(app_dir, "next/dist/compiled/@opentelemetry/api"), ); import_map.insert_exact_alias( - "react", - passthrough_external_if_node(app_dir, "next/dist/compiled/react"), + "styled-jsx", + passthrough_external_if_node(app_dir, "next/dist/compiled/styled-jsx"), ); import_map.insert_wildcard_alias( - "react/", - passthrough_external_if_node(app_dir, "next/dist/compiled/react/*"), + "styled-jsx/", + passthrough_external_if_node(app_dir, "next/dist/compiled/styled-jsx/*"), ); import_map.insert_exact_alias( - "react-dom", - passthrough_external_if_node( + "react/jsx-runtime", + request_to_import_mapping( app_dir, - "next/dist/compiled/react-dom/server-rendering-stub.js", + "next/dist/server/future/route-modules/app-page/vendored/shared/\ + react-jsx-runtime", ), ); - import_map.insert_wildcard_alias( - "react-dom/", - passthrough_external_if_node(app_dir, "next/dist/compiled/react-dom/*"), + import_map.insert_exact_alias( + "react/jsx-dev-runtime", + request_to_import_mapping( + app_dir, + "next/dist/server/future/route-modules/app-page/vendored/shared/\ + react-jsx-dev-runtime", + ), ); import_map.insert_exact_alias( - "styled-jsx", - passthrough_external_if_node(app_dir, "next/dist/compiled/styled-jsx"), + "react", + request_to_import_mapping( + app_dir, + "next/dist/server/future/route-modules/app-page/vendored/ssr/react", + ), ); - import_map.insert_wildcard_alias( - "styled-jsx/", - passthrough_external_if_node(app_dir, "next/dist/compiled/styled-jsx/*"), + import_map.insert_exact_alias( + "react-dom", + request_to_import_mapping( + app_dir, + "next/dist/server/future/route-modules/app-page/vendored/ssr/react-dom", + ), ); - import_map.insert_wildcard_alias( - "react-server-dom-webpack/", - passthrough_external_if_node( + import_map.insert_exact_alias( + "react-server-dom-webpack/server.edge", + request_to_import_mapping( + app_dir, + "next/dist/server/future/route-modules/app-page/vendored/ssr/\ + react-server-dom-webpack-server-edge", + ), + ); + import_map.insert_exact_alias( + "react-server-dom-webpack/server.node", + request_to_import_mapping( app_dir, - "next/dist/compiled/react-server-dom-webpack/*", + "next/dist/server/future/route-modules/app-page/vendored/ssr/\ + react-server-dom-webpack-server-node", + ), + ); + // not essential but we're providing this alias for people who might use it. + // A note here is that this will point toward the ReactDOMServer on the SSR + // layer TODO: add the rests + import_map.insert_exact_alias( + "react-dom/server.edge", + request_to_import_mapping( + app_dir, + "next/dist/server/future/route-modules/app-page/vendored/ssr/\ + react-dom-server-edge", ), ); } - - // NOTE(alexkirsz) This logic maps loosely to - // `next.js/packages/next/src/build/webpack-config.ts`, where: - // - // ## RSC - // - // * always bundles - // * maps react -> react/shared-subset (through the "react-server" exports condition) - // * maps react-dom -> react-dom/server-rendering-stub - // * passes through (react|react-dom|react-server-dom-webpack)/(.*) to - // next/dist/compiled/$1/$2 ( NextMode::Build | NextMode::Development | NextMode::DevServer, ServerContextType::AppRSC { app_dir, .. } | ServerContextType::AppRoute { app_dir }, @@ -492,72 +515,64 @@ async fn insert_next_server_special_aliases( // @opentelemetry/api request_to_import_mapping(app_dir, "next/dist/compiled/@opentelemetry/api"), ); - if matches!(ty, ServerContextType::AppRSC { .. }) { - import_map.insert_exact_alias( - "react", - request_to_import_mapping( - app_dir, - "next/dist/compiled/react/react.shared-subset", - ), - ); - } else { - import_map.insert_exact_alias( - "react", - request_to_import_mapping(app_dir, "next/dist/compiled/react"), - ); - } + import_map.insert_exact_alias( - "react-dom", + "react/jsx-runtime", request_to_import_mapping( app_dir, - "next/dist/compiled/react-dom/server-rendering-stub", + "next/dist/server/future/route-modules/app-page/vendored/shared/\ + react-jsx-runtime", ), ); - for (wildcard_alias, request) in [ - ("react/", "next/dist/compiled/react/*"), - ("react-dom/", "next/dist/compiled/react-dom/*"), - ( - "react-server-dom-webpack/", - "next/dist/compiled/react-server-dom-webpack/*", + import_map.insert_exact_alias( + "react/jsx-dev-runtime", + request_to_import_mapping( + app_dir, + "next/dist/server/future/route-modules/app-page/vendored/shared/\ + react-jsx-dev-runtime", ), - ] { - import_map.insert_wildcard_alias( - wildcard_alias, - request_to_import_mapping(app_dir, request), - ); - } - } - // ## SSR - // - // * always uses externals, to ensure we're using the same React instance as the Next.js - // runtime - // * maps react-dom -> react-dom/server-rendering-stub - // * passes through react and (react|react-dom|react-server-dom-webpack)/(.*) to - // next/dist/compiled/react and next/dist/compiled/$1/$2 resp. - (NextMode::Build | NextMode::Development, ServerContextType::AppSSR { app_dir }) => { + ); import_map.insert_exact_alias( "react", - external_if_node(app_dir, "next/dist/compiled/react"), + request_to_import_mapping( + app_dir, + "next/dist/server/future/route-modules/app-page/vendored/rsc/react", + ), ); import_map.insert_exact_alias( "react-dom", - external_if_node( + request_to_import_mapping( app_dir, - "next/dist/compiled/react-dom/server-rendering-stub", + "next/dist/server/future/route-modules/app-page/vendored/rsc/react-dom", ), ); - - for (wildcard_alias, request) in [ - ("react/", "next/dist/compiled/react/*"), - ("react-dom/", "next/dist/compiled/react-dom/*"), - ( - "react-server-dom-webpack/", - "next/dist/compiled/react-server-dom-webpack/*", + import_map.insert_exact_alias( + "react-server-dom-webpack/server.edge", + request_to_import_mapping( + app_dir, + "next/dist/server/future/route-modules/app-page/vendored/rsc/\ + react-server-dom-webpack-server-edge", ), - ] { - let import_mapping = external_if_node(app_dir, request); - import_map.insert_wildcard_alias(wildcard_alias, import_mapping); - } + ); + import_map.insert_exact_alias( + "react-server-dom-webpack/server.node", + request_to_import_mapping( + app_dir, + "next/dist/server/future/route-modules/app-page/vendored/rsc/\ + react-server-dom-webpack-server-node", + ), + ); + // not essential but we're providing this alias for people who might use it. + // A note here is that this will point toward the ReactDOMServer on the SSR + // layer TODO: add the rests + import_map.insert_exact_alias( + "react-dom/server.edge", + request_to_import_mapping( + app_dir, + "next/dist/server/future/route-modules/app-page/vendored/ssr/\ + react-dom-server-edge", + ), + ); } (_, ServerContextType::Middleware) => {} } From 3a13db1be6c272de20ec00d69e7fccc41439a297 Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Fri, 15 Sep 2023 10:51:14 +0200 Subject: [PATCH 27/48] revert scheduler rewrites --- .../react-dom-unstable_testing.development.js | 2 +- ...act-dom-unstable_testing.production.min.js | 2 +- .../cjs/react-dom.development.js | 2 +- .../cjs/react-dom.production.min.js | 2 +- .../cjs/react-dom.profiling.min.js | 2 +- .../react-dom/cjs/react-dom.development.js | 2 +- .../react-dom/cjs/react-dom.production.min.js | 2 +- .../react-dom/cjs/react-dom.profiling.min.js | 2 +- packages/next/taskfile.js | 31 +++++++++---------- 9 files changed, 23 insertions(+), 24 deletions(-) diff --git a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-unstable_testing.development.js b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-unstable_testing.development.js index 46c17f1d6c2e8..3d042a5e8821a 100644 --- a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-unstable_testing.development.js +++ b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-unstable_testing.development.js @@ -15,7 +15,7 @@ if (process.env.NODE_ENV !== "production") { 'use strict'; var React = require('react'); -var Scheduler = require('scheduler'); +var Scheduler = require("next/dist/compiled/scheduler-experimental"); var Internals = { usingClientEntryPoint: false, diff --git a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-unstable_testing.production.min.js b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-unstable_testing.production.min.js index b23630c328249..be481a61f5cea 100644 --- a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-unstable_testing.production.min.js +++ b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-unstable_testing.production.min.js @@ -10,7 +10,7 @@ /* Modernizr 3.0.0pre (Custom Build) | MIT */ -'use strict';var aa=require("react"),ba=require("scheduler"),ca={usingClientEntryPoint:!1,Events:null,Dispatcher:{current:null}};function t(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;cja||(a.current=ia[ja],ia[ja]=null,ja--)}function E(a,b){ja++;ia[ja]=a.current;a.current=b} var la=Symbol.for("react.element"),ma=Symbol.for("react.portal"),na=Symbol.for("react.fragment"),oa=Symbol.for("react.strict_mode"),pa=Symbol.for("react.profiler"),qa=Symbol.for("react.provider"),ra=Symbol.for("react.context"),sa=Symbol.for("react.server_context"),ta=Symbol.for("react.forward_ref"),ua=Symbol.for("react.suspense"),va=Symbol.for("react.suspense_list"),wa=Symbol.for("react.memo"),xa=Symbol.for("react.lazy"),ya=Symbol.for("react.scope");Symbol.for("react.debug_trace_mode"); var za=Symbol.for("react.offscreen"),Aa=Symbol.for("react.legacy_hidden"),Ba=Symbol.for("react.cache");Symbol.for("react.tracing_marker");var Ca=Symbol.for("react.default_value"),Da=Symbol.for("react.memo_cache_sentinel"),Ea=Symbol.for("react.postpone"),Fa=Symbol.iterator;function Ga(a){if(null===a||"object"!==typeof a)return null;a=Fa&&a[Fa]||a["@@iterator"];return"function"===typeof a?a:null} diff --git a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.development.js b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.development.js index af35cde6be0ea..1359438922891 100644 --- a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.development.js +++ b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.development.js @@ -24,7 +24,7 @@ if ( __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error()); } var React = require('react'); -var Scheduler = require('scheduler'); +var Scheduler = require("next/dist/compiled/scheduler-experimental"); var Internals = { usingClientEntryPoint: false, diff --git a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.production.min.js b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.production.min.js index 0448a7d7427dc..e847717bc5532 100644 --- a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.production.min.js +++ b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.production.min.js @@ -10,7 +10,7 @@ /* Modernizr 3.0.0pre (Custom Build) | MIT */ -'use strict';var aa=require("react"),ba=require("scheduler"),ca={usingClientEntryPoint:!1,Events:null,Dispatcher:{current:null}};function t(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;cja||(a.current=ia[ja],ia[ja]=null,ja--)}function E(a,b){ja++;ia[ja]=a.current;a.current=b} var la=Symbol.for("react.element"),ma=Symbol.for("react.portal"),na=Symbol.for("react.fragment"),oa=Symbol.for("react.strict_mode"),pa=Symbol.for("react.profiler"),qa=Symbol.for("react.provider"),ra=Symbol.for("react.context"),sa=Symbol.for("react.server_context"),ta=Symbol.for("react.forward_ref"),ua=Symbol.for("react.suspense"),va=Symbol.for("react.suspense_list"),wa=Symbol.for("react.memo"),xa=Symbol.for("react.lazy"),ya=Symbol.for("react.scope");Symbol.for("react.debug_trace_mode"); var za=Symbol.for("react.offscreen"),Aa=Symbol.for("react.legacy_hidden"),Ba=Symbol.for("react.cache");Symbol.for("react.tracing_marker");var Ca=Symbol.for("react.default_value"),Da=Symbol.for("react.memo_cache_sentinel"),Ea=Symbol.for("react.postpone"),Fa=Symbol.iterator;function Ga(a){if(null===a||"object"!==typeof a)return null;a=Fa&&a[Fa]||a["@@iterator"];return"function"===typeof a?a:null} diff --git a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.profiling.min.js b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.profiling.min.js index 0e5e21fd26e55..95e7755cf0daa 100644 --- a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.profiling.min.js +++ b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.profiling.min.js @@ -21,7 +21,7 @@ if ( /* Modernizr 3.0.0pre (Custom Build) | MIT */ -'use strict';var aa=require("react"),ba=require("scheduler"),ca={usingClientEntryPoint:!1,Events:null,Dispatcher:{current:null}};function t(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;cia||(a.current=ha[ia],ha[ia]=null,ia--)}function E(a,b){ia++;ha[ia]=a.current;a.current=b} var la=Symbol.for("react.element"),ma=Symbol.for("react.portal"),na=Symbol.for("react.fragment"),oa=Symbol.for("react.strict_mode"),pa=Symbol.for("react.profiler"),qa=Symbol.for("react.provider"),ra=Symbol.for("react.context"),sa=Symbol.for("react.server_context"),ta=Symbol.for("react.forward_ref"),ua=Symbol.for("react.suspense"),va=Symbol.for("react.suspense_list"),wa=Symbol.for("react.memo"),xa=Symbol.for("react.lazy"),ya=Symbol.for("react.scope");Symbol.for("react.debug_trace_mode"); var za=Symbol.for("react.offscreen"),Aa=Symbol.for("react.legacy_hidden"),Ba=Symbol.for("react.cache");Symbol.for("react.tracing_marker");var Ca=Symbol.for("react.default_value"),Da=Symbol.for("react.memo_cache_sentinel"),Ea=Symbol.for("react.postpone"),Fa=Symbol.iterator;function Ga(a){if(null===a||"object"!==typeof a)return null;a=Fa&&a[Fa]||a["@@iterator"];return"function"===typeof a?a:null} diff --git a/packages/next/src/compiled/react-dom/cjs/react-dom.development.js b/packages/next/src/compiled/react-dom/cjs/react-dom.development.js index fbfd146478e22..9d7f0411ee7aa 100644 --- a/packages/next/src/compiled/react-dom/cjs/react-dom.development.js +++ b/packages/next/src/compiled/react-dom/cjs/react-dom.development.js @@ -24,7 +24,7 @@ if ( __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error()); } var React = require('react'); -var Scheduler = require('scheduler'); +var Scheduler = require("next/dist/compiled/scheduler"); var Internals = { usingClientEntryPoint: false, diff --git a/packages/next/src/compiled/react-dom/cjs/react-dom.production.min.js b/packages/next/src/compiled/react-dom/cjs/react-dom.production.min.js index 3581e37cf54c9..dfb059bfc9867 100644 --- a/packages/next/src/compiled/react-dom/cjs/react-dom.production.min.js +++ b/packages/next/src/compiled/react-dom/cjs/react-dom.production.min.js @@ -10,7 +10,7 @@ /* Modernizr 3.0.0pre (Custom Build) | MIT */ -'use strict';var aa=require("react"),ba=require("scheduler"),ca={usingClientEntryPoint:!1,Events:null,Dispatcher:{current:null}};function r(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;cha||(a.current=fa[ha],fa[ha]=null,ha--)}function E(a,b){ha++;fa[ha]=a.current;a.current=b} var ja=Symbol.for("react.element"),ka=Symbol.for("react.portal"),la=Symbol.for("react.fragment"),ma=Symbol.for("react.strict_mode"),na=Symbol.for("react.profiler"),oa=Symbol.for("react.provider"),pa=Symbol.for("react.context"),qa=Symbol.for("react.server_context"),ra=Symbol.for("react.forward_ref"),sa=Symbol.for("react.suspense"),ta=Symbol.for("react.suspense_list"),ua=Symbol.for("react.memo"),va=Symbol.for("react.lazy"),wa=Symbol.for("react.scope");Symbol.for("react.debug_trace_mode"); var xa=Symbol.for("react.offscreen"),ya=Symbol.for("react.legacy_hidden"),za=Symbol.for("react.cache");Symbol.for("react.tracing_marker");var Aa=Symbol.for("react.default_value"),Ba=Symbol.iterator;function Ca(a){if(null===a||"object"!==typeof a)return null;a=Ba&&a[Ba]||a["@@iterator"];return"function"===typeof a?a:null}var Da=ia(null),Ea=ia(null),Fa=ia(null); diff --git a/packages/next/src/compiled/react-dom/cjs/react-dom.profiling.min.js b/packages/next/src/compiled/react-dom/cjs/react-dom.profiling.min.js index d7527e016b441..958e355b9ad41 100644 --- a/packages/next/src/compiled/react-dom/cjs/react-dom.profiling.min.js +++ b/packages/next/src/compiled/react-dom/cjs/react-dom.profiling.min.js @@ -21,7 +21,7 @@ if ( /* Modernizr 3.0.0pre (Custom Build) | MIT */ -'use strict';var aa=require("scheduler"),ba=require("react"),ca={usingClientEntryPoint:!1,Events:null,Dispatcher:{current:null}};function r(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;cha||(a.current=fa[ha],fa[ha]=null,ha--)}function E(a,b){ha++;fa[ha]=a.current;a.current=b} var ja=Symbol.for("react.element"),ka=Symbol.for("react.portal"),la=Symbol.for("react.fragment"),ma=Symbol.for("react.strict_mode"),na=Symbol.for("react.profiler"),oa=Symbol.for("react.provider"),pa=Symbol.for("react.context"),qa=Symbol.for("react.server_context"),ra=Symbol.for("react.forward_ref"),sa=Symbol.for("react.suspense"),ta=Symbol.for("react.suspense_list"),ua=Symbol.for("react.memo"),va=Symbol.for("react.lazy"),wa=Symbol.for("react.scope");Symbol.for("react.debug_trace_mode"); var xa=Symbol.for("react.offscreen"),ya=Symbol.for("react.legacy_hidden"),za=Symbol.for("react.cache");Symbol.for("react.tracing_marker");var Aa=Symbol.for("react.default_value"),Ba=Symbol.iterator;function Ca(a){if(null===a||"object"!==typeof a)return null;a=Ba&&a[Ba]||a["@@iterator"];return"function"===typeof a?a:null}var Da=ia(null),Ea=ia(null),Fa=ia(null); diff --git a/packages/next/taskfile.js b/packages/next/taskfile.js index 08ce0cc5660cb..6ffeab4bca47c 100644 --- a/packages/next/taskfile.js +++ b/packages/next/taskfile.js @@ -1763,22 +1763,21 @@ export async function copy_vendor_react(task_) { yield task .source(join(reactDomDir, 'cjs/**/*.js')) // eslint-disable-next-line require-yield - // .run({ every: true }, function* (file) { - // const source = file.data.toString() - // // We replace the module/chunk loading code with our own implementation in Next.js. - // file.data = source - // .replace( - // /require\(["']scheduler["']\)/g, - // `require("next/dist/compiled/scheduler${packageSuffix}")` - // ) - // .replace( - // /require\(["']react["']\)/g, - // `require("next/dist/compiled/react${packageSuffix}")` - // ) - - // // Note that we don't replace `react-dom` with `next/dist/compiled/react-dom` - // // as it mighe be aliased to the server rendering stub. - // }) + .run({ every: true }, function* (file) { + const source = file.data.toString() + // We replace the module/chunk loading code with our own implementation in Next.js. + file.data = source.replace( + /require\(["']scheduler["']\)/g, + `require("next/dist/compiled/scheduler${packageSuffix}")` + ) + // .replace( + // /require\(["']react["']\)/g, + // `require("next/dist/compiled/react${packageSuffix}")` + // ) + + // Note that we don't replace `react-dom` with `next/dist/compiled/react-dom` + // as it mighe be aliased to the server rendering stub. + }) .target(`src/compiled/react-dom${packageSuffix}/cjs`) // Remove unused files From 57a2cfe95b00941e94d2decd62896d02f2aea34b Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Fri, 15 Sep 2023 10:51:35 +0200 Subject: [PATCH 28/48] add new resolve plugin --- .../next-core/src/next_server/context.rs | 6 +- .../next-core/src/next_shared/resolve.rs | 73 +++++++++++++++++-- 2 files changed, 72 insertions(+), 7 deletions(-) diff --git a/packages/next-swc/crates/next-core/src/next_server/context.rs b/packages/next-swc/crates/next-core/src/next_server/context.rs index cc830b5e11bde..7939dbe5c170f 100644 --- a/packages/next-swc/crates/next-core/src/next_server/context.rs +++ b/packages/next-swc/crates/next-core/src/next_server/context.rs @@ -48,7 +48,7 @@ use crate::{ next_shared::{ resolve::{ ModuleFeatureReportResolvePlugin, NextExternalResolvePlugin, - UnsupportedModulesResolvePlugin, + NextNodeSharedRuntimeResolvePlugin, UnsupportedModulesResolvePlugin, }, transforms::{ emotion::get_emotion_transform_plugin, get_relay_transform_plugin, @@ -125,6 +125,8 @@ pub async fn get_server_resolve_options_context( ); let next_external_plugin = NextExternalResolvePlugin::new(project_path); + let next_node_shared_runtime_plugin = + NextNodeSharedRuntimeResolvePlugin::new(project_path, Value::new(ty)); let plugins = match ty { ServerContextType::Pages { .. } | ServerContextType::PagesData { .. } => { @@ -133,6 +135,7 @@ pub async fn get_server_resolve_options_context( Vc::upcast(external_cjs_modules_plugin), Vc::upcast(unsupported_modules_resolve_plugin), Vc::upcast(next_external_plugin), + Vc::upcast(next_node_shared_runtime_plugin), ] } ServerContextType::AppSSR { .. } @@ -144,6 +147,7 @@ pub async fn get_server_resolve_options_context( Vc::upcast(server_component_externals_plugin), Vc::upcast(unsupported_modules_resolve_plugin), Vc::upcast(next_external_plugin), + Vc::upcast(next_node_shared_runtime_plugin), ] } }; diff --git a/packages/next-swc/crates/next-core/src/next_shared/resolve.rs b/packages/next-swc/crates/next-core/src/next_shared/resolve.rs index 36866684af68f..97f733212e390 100644 --- a/packages/next-swc/crates/next-core/src/next_shared/resolve.rs +++ b/packages/next-swc/crates/next-core/src/next_shared/resolve.rs @@ -2,7 +2,7 @@ use std::collections::{HashMap, HashSet}; use anyhow::Result; use lazy_static::lazy_static; -use turbo_tasks::Vc; +use turbo_tasks::{Value, Vc}; use turbo_tasks_fs::glob::Glob; use turbopack_binding::{ turbo::tasks_fs::FileSystemPath, @@ -19,7 +19,7 @@ use turbopack_binding::{ }, }; -use crate::next_telemetry::ModuleFeatureTelemetry; +use crate::{next_server::ServerContextType, next_telemetry::ModuleFeatureTelemetry}; lazy_static! { static ref UNSUPPORTED_PACKAGES: HashSet<&'static str> = [].into(); @@ -122,10 +122,7 @@ impl ResolvePlugin for NextExternalResolvePlugin { fn after_resolve_condition(&self) -> Vc { ResolvePluginCondition::new( self.root.root(), - Glob::new( - "**/next/dist/**/*.{external,shared-runtime,runtime.dev,runtime.prod}.js" - .to_string(), - ), + Glob::new("**/next/dist/**/*.{external,runtime.dev,runtime.prod}.js".to_string()), ) } @@ -152,6 +149,70 @@ impl ResolvePlugin for NextExternalResolvePlugin { } } +#[turbo_tasks::value] +pub(crate) struct NextNodeSharedRuntimeResolvePlugin { + root: Vc, + context: ServerContextType, +} + +#[turbo_tasks::value_impl] +impl NextNodeSharedRuntimeResolvePlugin { + #[turbo_tasks::function] + pub fn new(root: Vc, context: Value) -> Vc { + let context = context.into_value(); + NextNodeSharedRuntimeResolvePlugin { root, context }.cell() + } +} + +#[turbo_tasks::value_impl] +impl ResolvePlugin for NextNodeSharedRuntimeResolvePlugin { + #[turbo_tasks::function] + fn after_resolve_condition(&self) -> Vc { + ResolvePluginCondition::new( + self.root.root(), + Glob::new("**/next/dist/**/*.shared-runtime.js".to_string()), + ) + } + + #[turbo_tasks::function] + async fn after_resolve( + &self, + fs_path: Vc, + _context: Vc, + _request: Vc, + ) -> Result> { + let stem = fs_path.file_stem().await?; + let stem = stem.as_deref().unwrap_or_default(); + let stem = stem.replace(".shared-runtime", ""); + + let resource_request = format!( + "next/dist/server/future/route-modules/{}/vendored/contexts/{}", + match self.context { + ServerContextType::Pages { .. } => "pages", + ServerContextType::AppRoute { .. } => "app-route", + ServerContextType::AppSSR { .. } | ServerContextType::AppRSC { .. } => "app-page", + _ => "unknown", + }, + stem + ); + + let raw_fs_path = &*fs_path.await?; + let path = raw_fs_path.path.to_string(); + + // Find the starting index of 'next/dist' and slice from that point. It should + // always be found since the glob pattern above is specific enough. + let starting_index = path.find("next/dist").unwrap(); + + let (base, _) = path.split_at(starting_index); + + let new_path = fs_path.root().join(base.to_string()).join(resource_request); + + Ok(Vc::cell(Some( + ResolveResult::source(Vc::upcast(FileSource::new(new_path))).into(), + ))) + } +} + /// A resolver plugin tracks the usage of certain import paths, emit /// telemetry events if there is a match. #[turbo_tasks::value] From 90541a964ec7ec16e3f90d435f862fe8d71bd760 Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Fri, 15 Sep 2023 11:24:03 +0200 Subject: [PATCH 29/48] undo require changes --- ...t-dom-server-legacy.browser.development.js | 2 +- ...om-server-legacy.browser.production.min.js | 2 +- ...eact-dom-server-legacy.node.development.js | 2 +- ...t-dom-server-legacy.node.production.min.js | 2 +- ...t-dom-server-rendering-stub.development.js | 2 +- ...om-server-rendering-stub.production.min.js | 2 +- .../react-dom-server.browser.development.js | 2 +- ...react-dom-server.browser.production.min.js | 2 +- .../cjs/react-dom-server.edge.development.js | 2 +- .../react-dom-server.edge.production.min.js | 2 +- .../cjs/react-dom-server.node.development.js | 2 +- .../react-dom-server.node.production.min.js | 2 +- .../react-dom-unstable_testing.development.js | 2 +- ...act-dom-unstable_testing.production.min.js | 2 +- .../cjs/react-dom.development.js | 2 +- .../cjs/react-dom.production.min.js | 2 +- .../cjs/react-dom.profiling.min.js | 2 +- ...t-dom-server-legacy.browser.development.js | 2 +- ...om-server-legacy.browser.production.min.js | 2 +- ...eact-dom-server-legacy.node.development.js | 2 +- ...t-dom-server-legacy.node.production.min.js | 2 +- ...t-dom-server-rendering-stub.development.js | 2 +- .../react-dom-server.browser.development.js | 2 +- ...react-dom-server.browser.production.min.js | 2 +- .../cjs/react-dom-server.edge.development.js | 2 +- .../react-dom-server.edge.production.min.js | 2 +- .../cjs/react-dom-server.node.development.js | 2 +- .../react-dom-server.node.production.min.js | 2 +- .../react-dom/cjs/react-dom.development.js | 2 +- .../react-dom/cjs/react-dom.production.min.js | 2 +- .../react-dom/cjs/react-dom.profiling.min.js | 2 +- .../cjs/react-jsx-dev-runtime.development.js | 2 +- .../cjs/react-jsx-runtime.development.js | 2 +- .../cjs/react-jsx-runtime.production.min.js | 2 +- .../cjs/react-jsx-runtime.profiling.min.js | 2 +- .../cjs/react-jsx-dev-runtime.development.js | 2 +- .../cjs/react-jsx-runtime.development.js | 2 +- .../cjs/react-jsx-runtime.production.min.js | 2 +- .../cjs/react-jsx-runtime.profiling.min.js | 2 +- packages/next/taskfile.js | 33 ++++++++++--------- 40 files changed, 56 insertions(+), 55 deletions(-) diff --git a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-server-legacy.browser.development.js b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-server-legacy.browser.development.js index ba24e69c79c2d..38cec9357cd23 100644 --- a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-server-legacy.browser.development.js +++ b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-server-legacy.browser.development.js @@ -14,7 +14,7 @@ if (process.env.NODE_ENV !== "production") { (function() { 'use strict'; -var React = require('react'); +var React = require("next/dist/compiled/react-experimental"); var ReactDOM = require('react-dom'); var ReactVersion = '18.3.0-experimental-d6dcad6a8-20230914'; diff --git a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-server-legacy.browser.production.min.js b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-server-legacy.browser.production.min.js index 7e38251fff277..580536f8e5513 100644 --- a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-server-legacy.browser.production.min.js +++ b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-server-legacy.browser.production.min.js @@ -7,7 +7,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -'use strict';var fa=require("react"),pa=require("react-dom");function n(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;cja||(a.current=ia[ja],ia[ja]=null,ja--)}function E(a,b){ja++;ia[ja]=a.current;a.current=b} var la=Symbol.for("react.element"),ma=Symbol.for("react.portal"),na=Symbol.for("react.fragment"),oa=Symbol.for("react.strict_mode"),pa=Symbol.for("react.profiler"),qa=Symbol.for("react.provider"),ra=Symbol.for("react.context"),sa=Symbol.for("react.server_context"),ta=Symbol.for("react.forward_ref"),ua=Symbol.for("react.suspense"),va=Symbol.for("react.suspense_list"),wa=Symbol.for("react.memo"),xa=Symbol.for("react.lazy"),ya=Symbol.for("react.scope");Symbol.for("react.debug_trace_mode"); var za=Symbol.for("react.offscreen"),Aa=Symbol.for("react.legacy_hidden"),Ba=Symbol.for("react.cache");Symbol.for("react.tracing_marker");var Ca=Symbol.for("react.default_value"),Da=Symbol.for("react.memo_cache_sentinel"),Ea=Symbol.for("react.postpone"),Fa=Symbol.iterator;function Ga(a){if(null===a||"object"!==typeof a)return null;a=Fa&&a[Fa]||a["@@iterator"];return"function"===typeof a?a:null} diff --git a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.development.js b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.development.js index 1359438922891..f045e49ffb128 100644 --- a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.development.js +++ b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.development.js @@ -23,7 +23,7 @@ if ( ) { __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error()); } - var React = require('react'); + var React = require("next/dist/compiled/react-experimental"); var Scheduler = require("next/dist/compiled/scheduler-experimental"); var Internals = { diff --git a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.production.min.js b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.production.min.js index e847717bc5532..53a0872cd9941 100644 --- a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.production.min.js +++ b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.production.min.js @@ -10,7 +10,7 @@ /* Modernizr 3.0.0pre (Custom Build) | MIT */ -'use strict';var aa=require("react"),ba=require("next/dist/compiled/scheduler-experimental"),ca={usingClientEntryPoint:!1,Events:null,Dispatcher:{current:null}};function t(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;cja||(a.current=ia[ja],ia[ja]=null,ja--)}function E(a,b){ja++;ia[ja]=a.current;a.current=b} var la=Symbol.for("react.element"),ma=Symbol.for("react.portal"),na=Symbol.for("react.fragment"),oa=Symbol.for("react.strict_mode"),pa=Symbol.for("react.profiler"),qa=Symbol.for("react.provider"),ra=Symbol.for("react.context"),sa=Symbol.for("react.server_context"),ta=Symbol.for("react.forward_ref"),ua=Symbol.for("react.suspense"),va=Symbol.for("react.suspense_list"),wa=Symbol.for("react.memo"),xa=Symbol.for("react.lazy"),ya=Symbol.for("react.scope");Symbol.for("react.debug_trace_mode"); var za=Symbol.for("react.offscreen"),Aa=Symbol.for("react.legacy_hidden"),Ba=Symbol.for("react.cache");Symbol.for("react.tracing_marker");var Ca=Symbol.for("react.default_value"),Da=Symbol.for("react.memo_cache_sentinel"),Ea=Symbol.for("react.postpone"),Fa=Symbol.iterator;function Ga(a){if(null===a||"object"!==typeof a)return null;a=Fa&&a[Fa]||a["@@iterator"];return"function"===typeof a?a:null} diff --git a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.profiling.min.js b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.profiling.min.js index 95e7755cf0daa..dca434217c855 100644 --- a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.profiling.min.js +++ b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom.profiling.min.js @@ -21,7 +21,7 @@ if ( /* Modernizr 3.0.0pre (Custom Build) | MIT */ -'use strict';var aa=require("react"),ba=require("next/dist/compiled/scheduler-experimental"),ca={usingClientEntryPoint:!1,Events:null,Dispatcher:{current:null}};function t(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;cia||(a.current=ha[ia],ha[ia]=null,ia--)}function E(a,b){ia++;ha[ia]=a.current;a.current=b} var la=Symbol.for("react.element"),ma=Symbol.for("react.portal"),na=Symbol.for("react.fragment"),oa=Symbol.for("react.strict_mode"),pa=Symbol.for("react.profiler"),qa=Symbol.for("react.provider"),ra=Symbol.for("react.context"),sa=Symbol.for("react.server_context"),ta=Symbol.for("react.forward_ref"),ua=Symbol.for("react.suspense"),va=Symbol.for("react.suspense_list"),wa=Symbol.for("react.memo"),xa=Symbol.for("react.lazy"),ya=Symbol.for("react.scope");Symbol.for("react.debug_trace_mode"); var za=Symbol.for("react.offscreen"),Aa=Symbol.for("react.legacy_hidden"),Ba=Symbol.for("react.cache");Symbol.for("react.tracing_marker");var Ca=Symbol.for("react.default_value"),Da=Symbol.for("react.memo_cache_sentinel"),Ea=Symbol.for("react.postpone"),Fa=Symbol.iterator;function Ga(a){if(null===a||"object"!==typeof a)return null;a=Fa&&a[Fa]||a["@@iterator"];return"function"===typeof a?a:null} diff --git a/packages/next/src/compiled/react-dom/cjs/react-dom-server-legacy.browser.development.js b/packages/next/src/compiled/react-dom/cjs/react-dom-server-legacy.browser.development.js index 3f8c716eda0c7..d12638faf1d03 100644 --- a/packages/next/src/compiled/react-dom/cjs/react-dom-server-legacy.browser.development.js +++ b/packages/next/src/compiled/react-dom/cjs/react-dom-server-legacy.browser.development.js @@ -14,7 +14,7 @@ if (process.env.NODE_ENV !== "production") { (function() { 'use strict'; -var React = require('react'); +var React = require("next/dist/compiled/react"); var ReactDOM = require('react-dom'); var ReactVersion = '18.3.0-canary-d6dcad6a8-20230914'; diff --git a/packages/next/src/compiled/react-dom/cjs/react-dom-server-legacy.browser.production.min.js b/packages/next/src/compiled/react-dom/cjs/react-dom-server-legacy.browser.production.min.js index e9aed31c1e2a4..cf9731ee0cdbb 100644 --- a/packages/next/src/compiled/react-dom/cjs/react-dom-server-legacy.browser.production.min.js +++ b/packages/next/src/compiled/react-dom/cjs/react-dom-server-legacy.browser.production.min.js @@ -7,7 +7,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -'use strict';var ba=require("react"),ma=require("react-dom");function m(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;cha||(a.current=fa[ha],fa[ha]=null,ha--)}function E(a,b){ha++;fa[ha]=a.current;a.current=b} var ja=Symbol.for("react.element"),ka=Symbol.for("react.portal"),la=Symbol.for("react.fragment"),ma=Symbol.for("react.strict_mode"),na=Symbol.for("react.profiler"),oa=Symbol.for("react.provider"),pa=Symbol.for("react.context"),qa=Symbol.for("react.server_context"),ra=Symbol.for("react.forward_ref"),sa=Symbol.for("react.suspense"),ta=Symbol.for("react.suspense_list"),ua=Symbol.for("react.memo"),va=Symbol.for("react.lazy"),wa=Symbol.for("react.scope");Symbol.for("react.debug_trace_mode"); var xa=Symbol.for("react.offscreen"),ya=Symbol.for("react.legacy_hidden"),za=Symbol.for("react.cache");Symbol.for("react.tracing_marker");var Aa=Symbol.for("react.default_value"),Ba=Symbol.iterator;function Ca(a){if(null===a||"object"!==typeof a)return null;a=Ba&&a[Ba]||a["@@iterator"];return"function"===typeof a?a:null}var Da=ia(null),Ea=ia(null),Fa=ia(null); diff --git a/packages/next/src/compiled/react-dom/cjs/react-dom.profiling.min.js b/packages/next/src/compiled/react-dom/cjs/react-dom.profiling.min.js index 958e355b9ad41..99327ed021bef 100644 --- a/packages/next/src/compiled/react-dom/cjs/react-dom.profiling.min.js +++ b/packages/next/src/compiled/react-dom/cjs/react-dom.profiling.min.js @@ -21,7 +21,7 @@ if ( /* Modernizr 3.0.0pre (Custom Build) | MIT */ -'use strict';var aa=require("next/dist/compiled/scheduler"),ba=require("react"),ca={usingClientEntryPoint:!1,Events:null,Dispatcher:{current:null}};function r(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;cha||(a.current=fa[ha],fa[ha]=null,ha--)}function E(a,b){ha++;fa[ha]=a.current;a.current=b} var ja=Symbol.for("react.element"),ka=Symbol.for("react.portal"),la=Symbol.for("react.fragment"),ma=Symbol.for("react.strict_mode"),na=Symbol.for("react.profiler"),oa=Symbol.for("react.provider"),pa=Symbol.for("react.context"),qa=Symbol.for("react.server_context"),ra=Symbol.for("react.forward_ref"),sa=Symbol.for("react.suspense"),ta=Symbol.for("react.suspense_list"),ua=Symbol.for("react.memo"),va=Symbol.for("react.lazy"),wa=Symbol.for("react.scope");Symbol.for("react.debug_trace_mode"); var xa=Symbol.for("react.offscreen"),ya=Symbol.for("react.legacy_hidden"),za=Symbol.for("react.cache");Symbol.for("react.tracing_marker");var Aa=Symbol.for("react.default_value"),Ba=Symbol.iterator;function Ca(a){if(null===a||"object"!==typeof a)return null;a=Ba&&a[Ba]||a["@@iterator"];return"function"===typeof a?a:null}var Da=ia(null),Ea=ia(null),Fa=ia(null); diff --git a/packages/next/src/compiled/react-experimental/cjs/react-jsx-dev-runtime.development.js b/packages/next/src/compiled/react-experimental/cjs/react-jsx-dev-runtime.development.js index 8fcab4f2602e1..b7fbf53834137 100644 --- a/packages/next/src/compiled/react-experimental/cjs/react-jsx-dev-runtime.development.js +++ b/packages/next/src/compiled/react-experimental/cjs/react-jsx-dev-runtime.development.js @@ -14,7 +14,7 @@ if (process.env.NODE_ENV !== "production") { (function() { 'use strict'; -var React = require('react'); +var React = require("next/dist/compiled/react-experimental"); // ATTENTION // When adding new symbols to this file, diff --git a/packages/next/src/compiled/react-experimental/cjs/react-jsx-runtime.development.js b/packages/next/src/compiled/react-experimental/cjs/react-jsx-runtime.development.js index d5d0bb7693f96..cbc97be6bbc73 100644 --- a/packages/next/src/compiled/react-experimental/cjs/react-jsx-runtime.development.js +++ b/packages/next/src/compiled/react-experimental/cjs/react-jsx-runtime.development.js @@ -14,7 +14,7 @@ if (process.env.NODE_ENV !== "production") { (function() { 'use strict'; -var React = require('react'); +var React = require("next/dist/compiled/react-experimental"); // ATTENTION // When adding new symbols to this file, diff --git a/packages/next/src/compiled/react-experimental/cjs/react-jsx-runtime.production.min.js b/packages/next/src/compiled/react-experimental/cjs/react-jsx-runtime.production.min.js index 3ecb2350b3e55..789512436d200 100644 --- a/packages/next/src/compiled/react-experimental/cjs/react-jsx-runtime.production.min.js +++ b/packages/next/src/compiled/react-experimental/cjs/react-jsx-runtime.production.min.js @@ -7,5 +7,5 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -'use strict';var f=require("react"),k=Symbol.for("react.element"),l=Symbol.for("react.fragment"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0}; +'use strict';var f=require("next/dist/compiled/react-experimental"),k=Symbol.for("react.element"),l=Symbol.for("react.fragment"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0}; function q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=""+g);void 0!==a.key&&(e=""+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q; diff --git a/packages/next/src/compiled/react-experimental/cjs/react-jsx-runtime.profiling.min.js b/packages/next/src/compiled/react-experimental/cjs/react-jsx-runtime.profiling.min.js index b875a84b3d090..5aeb73baa6743 100644 --- a/packages/next/src/compiled/react-experimental/cjs/react-jsx-runtime.profiling.min.js +++ b/packages/next/src/compiled/react-experimental/cjs/react-jsx-runtime.profiling.min.js @@ -7,5 +7,5 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -'use strict';var f=require("react"),k=Symbol.for("react.element"),l=Symbol.for("react.fragment"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0}; +'use strict';var f=require("next/dist/compiled/react-experimental"),k=Symbol.for("react.element"),l=Symbol.for("react.fragment"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0}; function q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=""+g);void 0!==a.key&&(e=""+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q; diff --git a/packages/next/src/compiled/react/cjs/react-jsx-dev-runtime.development.js b/packages/next/src/compiled/react/cjs/react-jsx-dev-runtime.development.js index 05e5bedbfad47..9d4d9fe8f9768 100644 --- a/packages/next/src/compiled/react/cjs/react-jsx-dev-runtime.development.js +++ b/packages/next/src/compiled/react/cjs/react-jsx-dev-runtime.development.js @@ -14,7 +14,7 @@ if (process.env.NODE_ENV !== "production") { (function() { 'use strict'; -var React = require('react'); +var React = require("next/dist/compiled/react"); // ATTENTION // When adding new symbols to this file, diff --git a/packages/next/src/compiled/react/cjs/react-jsx-runtime.development.js b/packages/next/src/compiled/react/cjs/react-jsx-runtime.development.js index ba3757094e39a..9c7bd16ccdb47 100644 --- a/packages/next/src/compiled/react/cjs/react-jsx-runtime.development.js +++ b/packages/next/src/compiled/react/cjs/react-jsx-runtime.development.js @@ -14,7 +14,7 @@ if (process.env.NODE_ENV !== "production") { (function() { 'use strict'; -var React = require('react'); +var React = require("next/dist/compiled/react"); // ATTENTION // When adding new symbols to this file, diff --git a/packages/next/src/compiled/react/cjs/react-jsx-runtime.production.min.js b/packages/next/src/compiled/react/cjs/react-jsx-runtime.production.min.js index 3ecb2350b3e55..2c15ab3ac1155 100644 --- a/packages/next/src/compiled/react/cjs/react-jsx-runtime.production.min.js +++ b/packages/next/src/compiled/react/cjs/react-jsx-runtime.production.min.js @@ -7,5 +7,5 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -'use strict';var f=require("react"),k=Symbol.for("react.element"),l=Symbol.for("react.fragment"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0}; +'use strict';var f=require("next/dist/compiled/react"),k=Symbol.for("react.element"),l=Symbol.for("react.fragment"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0}; function q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=""+g);void 0!==a.key&&(e=""+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q; diff --git a/packages/next/src/compiled/react/cjs/react-jsx-runtime.profiling.min.js b/packages/next/src/compiled/react/cjs/react-jsx-runtime.profiling.min.js index b875a84b3d090..5936004d767cc 100644 --- a/packages/next/src/compiled/react/cjs/react-jsx-runtime.profiling.min.js +++ b/packages/next/src/compiled/react/cjs/react-jsx-runtime.profiling.min.js @@ -7,5 +7,5 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -'use strict';var f=require("react"),k=Symbol.for("react.element"),l=Symbol.for("react.fragment"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0}; +'use strict';var f=require("next/dist/compiled/react"),k=Symbol.for("react.element"),l=Symbol.for("react.fragment"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0}; function q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=""+g);void 0!==a.key&&(e=""+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q; diff --git a/packages/next/taskfile.js b/packages/next/taskfile.js index 6ffeab4bca47c..e3f48df430664 100644 --- a/packages/next/taskfile.js +++ b/packages/next/taskfile.js @@ -1738,14 +1738,14 @@ export async function copy_vendor_react(task_) { yield task .source(join(reactDir, 'cjs/**/*.js')) // eslint-disable-next-line require-yield - // .run({ every: true }, function* (file) { - // const source = file.data.toString() - // // We replace the module/chunk loading code with our own implementation in Next.js. - // file.data = source.replace( - // /require\(["']react["']\)/g, - // `require("next/dist/compiled/react${packageSuffix}")` - // ) - // }) + .run({ every: true }, function* (file) { + const source = file.data.toString() + // We replace the module/chunk loading code with our own implementation in Next.js. + file.data = source.replace( + /require\(["']react["']\)/g, + `require("next/dist/compiled/react${packageSuffix}")` + ) + }) .target(`src/compiled/react${packageSuffix}/cjs`) yield task @@ -1766,14 +1766,15 @@ export async function copy_vendor_react(task_) { .run({ every: true }, function* (file) { const source = file.data.toString() // We replace the module/chunk loading code with our own implementation in Next.js. - file.data = source.replace( - /require\(["']scheduler["']\)/g, - `require("next/dist/compiled/scheduler${packageSuffix}")` - ) - // .replace( - // /require\(["']react["']\)/g, - // `require("next/dist/compiled/react${packageSuffix}")` - // ) + file.data = source + .replace( + /require\(["']scheduler["']\)/g, + `require("next/dist/compiled/scheduler${packageSuffix}")` + ) + .replace( + /require\(["']react["']\)/g, + `require("next/dist/compiled/react${packageSuffix}")` + ) // Note that we don't replace `react-dom` with `next/dist/compiled/react-dom` // as it mighe be aliased to the server rendering stub. From 1cd252d1b7b527685bcdf7aaf78144107fb0df0a Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Fri, 15 Sep 2023 11:24:23 +0200 Subject: [PATCH 30/48] fix import mappings --- .../crates/next-core/src/next_import_map.rs | 13 ++++++++----- .../crates/next-core/src/next_shared/resolve.rs | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/next-swc/crates/next-core/src/next_import_map.rs b/packages/next-swc/crates/next-core/src/next_import_map.rs index 2f66186513f23..d2d23adb208a1 100644 --- a/packages/next-swc/crates/next-core/src/next_import_map.rs +++ b/packages/next-swc/crates/next-core/src/next_import_map.rs @@ -482,26 +482,29 @@ async fn insert_next_server_special_aliases( ), ); import_map.insert_exact_alias( - "react-server-dom-webpack/server.edge", + "react-server-dom-webpack/client.edge", request_to_import_mapping( app_dir, "next/dist/server/future/route-modules/app-page/vendored/ssr/\ - react-server-dom-webpack-server-edge", + react-server-dom-webpack-client-edge", ), ); + // some code also imports react-server-dom-webpack/client on the server + // it should never run so it's fine to just point it to the same place as + // react-server-dom-webpack/client.edge import_map.insert_exact_alias( - "react-server-dom-webpack/server.node", + "react-server-dom-webpack/client", request_to_import_mapping( app_dir, "next/dist/server/future/route-modules/app-page/vendored/ssr/\ - react-server-dom-webpack-server-node", + react-server-dom-webpack-client-edge", ), ); // not essential but we're providing this alias for people who might use it. // A note here is that this will point toward the ReactDOMServer on the SSR // layer TODO: add the rests import_map.insert_exact_alias( - "react-dom/server.edge", + "react-dom/server", request_to_import_mapping( app_dir, "next/dist/server/future/route-modules/app-page/vendored/ssr/\ diff --git a/packages/next-swc/crates/next-core/src/next_shared/resolve.rs b/packages/next-swc/crates/next-core/src/next_shared/resolve.rs index 97f733212e390..e9d42999703cd 100644 --- a/packages/next-swc/crates/next-core/src/next_shared/resolve.rs +++ b/packages/next-swc/crates/next-core/src/next_shared/resolve.rs @@ -186,7 +186,7 @@ impl ResolvePlugin for NextNodeSharedRuntimeResolvePlugin { let stem = stem.replace(".shared-runtime", ""); let resource_request = format!( - "next/dist/server/future/route-modules/{}/vendored/contexts/{}", + "next/dist/server/future/route-modules/{}/vendored/contexts/{}.js", match self.context { ServerContextType::Pages { .. } => "pages", ServerContextType::AppRoute { .. } => "app-route", From dab2ad16cb00d2a16bfef074950f1d91bceeb258 Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Fri, 15 Sep 2023 11:51:30 +0200 Subject: [PATCH 31/48] fix contexts load in turbo --- packages/next/webpack.config.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/next/webpack.config.js b/packages/next/webpack.config.js index 3712127d09e37..d03ff0cfb52ec 100644 --- a/packages/next/webpack.config.js +++ b/packages/next/webpack.config.js @@ -100,10 +100,7 @@ const bundleTypes = { module.exports = ({ dev, turbo, bundleType, experimental }) => { const externalHandler = ({ context, request, getResolve }, callback) => { ;(async () => { - if ( - (turbo && request.endsWith('.shared-runtime')) || - request.endsWith('.external') - ) { + if (request.endsWith('.external')) { const resolve = getResolve() const resolved = await resolve(context, request) const relative = path.relative( From 99caa9ef981a849da6b962248e0a8ef4f25fa839 Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Fri, 15 Sep 2023 13:21:19 +0200 Subject: [PATCH 32/48] fix edge --- .../crates/next-core/src/next_import_map.rs | 139 +++++++++++++++--- 1 file changed, 115 insertions(+), 24 deletions(-) diff --git a/packages/next-swc/crates/next-core/src/next_import_map.rs b/packages/next-swc/crates/next-core/src/next_import_map.rs index d2d23adb208a1..580dd6c9edcee 100644 --- a/packages/next-swc/crates/next-core/src/next_import_map.rs +++ b/packages/next-swc/crates/next-core/src/next_import_map.rs @@ -455,38 +455,65 @@ async fn insert_next_server_special_aliases( "react/jsx-runtime", request_to_import_mapping( app_dir, - "next/dist/server/future/route-modules/app-page/vendored/shared/\ - react-jsx-runtime", + match runtime { + NextRuntime::Edge => "next/dist/compiled/react/jsx-runtime", + NextRuntime::NodeJs => { + "next/dist/server/future/route-modules/app-page/vendored/shared/\ + react-jsx-runtime" + } + }, ), ); import_map.insert_exact_alias( "react/jsx-dev-runtime", request_to_import_mapping( app_dir, - "next/dist/server/future/route-modules/app-page/vendored/shared/\ - react-jsx-dev-runtime", + match runtime { + NextRuntime::Edge => "next/dist/compiled/react/jsx-dev-runtime", + NextRuntime::NodeJs => { + "next/dist/server/future/route-modules/app-page/vendored/shared/\ + react-jsx-dev-runtime" + } + }, ), ); import_map.insert_exact_alias( "react", request_to_import_mapping( app_dir, - "next/dist/server/future/route-modules/app-page/vendored/ssr/react", + match runtime { + NextRuntime::Edge => "next/dist/compiled/react", + NextRuntime::NodeJs => { + "next/dist/server/future/route-modules/app-page/vendored/ssr/react" + } + }, ), ); import_map.insert_exact_alias( "react-dom", request_to_import_mapping( app_dir, - "next/dist/server/future/route-modules/app-page/vendored/ssr/react-dom", + match runtime { + NextRuntime::Edge => "next/dist/compiled/react-dom", + NextRuntime::NodeJs => { + "next/dist/server/future/route-modules/app-page/vendored/ssr/react-dom" + } + }, ), ); import_map.insert_exact_alias( "react-server-dom-webpack/client.edge", request_to_import_mapping( app_dir, - "next/dist/server/future/route-modules/app-page/vendored/ssr/\ - react-server-dom-webpack-client-edge", + match runtime { + NextRuntime::Edge => { + "next/dist/compiled/react-server-dom-webpack/client.edge" + } + NextRuntime::NodeJs => { + "next/dist/server/future/route-modules/app-page/vendored/ssr/\ + react-server-dom-webpack-client-edge" + } + }, ), ); // some code also imports react-server-dom-webpack/client on the server @@ -496,8 +523,15 @@ async fn insert_next_server_special_aliases( "react-server-dom-webpack/client", request_to_import_mapping( app_dir, - "next/dist/server/future/route-modules/app-page/vendored/ssr/\ - react-server-dom-webpack-client-edge", + match runtime { + NextRuntime::Edge => { + "next/dist/compiled/react-server-dom-webpack/client.edge" + } + NextRuntime::NodeJs => { + "next/dist/server/future/route-modules/app-page/vendored/ssr/\ + react-server-dom-webpack-client-edge" + } + }, ), ); // not essential but we're providing this alias for people who might use it. @@ -507,8 +541,26 @@ async fn insert_next_server_special_aliases( "react-dom/server", request_to_import_mapping( app_dir, - "next/dist/server/future/route-modules/app-page/vendored/ssr/\ - react-dom-server-edge", + match runtime { + NextRuntime::Edge => "next/dist/compiled/react-dom/server.edge", + NextRuntime::NodeJs => { + "next/dist/server/future/route-modules/app-page/vendored/ssr/\ + react-dom-server-edge" + } + }, + ), + ); + import_map.insert_exact_alias( + "react-dom/server.edge", + request_to_import_mapping( + app_dir, + match runtime { + NextRuntime::Edge => "next/dist/compiled/react-dom/server.edge", + NextRuntime::NodeJs => { + "next/dist/server/future/route-modules/app-page/vendored/ssr/\ + react-dom-server-edge" + } + }, ), ); } @@ -527,46 +579,80 @@ async fn insert_next_server_special_aliases( "react/jsx-runtime", request_to_import_mapping( app_dir, - "next/dist/server/future/route-modules/app-page/vendored/shared/\ - react-jsx-runtime", + match runtime { + NextRuntime::Edge => "next/dist/compiled/react/jsx-runtime", + NextRuntime::NodeJs => { + "next/dist/server/future/route-modules/app-page/vendored/shared/\ + react-jsx-runtime" + } + }, ), ); import_map.insert_exact_alias( "react/jsx-dev-runtime", request_to_import_mapping( app_dir, - "next/dist/server/future/route-modules/app-page/vendored/shared/\ - react-jsx-dev-runtime", + match runtime { + NextRuntime::Edge => "next/dist/compiled/react/jsx-dev-runtime", + NextRuntime::NodeJs => { + "next/dist/server/future/route-modules/app-page/vendored/shared/\ + react-jsx-dev-runtime" + } + }, ), ); import_map.insert_exact_alias( "react", request_to_import_mapping( app_dir, - "next/dist/server/future/route-modules/app-page/vendored/rsc/react", + match runtime { + NextRuntime::Edge => "next/dist/compiled/react", + NextRuntime::NodeJs => { + "next/dist/server/future/route-modules/app-page/vendored/rsc/react" + } + }, ), ); import_map.insert_exact_alias( "react-dom", request_to_import_mapping( app_dir, - "next/dist/server/future/route-modules/app-page/vendored/rsc/react-dom", + match runtime { + NextRuntime::Edge => "next/dist/compiled/react-dom", + NextRuntime::NodeJs => { + "next/dist/server/future/route-modules/app-page/vendored/rsc/react-dom" + } + }, ), ); import_map.insert_exact_alias( "react-server-dom-webpack/server.edge", request_to_import_mapping( app_dir, - "next/dist/server/future/route-modules/app-page/vendored/rsc/\ - react-server-dom-webpack-server-edge", + match runtime { + NextRuntime::Edge => { + "next/dist/compiled/react-server-dom-webpack/server.edge" + } + NextRuntime::NodeJs => { + "next/dist/server/future/route-modules/app-page/vendored/rsc/\ + react-server-dom-webpack-server-edge" + } + }, ), ); import_map.insert_exact_alias( "react-server-dom-webpack/server.node", request_to_import_mapping( app_dir, - "next/dist/server/future/route-modules/app-page/vendored/rsc/\ - react-server-dom-webpack-server-node", + match runtime { + NextRuntime::Edge => { + "next/dist/compiled/react-server-dom-webpack/server.edge" + } + NextRuntime::NodeJs => { + "next/dist/server/future/route-modules/app-page/vendored/rsc/\ + react-server-dom-webpack-server-node" + } + }, ), ); // not essential but we're providing this alias for people who might use it. @@ -576,8 +662,13 @@ async fn insert_next_server_special_aliases( "react-dom/server.edge", request_to_import_mapping( app_dir, - "next/dist/server/future/route-modules/app-page/vendored/ssr/\ - react-dom-server-edge", + match runtime { + NextRuntime::Edge => "next/dist/compiled/react-dom/server.edge", + NextRuntime::NodeJs => { + "next/dist/server/future/route-modules/app-page/vendored/ssr/\ + react-dom-server-edge" + } + }, ), ); } From 615a8d6524147e94683240efc3b454e38076788b Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Fri, 15 Sep 2023 14:26:12 +0200 Subject: [PATCH 33/48] fix typo in import map --- packages/next-swc/crates/next-core/src/next_import_map.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next-swc/crates/next-core/src/next_import_map.rs b/packages/next-swc/crates/next-core/src/next_import_map.rs index 580dd6c9edcee..32408c8aed06a 100644 --- a/packages/next-swc/crates/next-core/src/next_import_map.rs +++ b/packages/next-swc/crates/next-core/src/next_import_map.rs @@ -646,7 +646,7 @@ async fn insert_next_server_special_aliases( app_dir, match runtime { NextRuntime::Edge => { - "next/dist/compiled/react-server-dom-webpack/server.edge" + "next/dist/compiled/react-server-dom-webpack/server.node" } NextRuntime::NodeJs => { "next/dist/server/future/route-modules/app-page/vendored/rsc/\ From 0673756da64c589aec72fc0ba6d8a99980f9cbc5 Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Fri, 15 Sep 2023 14:34:16 +0200 Subject: [PATCH 34/48] move worker env init higher --- packages/next/src/export/worker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/src/export/worker.ts b/packages/next/src/export/worker.ts index 6e48280dbc20c..7f2429cb5b19e 100644 --- a/packages/next/src/export/worker.ts +++ b/packages/next/src/export/worker.ts @@ -13,6 +13,7 @@ import type { OutgoingHttpHeaders } from 'http' // Polyfill fetch for the export worker. import '../server/node-polyfill-fetch' import '../server/node-environment' +process.env.NEXT_IS_EXPORT_WORKER = 'true' import { extname, join, dirname, sep, posix } from 'path' import fs, { promises } from 'fs' @@ -167,7 +168,6 @@ export default async function exportPage({ } try { - process.env.NEXT_IS_EXPORT_WORKER = 'true' if (renderOpts.deploymentId) { process.env.NEXT_DEPLOYMENT_ID = renderOpts.deploymentId } From 22375235e677e18658333133586e4d83b69973d3 Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Fri, 15 Sep 2023 14:41:16 +0200 Subject: [PATCH 35/48] fix worker runtime usage --- packages/next/src/export/worker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/src/export/worker.ts b/packages/next/src/export/worker.ts index 7f2429cb5b19e..7329d10687fe0 100644 --- a/packages/next/src/export/worker.ts +++ b/packages/next/src/export/worker.ts @@ -412,7 +412,7 @@ export default async function exportPage({ // functions during runtime just for prefetching const { renderToHTMLOrFlight } = - require('../server/app-render/app-render') as typeof import('../server/app-render/app-render') + require('../server/future/route-modules/app-page/module.compiled') as typeof import('../server/app-render/app-render') req.headers[RSC.toLowerCase()] = '1' req.headers[NEXT_URL.toLowerCase()] = path req.headers[NEXT_ROUTER_PREFETCH.toLowerCase()] = '1' From a927bca1978eb2d5ad5da56137b0cc2932b0162e Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Fri, 15 Sep 2023 14:57:14 +0200 Subject: [PATCH 36/48] try to disable wildcard rule --- packages/next-swc/crates/next-core/src/next_import_map.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/next-swc/crates/next-core/src/next_import_map.rs b/packages/next-swc/crates/next-core/src/next_import_map.rs index 32408c8aed06a..751a72c408041 100644 --- a/packages/next-swc/crates/next-core/src/next_import_map.rs +++ b/packages/next-swc/crates/next-core/src/next_import_map.rs @@ -247,8 +247,9 @@ pub async fn get_next_server_import_map( | ServerContextType::AppRoute { .. } => { match mode { NextMode::Build => { - import_map.insert_wildcard_alias("next/dist/server/", external); - import_map.insert_wildcard_alias("next/dist/shared/", external); + // import_map.insert_wildcard_alias("next/dist/server/", + // external); import_map. + // insert_wildcard_alias("next/dist/shared/", external); } NextMode::DevServer => { // The sandbox can't be bundled and needs to be external From 6b047480a93638be0a1f8586e0d4ac440f4ac77e Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Fri, 15 Sep 2023 15:07:01 +0200 Subject: [PATCH 37/48] fix hmr --- .../nextjs-require-cache-hot-reloader.ts | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/packages/next/src/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts b/packages/next/src/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts index ebcf1d78452c9..e12979ae43643 100644 --- a/packages/next/src/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts +++ b/packages/next/src/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts @@ -12,10 +12,7 @@ const originModules = [ require.resolve('../../../server/require'), require.resolve('../../../server/load-components'), require.resolve('../../../server/next-server'), - // require.resolve('../../../compiled/react-server-dom-webpack/client.edge'), - // require.resolve( - // '../../../compiled/react-server-dom-webpack-experimental/client.edge' - // ), + require.resolve('next/dist/compiled/next-server/app-page.runtime.dev.js'), ] const RUNTIME_NAMES = ['webpack-runtime', 'webpack-api-runtime'] @@ -49,16 +46,17 @@ function deleteFromRequireCache(filePath: string) { export function deleteAppClientCache() { // ensure we reset the cache for rsc components // loaded via react-server-dom-webpack - // const reactServerDomModId = require.resolve( - // 'react-server-dom-webpack/client.edge' - // ) - // const reactServerDomMod = require.cache[reactServerDomModId] - // if (reactServerDomMod) { - // for (const child of [...reactServerDomMod.children]) { - // deleteFromRequireCache(child.id) - // } - // deleteFromRequireCache(reactServerDomModId) - // } + const reactServerDomModId = require.resolve( + 'next/dist/compiled/next-server/app-page.runtime.dev.js' + ) + + const reactServerDomMod = require.cache[reactServerDomModId] + if (reactServerDomMod) { + for (const child of [...reactServerDomMod.children]) { + deleteFromRequireCache(child.id) + } + deleteFromRequireCache(reactServerDomModId) + } } export function deleteCache(filePath: string) { @@ -106,7 +104,7 @@ export class NextJsRequireCacheHotReloader implements WebpackPluginInstance { }) if (hasAppEntry) { - // deleteAppClientCache() + deleteAppClientCache() } for (const page of entries) { From 827bb430ba785a6e02efcbc2b6df085b7c12ff75 Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Fri, 15 Sep 2023 15:24:14 +0200 Subject: [PATCH 38/48] clean up --- packages/next/src/build/webpack-config.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/packages/next/src/build/webpack-config.ts b/packages/next/src/build/webpack-config.ts index c7990f242ab15..403cc767304d6 100644 --- a/packages/next/src/build/webpack-config.ts +++ b/packages/next/src/build/webpack-config.ts @@ -107,18 +107,9 @@ const asyncStoragesRegex = const pathSeparators = '[/\\\\]' const optionalEsmPart = `((${pathSeparators}esm)?${pathSeparators})` -const sharedRuntimeFileEnd = '(\\.shared-runtime(\\.js)?)$' const externalFileEnd = '(\\.external(\\.js)?)$' const nextDist = `next${pathSeparators}dist` -const genericRuntimeFileEnd = '(\\.[\\w-]+\\.runtime\\.[\\w-]+(\\.js)?)$' -const genericRuntimePattern = new RegExp( - `${nextDist}.*${genericRuntimeFileEnd}` -) - -const sharedRuntimePattern = new RegExp( - `${nextDist}${optionalEsmPart}.*${sharedRuntimeFileEnd}` -) const externalPattern = new RegExp( `${nextDist}${optionalEsmPart}.*${externalFileEnd}` ) @@ -775,7 +766,6 @@ export async function loadProjectInfo({ const UNSAFE_CACHE_REGEX = /[\\/]pages[\\/][^\\/]+(?:$|\?|#)/ -let count = 0 export default async function getBaseWebpackConfig( dir: string, { From 187488393d7f1b83b4fc5a48d624a577c866d145 Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Fri, 15 Sep 2023 15:26:46 +0200 Subject: [PATCH 39/48] fix HMR --- .../nextjs-require-cache-hot-reloader.ts | 25 ++++++------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/packages/next/src/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts b/packages/next/src/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts index e12979ae43643..a0571642b82db 100644 --- a/packages/next/src/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts +++ b/packages/next/src/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts @@ -13,6 +13,9 @@ const originModules = [ require.resolve('../../../server/load-components'), require.resolve('../../../server/next-server'), require.resolve('next/dist/compiled/next-server/app-page.runtime.dev.js'), + require.resolve('next/dist/compiled/next-server/app-route.runtime.dev.js'), + require.resolve('next/dist/compiled/next-server/pages.runtime.dev.js'), + require.resolve('next/dist/compiled/next-server/pages-api.runtime.dev.js'), ] const RUNTIME_NAMES = ['webpack-runtime', 'webpack-api-runtime'] @@ -43,22 +46,6 @@ function deleteFromRequireCache(filePath: string) { return false } -export function deleteAppClientCache() { - // ensure we reset the cache for rsc components - // loaded via react-server-dom-webpack - const reactServerDomModId = require.resolve( - 'next/dist/compiled/next-server/app-page.runtime.dev.js' - ) - - const reactServerDomMod = require.cache[reactServerDomModId] - if (reactServerDomMod) { - for (const child of [...reactServerDomMod.children]) { - deleteFromRequireCache(child.id) - } - deleteFromRequireCache(reactServerDomModId) - } -} - export function deleteCache(filePath: string) { // try to clear it from the fs cache clearManifestCache(filePath) @@ -104,7 +91,11 @@ export class NextJsRequireCacheHotReloader implements WebpackPluginInstance { }) if (hasAppEntry) { - deleteAppClientCache() + deleteFromRequireCache( + require.resolve( + 'next/dist/compiled/next-server/app-page.runtime.dev.js' + ) + ) } for (const page of entries) { From 65d43d64cb3bafa1f1ff51cb82fecad1de59d375 Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Fri, 15 Sep 2023 15:38:47 +0200 Subject: [PATCH 40/48] big cleanup --- .../crates/next-core/src/next_import_map.rs | 9 +- packages/next/src/build/index.ts | 12 +- packages/next/src/build/webpack-config.ts | 117 +----------------- .../nextjs-require-cache-hot-reloader.ts | 12 +- .../app-page/vendored/rsc/entrypoints.ts | 14 --- .../app-page/vendored/ssr/entrypoints.ts | 14 --- packages/next/src/server/import-overrides.ts | 66 ---------- packages/next/src/server/require-hook.js | 3 - 8 files changed, 11 insertions(+), 236 deletions(-) diff --git a/packages/next-swc/crates/next-core/src/next_import_map.rs b/packages/next-swc/crates/next-core/src/next_import_map.rs index 751a72c408041..adbd6b55f4d63 100644 --- a/packages/next-swc/crates/next-core/src/next_import_map.rs +++ b/packages/next-swc/crates/next-core/src/next_import_map.rs @@ -246,11 +246,7 @@ pub async fn get_next_server_import_map( | ServerContextType::AppRSC { .. } | ServerContextType::AppRoute { .. } => { match mode { - NextMode::Build => { - // import_map.insert_wildcard_alias("next/dist/server/", - // external); import_map. - // insert_wildcard_alias("next/dist/shared/", external); - } + NextMode::Build => {} NextMode::DevServer => { // The sandbox can't be bundled and needs to be external import_map.insert_exact_alias("next/dist/server/web/sandbox", external); @@ -432,8 +428,7 @@ async fn insert_next_server_special_aliases( ); } (_, ServerContextType::PagesData { .. }) => {} - // In development, we *always* use the bundled version of React, even in - // SSR, since we're bundling Next.js alongside it. + // the logic closely follows the one in createRSCAliases in webpack-config.ts ( NextMode::DevServer | NextMode::Build | NextMode::Development, ServerContextType::AppSSR { app_dir }, diff --git a/packages/next/src/build/index.ts b/packages/next/src/build/index.ts index 80e97e1440d7e..c666f629a5a38 100644 --- a/packages/next/src/build/index.ts +++ b/packages/next/src/build/index.ts @@ -147,11 +147,7 @@ import { startTypeChecking } from './type-check' import { generateInterceptionRoutesRewrites } from '../lib/generate-interception-routes-rewrites' import { buildDataRoute } from '../server/lib/router-utils/build-data-route' -import { - // baseOverrides, - defaultOverrides, - // experimentalOverrides, -} from '../server/import-overrides' +import { defaultOverrides } from '../server/import-overrides' import { initialize as initializeIncrementalCache } from '../server/lib/incremental-cache-server' import { nodeFs } from '../server/lib/node-fs-methods' import { getEsmLoaderPath } from '../server/lib/get-esm-loader-path' @@ -2100,12 +2096,6 @@ export default async function build( ) const sharedEntriesSet = [ - // ...Object.values(baseOverrides).map((override) => - // require.resolve(override) - // ), - // ...Object.values(experimentalOverrides).map((override) => - // require.resolve(override) - // ), ...(config.experimental.turbotrace ? [] : Object.keys(defaultOverrides).map((value) => diff --git a/packages/next/src/build/webpack-config.ts b/packages/next/src/build/webpack-config.ts index 403cc767304d6..54da2a5a36cb4 100644 --- a/packages/next/src/build/webpack-config.ts +++ b/packages/next/src/build/webpack-config.ts @@ -453,20 +453,11 @@ function createRSCAliases( 'react$' ] = `next/dist/compiled/react${bundledReactChannel}/react.shared-subset` } - // alias[ - // 'react$' - // ] = `next/dist/server/future/route-modules/app-page/vendored/react-shared-subset` - // } - // Use server rendering stub for RSC + // Use server rendering stub for RSC and SSR // x-ref: https://github.com/facebook/react/pull/25436 - // if (opts.reactDomServerRenderingStub) { alias[ 'react-dom$' ] = `next/dist/compiled/react-dom${bundledReactChannel}/server-rendering-stub` - // alias[ - // 'react-dom$' - // ] = `next/dist/server/future/route-modules/app-page/vendored/react-server-rendering-stub` - // } } // Alias `server-only` and `client-only` modules to their server/client only, vendored versions. @@ -1177,17 +1168,6 @@ export default async function getBaseWebpackConfig( '@opentelemetry/api': 'next/dist/compiled/@opentelemetry/api', }), - // ...(hasAppDir - // ? createRSCAliases(bundledReactChannel, { - // // reactSharedSubset: false, - // // reactDomServerRenderingStub: false, - // reactProductionProfiling, - // // browser: true, - // layer: 'app-pages-browser', - // isEdgeServer, - // }) - // : {}), - ...(config.images.loaderFile ? { 'next/dist/shared/lib/image-loader': config.images.loaderFile, @@ -1400,28 +1380,6 @@ export default async function getBaseWebpackConfig( ] as WebpackLayerName[] ).includes(layer!) - // if ( - // request === 'react/jsx-dev-runtime' || - // request === 'react/jsx-runtime' - // ) { - // if (isAppLayer) { - // return `commonjs next/dist/compiled/${request.replace( - // 'react', - // 'react' + bundledReactChannel - // )}` - // } - // return - // } - - // Special internal modules that must be bundled for Server Components. - // if (layer === WEBPACK_LAYERS.reactServerComponents) { - // // React needs to be bundled for Server Components so the special - // // `react-server` export condition can be used. - // if (reactPackagesRegex.test(request)) { - // return - // } - // } - // Relative requires don't need custom resolution, because they // are relative to requests we've already resolved here. // Absolute requires (require('/foo')) are extremely uncommon, but @@ -1432,24 +1390,6 @@ export default async function getBaseWebpackConfig( } if (reactPackagesRegex.test(request) && !isAppLayer) { - // override react-dom to server-rendering-stub for server - // if ( - // request === 'react-dom' && - // (layer === WEBPACK_LAYERS.serverSideRendering || - // layer === WEBPACK_LAYERS.reactServerComponents || - // layer === WEBPACK_LAYERS.actionBrowser) - // ) { - // request = `next/dist/compiled/react-dom${bundledReactChannel}/server-rendering-stub` - // } else if (isAppLayer) { - // request = - // 'next/dist/compiled/' + - // request.replace( - // /^(react-server-dom-webpack|react-dom|react)/, - // (name) => { - // return name + bundledReactChannel - // } - // ) - // } return `commonjs ${request}` } @@ -1494,43 +1434,6 @@ export default async function getBaseWebpackConfig( // otherwise NFT will get tripped up return `commonjs ${localRes.replace(/.*?next[/\\]dist/, 'next/dist')}` } - // if the file ends with .shared-runtime, we need to make it point to the correct bundle depending on the layer - // this is because each shared-runtime files are unique per bundle, so if you use app-router context in pages, - // it'll be a different instance than the one used in the app-router runtime. - // const isSharedRuntime = sharedRuntimePattern.test(localRes) - // if (isSharedRuntime) { - // // if (dev) { - // // return `commonjs ${localRes}` - // // } - - // const name = path.parse(localRes).name.replace('.shared-runtime', '') - - // const camelCaseName = name.replace(/-([a-z])/g, (_, w) => - // w.toUpperCase() - // ) - - // // there's no externals for API routes but if need be, they'll need to be added here and have - // // their own layer - // const runtime = - // layer === 'app-route-handler' - // ? 'app-route' - // : isAppLayer - // ? 'app-page' - // : 'pages' - // return [ - // 'commonjs ' + - // path.posix.join( - // 'next', - // 'dist', - // 'compiled', - // 'next-server', - // `${runtime}.runtime.${dev ? 'dev' : 'prod'}` - // ), - // 'default', - // 'sharedModules', - // camelCaseName, - // ] - // } } // Don't bundle @vercel/og nodejs bundle for nodejs runtime. @@ -1575,15 +1478,6 @@ export default async function getBaseWebpackConfig( // Treat react packages and next internals as external for SSR layer, // also map react to builtin ones with require-hook. if (layer === WEBPACK_LAYERS.serverSideRendering) { - // if (reactPackagesRegex.test(request)) { - // return `commonjs next/dist/compiled/${request.replace( - // /^(react-server-dom-webpack|react-dom|react)/, - // (name) => { - // return name + bundledReactChannel - // } - // )}` - // } - const isRelative = request.startsWith('.') const fullRequest = isRelative ? path.join(context, request).replace(/\\/g, '/') @@ -2210,12 +2104,9 @@ export default async function getBaseWebpackConfig( // react to the direct file path, not the package name. In that case the condition // will be ignored completely. alias: createRSCAliases(bundledReactChannel, { - // reactSharedSubset: true, - // reactDomServerRenderingStub: true, reactServerCondition: true, // No server components profiling reactProductionProfiling, - // browser: false, layer: WEBPACK_LAYERS.reactServerComponents, isEdgeServer, }), @@ -2276,11 +2167,8 @@ export default async function getBaseWebpackConfig( // It needs `conditionNames` here to require the proper asset, // when react is acting as dependency of compiled/react-dom. alias: createRSCAliases(bundledReactChannel, { - // reactSharedSubset: true, - // reactDomServerRenderingStub: true, reactServerCondition: true, reactProductionProfiling, - // browser: false, layer: WEBPACK_LAYERS.reactServerComponents, isEdgeServer, }), @@ -2291,11 +2179,8 @@ export default async function getBaseWebpackConfig( issuerLayer: WEBPACK_LAYERS.serverSideRendering, resolve: { alias: createRSCAliases(bundledReactChannel, { - // reactSharedSubset: false, - // reactDomServerRenderingStub: true, reactServerCondition: false, reactProductionProfiling, - // browser: true, layer: WEBPACK_LAYERS.serverSideRendering, isEdgeServer, }), diff --git a/packages/next/src/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts b/packages/next/src/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts index a0571642b82db..349a3af2c4d73 100644 --- a/packages/next/src/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts +++ b/packages/next/src/build/webpack/plugins/nextjs-require-cache-hot-reloader.ts @@ -46,6 +46,12 @@ function deleteFromRequireCache(filePath: string) { return false } +export function deleteAppClientCache() { + deleteFromRequireCache( + require.resolve('next/dist/compiled/next-server/app-page.runtime.dev.js') + ) +} + export function deleteCache(filePath: string) { // try to clear it from the fs cache clearManifestCache(filePath) @@ -91,11 +97,7 @@ export class NextJsRequireCacheHotReloader implements WebpackPluginInstance { }) if (hasAppEntry) { - deleteFromRequireCache( - require.resolve( - 'next/dist/compiled/next-server/app-page.runtime.dev.js' - ) - ) + deleteAppClientCache() } for (const page of entries) { diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/rsc/entrypoints.ts b/packages/next/src/server/future/route-modules/app-page/vendored/rsc/entrypoints.ts index f0c93e41a5b53..1d1273b91e610 100644 --- a/packages/next/src/server/future/route-modules/app-page/vendored/rsc/entrypoints.ts +++ b/packages/next/src/server/future/route-modules/app-page/vendored/rsc/entrypoints.ts @@ -1,17 +1,3 @@ -// module.exports = { -// React: require('react'), -// ReactDOM: require('react-dom/server-rendering-stub'), - -// // TODO: move higher -// ReactJsxRuntime: require('react/jsx-runtime'), -// ReactJsxDevRuntime: require('react/jsx-dev-runtime'), - -// // eslint-disable-next-line import/no-extraneous-dependencies -// ReactServerDOMWebpackServerNode: require('react-server-dom-webpack/server.node'), -// // eslint-disable-next-line import/no-extraneous-dependencies -// ReactServerDOMWebpackServerEdge: require('react-server-dom-webpack/server.edge'), -// } - import * as React from 'react' import * as ReactDOM from 'react-dom/server-rendering-stub' diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/ssr/entrypoints.ts b/packages/next/src/server/future/route-modules/app-page/vendored/ssr/entrypoints.ts index 1b5bdbb161887..aa071a9567055 100644 --- a/packages/next/src/server/future/route-modules/app-page/vendored/ssr/entrypoints.ts +++ b/packages/next/src/server/future/route-modules/app-page/vendored/ssr/entrypoints.ts @@ -1,17 +1,3 @@ -// module.exports = { -// React: require('react'), -// ReactDOM: require('react-dom/server-rendering-stub'), - -// // todo move higher -// ReactJsxRuntime: require('react/jsx-runtime'), -// ReactJsxDevRuntime: require('react/jsx-dev-runtime'), - -// // ReactDOMServerEdge: require('react-dom/cjs/react-dom-server.browser.production.min'), -// ReactDOMServerEdge: require('react-dom/cjs/react-dom-server.node.production.min'), -// // eslint-disable-next-line import/no-extraneous-dependencies -// ReactServerDOMWebpackClientEdge: require('react-server-dom-webpack/client.edge'), -// } - import * as React from 'react' import * as ReactDOM from 'react-dom/server-rendering-stub' diff --git a/packages/next/src/server/import-overrides.ts b/packages/next/src/server/import-overrides.ts index 2b60f820834c0..c72f42612eae3 100644 --- a/packages/next/src/server/import-overrides.ts +++ b/packages/next/src/server/import-overrides.ts @@ -23,55 +23,6 @@ export const defaultOverrides = { : resolve('styled-jsx/style', nextPaths), } -// export const baseOverrides = { -// react: 'next/dist/compiled/react', -// 'react/package.json': 'next/dist/compiled/react/package.json', -// 'react/jsx-runtime': 'next/dist/compiled/react/jsx-runtime', -// 'react/jsx-dev-runtime': 'next/dist/compiled/react/jsx-dev-runtime', -// 'react-dom': 'next/dist/compiled/react-dom/server-rendering-stub', -// 'react-dom/package.json': 'next/dist/compiled/react-dom/package.json', -// 'react-dom/client': 'next/dist/compiled/react-dom/client', -// 'react-dom/server': 'next/dist/compiled/react-dom/server', -// 'react-dom/server.browser': 'next/dist/compiled/react-dom/server.browser', -// 'react-dom/server.edge': 'next/dist/compiled/react-dom/server.edge', -// 'react-server-dom-webpack/client': -// 'next/dist/compiled/react-server-dom-webpack/client', -// 'react-server-dom-webpack/client.edge': -// 'next/dist/compiled/react-server-dom-webpack/client.edge', -// 'react-server-dom-webpack/server.edge': -// 'next/dist/compiled/react-server-dom-webpack/server.edge', -// 'react-server-dom-webpack/server.node': -// 'next/dist/compiled/react-server-dom-webpack/server.node', -// } - -// export const experimentalOverrides = { -// react: 'next/dist/compiled/react-experimental', -// 'react/jsx-runtime': 'next/dist/compiled/react-experimental/jsx-runtime', -// 'react/jsx-dev-runtime': -// 'next/dist/compiled/react-experimental/jsx-dev-runtime', -// 'react-dom': -// 'next/dist/compiled/react-dom-experimental/server-rendering-stub', -// 'react/package.json': 'next/dist/compiled/react-experimental/package.json', -// 'react-dom/package.json': -// 'next/dist/compiled/react-dom-experimental/package.json', -// 'react-dom/client': 'next/dist/compiled/react-dom-experimental/client', -// 'react-dom/server': 'next/dist/compiled/react-dom-experimental/server', -// 'react-dom/server.browser': -// 'next/dist/compiled/react-dom-experimental/server.browser', -// 'react-dom/server.edge': -// 'next/dist/compiled/react-dom-experimental/server.edge', -// 'react-server-dom-webpack/client': -// 'next/dist/compiled/react-server-dom-webpack-experimental/client', -// 'react-server-dom-webpack/client.edge': -// 'next/dist/compiled/react-server-dom-webpack-experimental/client.edge', -// 'react-server-dom-webpack/server.edge': -// 'next/dist/compiled/react-server-dom-webpack-experimental/server.edge', -// 'react-server-dom-webpack/server.node': -// 'next/dist/compiled/react-server-dom-webpack-experimental/server.node', -// } - -// let aliasedPrebundledReact = false - const toResolveMap = (map: Record): [string, string][] => Object.entries(map).map(([key, value]) => [key, resolve(value, nextPaths)]) @@ -82,20 +33,3 @@ export function addHookAliases(aliases: [string, string][] = []) { } addHookAliases(toResolveMap(defaultOverrides)) - -// // Override built-in React packages if necessary -// export function overrideReact() { -// if (process.env.__NEXT_PRIVATE_PREBUNDLED_REACT && !aliasedPrebundledReact) { -// aliasedPrebundledReact = true - -// // Require these modules with static paths to make sure they are tracked by -// // NFT when building the app in standalone mode, as we are now conditionally -// // aliasing them it's tricky to track them in build time. -// if (process.env.__NEXT_PRIVATE_PREBUNDLED_REACT === 'experimental') { -// addHookAliases(toResolveMap(experimentalOverrides)) -// } else { -// addHookAliases(toResolveMap(baseOverrides)) -// } -// } -// } -// overrideReact() diff --git a/packages/next/src/server/require-hook.js b/packages/next/src/server/require-hook.js index d8c99fda483e1..6e6c89ffc3555 100644 --- a/packages/next/src/server/require-hook.js +++ b/packages/next/src/server/require-hook.js @@ -19,9 +19,6 @@ mod._resolveFilename = function ( isMain, options ) { - // In case the environment variable is set after the module is loaded. - // overrideReact() - const hookResolved = requestMap.get(request) if (hookResolved) request = hookResolved From db67e630949a350ae84355bcdc38c663e9433e22 Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Fri, 15 Sep 2023 15:59:05 +0200 Subject: [PATCH 41/48] dead code --- .../future/route-modules/pages/vendored/contexts/entrypoints.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/next/src/server/future/route-modules/pages/vendored/contexts/entrypoints.ts b/packages/next/src/server/future/route-modules/pages/vendored/contexts/entrypoints.ts index 5740225ca8e9d..3e244ec2d314e 100644 --- a/packages/next/src/server/future/route-modules/pages/vendored/contexts/entrypoints.ts +++ b/packages/next/src/server/future/route-modules/pages/vendored/contexts/entrypoints.ts @@ -8,5 +8,3 @@ export * as HeadManagerContext from '../../../../../../shared/lib/head-manager-c export * as AppRouterContext from '../../../../../../shared/lib/app-router-context.shared-runtime' export * as AmpContext from '../../../../../../shared/lib/amp-context.shared-runtime' export * as ServerInsertedHtml from '../../../../../../shared/lib/server-inserted-html.shared-runtime' -// export * as runtimeConfig from '../../../../../../shared/lib/runtime-config.external' -// export * as adapters from '../../../../../../shared/lib/router/adapters.shared-runtime' From 485f0ae64ee0079d1f33dd48c746450118adc6cd Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Fri, 15 Sep 2023 11:47:32 -0500 Subject: [PATCH 42/48] manually include vendored contexts files --- packages/next/src/build/index.ts | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/packages/next/src/build/index.ts b/packages/next/src/build/index.ts index c666f629a5a38..962d4616aca94 100644 --- a/packages/next/src/build/index.ts +++ b/packages/next/src/build/index.ts @@ -2272,6 +2272,30 @@ export default async function build( } } } + + const moduleTypes = ['app-page', 'pages'] + + for (const type of moduleTypes) { + const contextDir = path.join( + path.dirname( + require.resolve( + `next/dist/server/future/route-modules/${type}/module` + ) + ), + 'vendored', + 'contexts' + ) + + for (const item of await fs.readdir(contextDir)) { + addToTracedFiles(root, path.join(contextDir, item), tracedFiles) + addToTracedFiles( + root, + path.join(contextDir, item), + minimalTracedFiles + ) + } + } + await Promise.all([ fs.writeFile( nextServerTraceOutput, From 320bc7462df4ddf2b108ca9294a30e626c766444 Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Fri, 15 Sep 2023 18:57:52 +0200 Subject: [PATCH 43/48] Update packages/next-swc/crates/next-core/src/next_shared/resolve.rs Co-authored-by: Justin Ridgewell --- packages/next-swc/crates/next-core/src/next_shared/resolve.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next-swc/crates/next-core/src/next_shared/resolve.rs b/packages/next-swc/crates/next-core/src/next_shared/resolve.rs index e9d42999703cd..8eebd1385ebd1 100644 --- a/packages/next-swc/crates/next-core/src/next_shared/resolve.rs +++ b/packages/next-swc/crates/next-core/src/next_shared/resolve.rs @@ -205,7 +205,7 @@ impl ResolvePlugin for NextNodeSharedRuntimeResolvePlugin { let (base, _) = path.split_at(starting_index); - let new_path = fs_path.root().join(base.to_string()).join(resource_request); + let new_path = fs_path.root().join(format!("{base}/{resource_request}")); Ok(Vc::cell(Some( ResolveResult::source(Vc::upcast(FileSource::new(new_path))).into(), From 6de51b25664e40c234ea40eef46347f8682be26d Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Fri, 15 Sep 2023 18:58:25 +0200 Subject: [PATCH 44/48] address comments --- packages/next/src/build/webpack-config.ts | 27 ++++++++++--------- packages/next/src/server/esm-loader.mts | 3 --- .../app-page/vendored/contexts/entrypoints.ts | 2 -- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/packages/next/src/build/webpack-config.ts b/packages/next/src/build/webpack-config.ts index 54da2a5a36cb4..0fbeb8a0d1f3d 100644 --- a/packages/next/src/build/webpack-config.ts +++ b/packages/next/src/build/webpack-config.ts @@ -2443,18 +2443,21 @@ export default async function getBaseWebpackConfig( ) const layer = resource.contextInfo.issuerLayer - const runtime = - layer === 'app-route-handler' - ? 'app-route' - : [ - WEBPACK_LAYERS.reactServerComponents, - WEBPACK_LAYERS.serverSideRendering, - WEBPACK_LAYERS.appPagesBrowser, - WEBPACK_LAYERS.actionBrowser, - WEBPACK_LAYERS.appRouteHandler, - ].includes(layer as any) - ? 'app-page' - : 'pages' + let runtime + + switch (layer) { + case WEBPACK_LAYERS.appRouteHandler: + runtime = 'app-route' + break + case WEBPACK_LAYERS.serverSideRendering: + case WEBPACK_LAYERS.reactServerComponents: + case WEBPACK_LAYERS.appPagesBrowser: + case WEBPACK_LAYERS.actionBrowser: + runtime = 'app-page' + break + default: + runtime = 'pages' + } resource.request = `next/dist/server/future/route-modules/${runtime}/vendored/contexts/${moduleName}` } diff --git a/packages/next/src/server/esm-loader.mts b/packages/next/src/server/esm-loader.mts index 946e73a7075f0..3e6649607068b 100644 --- a/packages/next/src/server/esm-loader.mts +++ b/packages/next/src/server/esm-loader.mts @@ -7,9 +7,6 @@ export function resolve(specifier: string, context: any, nextResolve: any) { ? './import-overrides' : 'next/dist/server/import-overrides') as typeof import('./import-overrides') - // In case the environment variable is set after the module is loaded. - // overrideReact()s - const hookResolved = hookPropertyMap.get(specifier) if (hookResolved) { specifier = hookResolved diff --git a/packages/next/src/server/future/route-modules/app-page/vendored/contexts/entrypoints.ts b/packages/next/src/server/future/route-modules/app-page/vendored/contexts/entrypoints.ts index 09a0a23406171..52274993f0abc 100644 --- a/packages/next/src/server/future/route-modules/app-page/vendored/contexts/entrypoints.ts +++ b/packages/next/src/server/future/route-modules/app-page/vendored/contexts/entrypoints.ts @@ -8,5 +8,3 @@ export * as AmpContext from '../../../../../../shared/lib/amp-context.shared-run export * as LoadableContext from '../../../../../../shared/lib/loadable-context.shared-runtime' export * as ImageConfigContext from '../../../../../../shared/lib/image-config-context.shared-runtime' export * as Loadable from '../../../../../../shared/lib/loadable.shared-runtime' -// export * as adapters from '../../../../../../shared/lib/router/adapters.shared-runtime' -// export * as runtimeConfig from '../../../../../../shared/lib/runtime-config.external' From a2acaeda32977281cc680b480a19c2d899b45fc4 Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Fri, 15 Sep 2023 12:03:00 -0500 Subject: [PATCH 45/48] fix trace path --- packages/next/src/build/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/next/src/build/index.ts b/packages/next/src/build/index.ts index 962d4616aca94..b9261362bd4b6 100644 --- a/packages/next/src/build/index.ts +++ b/packages/next/src/build/index.ts @@ -2287,12 +2287,12 @@ export default async function build( ) for (const item of await fs.readdir(contextDir)) { - addToTracedFiles(root, path.join(contextDir, item), tracedFiles) - addToTracedFiles( + const itemPath = path.relative( root, - path.join(contextDir, item), - minimalTracedFiles + path.join(contextDir, item) ) + addToTracedFiles(root, itemPath, tracedFiles) + addToTracedFiles(root, itemPath, minimalTracedFiles) } } From bf1ad0bb124be6d1595e59037478bfde3174dbeb Mon Sep 17 00:00:00 2001 From: Jimmy Lai Date: Fri, 15 Sep 2023 19:06:53 +0200 Subject: [PATCH 46/48] revert vendored react changes --- .../cjs/react-dom-static.browser.development.js | 2 +- .../cjs/react-dom-static.browser.production.min.js | 2 +- .../cjs/react-dom-static.edge.development.js | 2 +- .../cjs/react-dom-static.edge.production.min.js | 2 +- .../cjs/react-dom-static.node.development.js | 2 +- .../cjs/react-dom-static.node.production.min.js | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-static.browser.development.js b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-static.browser.development.js index e0ff57cde667d..442e7aa437a8b 100644 --- a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-static.browser.development.js +++ b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-static.browser.development.js @@ -14,7 +14,7 @@ if (process.env.NODE_ENV !== "production") { (function() { 'use strict'; -var React = require('react'); +var React = require("next/dist/compiled/react-experimental"); var ReactDOM = require('react-dom'); var ReactVersion = '18.3.0-experimental-dd480ef92-20230822'; diff --git a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-static.browser.production.min.js b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-static.browser.production.min.js index acd94bfe221b3..8e9d7bc33c938 100644 --- a/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-static.browser.production.min.js +++ b/packages/next/src/compiled/react-dom-experimental/cjs/react-dom-static.browser.production.min.js @@ -7,7 +7,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -'use strict';var ba=require("react"),da=require("react-dom");function h(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;c Date: Fri, 15 Sep 2023 19:43:03 +0200 Subject: [PATCH 47/48] remove typeof window define --- packages/next/src/build/webpack-config.ts | 5 ----- .../loaders/next-flight-loader/action-client-wrapper.ts | 2 +- .../components/router-reducer/fetch-server-response.ts | 2 +- .../router-reducer/reducers/server-action-reducer.ts | 2 +- 4 files changed, 3 insertions(+), 8 deletions(-) diff --git a/packages/next/src/build/webpack-config.ts b/packages/next/src/build/webpack-config.ts index 0fbeb8a0d1f3d..aa80e4c6fbff4 100644 --- a/packages/next/src/build/webpack-config.ts +++ b/packages/next/src/build/webpack-config.ts @@ -373,11 +373,6 @@ export function getDefineEnv({ } : undefined), 'process.env.TURBOPACK': JSON.stringify(false), - ...(isNodeOrEdgeCompilation - ? { - 'typeof window': JSON.stringify('undefined'), - } - : undefined), ...(isNodeServer ? { 'process.env.__NEXT_EXPERIMENTAL_REACT': diff --git a/packages/next/src/build/webpack/loaders/next-flight-loader/action-client-wrapper.ts b/packages/next/src/build/webpack/loaders/next-flight-loader/action-client-wrapper.ts index a1095a8497f52..7288263bb4303 100644 --- a/packages/next/src/build/webpack/loaders/next-flight-loader/action-client-wrapper.ts +++ b/packages/next/src/build/webpack/loaders/next-flight-loader/action-client-wrapper.ts @@ -11,7 +11,7 @@ export function createServerReference(id: string) { // we use the default and let Webpack to resolve it to the correct version. // 1: https://github.com/vercel/next.js/blob/16eb80b0b0be13f04a6407943664b5efd8f3d7d0/packages/next/src/server/app-render/use-flight-response.tsx#L24-L26 const { createServerReference: createServerReferenceImpl } = ( - typeof window === 'undefined' + !!process.env.NEXT_RUNTIME ? // eslint-disable-next-line import/no-extraneous-dependencies require('react-server-dom-webpack/client.edge') : // eslint-disable-next-line import/no-extraneous-dependencies diff --git a/packages/next/src/client/components/router-reducer/fetch-server-response.ts b/packages/next/src/client/components/router-reducer/fetch-server-response.ts index e6c3eb037b143..7e13551cbc42e 100644 --- a/packages/next/src/client/components/router-reducer/fetch-server-response.ts +++ b/packages/next/src/client/components/router-reducer/fetch-server-response.ts @@ -4,7 +4,7 @@ // eslint-disable-next-line import/no-extraneous-dependencies // import { createFromFetch } from 'react-server-dom-webpack/client' const { createFromFetch } = ( - typeof window === 'undefined' + !!process.env.NEXT_RUNTIME ? // eslint-disable-next-line import/no-extraneous-dependencies require('react-server-dom-webpack/client.edge') : // eslint-disable-next-line import/no-extraneous-dependencies diff --git a/packages/next/src/client/components/router-reducer/reducers/server-action-reducer.ts b/packages/next/src/client/components/router-reducer/reducers/server-action-reducer.ts index 3cd195b17c04f..6fc0afbf06c25 100644 --- a/packages/next/src/client/components/router-reducer/reducers/server-action-reducer.ts +++ b/packages/next/src/client/components/router-reducer/reducers/server-action-reducer.ts @@ -17,7 +17,7 @@ import { readRecordValue } from '../read-record-value' // // eslint-disable-next-line import/no-extraneous-dependencies // import { encodeReply } from 'react-server-dom-webpack/client' const { createFromFetch, encodeReply } = ( - typeof window === 'undefined' + !!process.env.NEXT_RUNTIME ? // eslint-disable-next-line import/no-extraneous-dependencies require('react-server-dom-webpack/client.edge') : // eslint-disable-next-line import/no-extraneous-dependencies From 4a967fae8fcaf2ad8f4bab6716c179516288d3b5 Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Fri, 15 Sep 2023 14:34:57 -0500 Subject: [PATCH 48/48] bump