[Flight] Build node-webstreams version of bundled webpack server (#33456)

Follow up to #33442. This is the bundled version.

To keep type check passes from exploding and the maintainance of the
annoying `paths: []` list small, this doesn't add this to flow type
checks. We might miss some config but every combination should already
be covered by other one passes.

I also don't add any jest tests because to test these double export
entry points we need conditional importing to cover builds and
non-builds which turns out to be difficult for the Flight builds so
these aren't covered by any basic build tests.

This approach is what I'm going for, for the other bundlers too.
This commit is contained in:
Sebastian Markbåge
2025-06-06 11:07:15 -04:00
committed by GitHub
parent d177272802
commit e8d15fa19e
8 changed files with 124 additions and 7 deletions

View File

@@ -0,0 +1,19 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow
*/
export {default as rendererVersion} from 'shared/ReactVersion';
export const rendererPackageName = 'react-server-dom-webpack';
export * from 'react-client/src/ReactFlightClientStreamConfigWeb';
export * from 'react-client/src/ReactClientConsoleConfigServer';
export * from 'react-server-dom-webpack/src/client/ReactFlightClientConfigBundlerWebpack';
export * from 'react-server-dom-webpack/src/client/ReactFlightClientConfigBundlerWebpackServer';
export * from 'react-server-dom-webpack/src/client/ReactFlightClientConfigTargetWebpackServer';
export * from 'react-dom-bindings/src/shared/ReactFlightClientConfigDOM';
export const usedWithSSR = true;

View File

@@ -1,7 +1,28 @@
'use strict';
var n, w;
if (process.env.NODE_ENV === 'production') {
module.exports = require('./cjs/react-server-dom-webpack-client.node.production.js');
n = require('./cjs/react-server-dom-webpack-client.node.production.js');
w = require('./cjs/react-server-dom-webpack-client.node-webstreams.production.js');
} else {
module.exports = require('./cjs/react-server-dom-webpack-client.node.development.js');
n = require('./cjs/react-server-dom-webpack-client.node.development.js');
w = require('./cjs/react-server-dom-webpack-client.node-webstreams.development.js');
}
exports.registerServerReference = function (r, i, e) {
return w.registerServerReference(n.registerServerReference(r, i, e), i, e);
};
exports.createServerReference = function (i, c, e, d, f) {
return w.registerServerReference(
n.createServerReference(i, c, e, d, f),
i,
e
);
};
exports.createFromNodeStream = n.createFromNodeStream;
exports.createFromFetch = w.createFromFetch;
exports.createFromReadableStream = w.createFromReadableStream;
exports.createTemporaryReferenceSet = w.createTemporaryReferenceSet;
exports.encodeReply = w.encodeReply;

View File

@@ -1,10 +1,12 @@
'use strict';
var s;
var s, w;
if (process.env.NODE_ENV === 'production') {
s = require('./cjs/react-server-dom-webpack-server.node.production.js');
s = require('./cjs/react-server-dom-webpack-server.node.unbundled.production.js');
w = require('./cjs/react-server-dom-webpack-server.node-webstreams.unbundled.production.js');
} else {
s = require('./cjs/react-server-dom-webpack-server.node.development.js');
s = require('./cjs/react-server-dom-webpack-server.node.unbundled.development.js');
w = require('./cjs/react-server-dom-webpack-server.node-webstreams.unbundled.development.js');
}
exports.renderToPipeableStream = s.renderToPipeableStream;
@@ -16,3 +18,6 @@ exports.registerServerReference = s.registerServerReference;
exports.registerClientReference = s.registerClientReference;
exports.createClientModuleProxy = s.createClientModuleProxy;
exports.createTemporaryReferenceSet = s.createTemporaryReferenceSet;
exports.renderToReadableStream = w.renderToReadableStream;
exports.decodeReplyFromAsyncIterable = w.decodeReplyFromAsyncIterable;

View File

@@ -0,0 +1,10 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow
*/
export * from './ReactFlightDOMClientEdge';

View File

@@ -0,0 +1,21 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow
*/
export {
renderToReadableStream,
prerender as unstable_prerender,
decodeReply,
decodeReplyFromAsyncIterable,
decodeAction,
decodeFormState,
registerServerReference,
registerClientReference,
createClientModuleProxy,
createTemporaryReferenceSet,
} from './ReactFlightDOMServerEdge';

View File

@@ -296,14 +296,19 @@ if (process.env.REACT_CLASS_EQUIVALENCE_TEST) {
// We mock createHook so that we can automatically clean it up.
let installedHook = null;
let outgoingHook = null;
jest.mock('async_hooks', () => {
const actual = jest.requireActual('async_hooks');
return {
...actual,
createHook(config) {
if (installedHook) {
installedHook.disable();
// We unmount when there's more than two hooks installed.
// We use two because the build of server.node actually installs two hooks.
// One in each build.
if (outgoingHook) {
outgoingHook.disable();
}
outgoingHook = installedHook;
return (installedHook = actual.createHook(config));
},
};

View File

@@ -472,6 +472,18 @@ const bundles = [
wrapWithModuleBoundaries: false,
externals: ['react', 'util', 'crypto', 'async_hooks', 'react-dom'],
},
{
bundleTypes: [NODE_DEV, NODE_PROD],
moduleType: RENDERER,
entry:
'react-server-dom-webpack/src/server/react-flight-dom-server.node-webstreams',
name: 'react-server-dom-webpack-server.node-webstreams',
condition: 'react-server',
global: 'ReactServerDOMServer',
minifyWithProdErrorCodes: false,
wrapWithModuleBoundaries: false,
externals: ['react', 'util', 'crypto', 'async_hooks', 'react-dom'],
},
{
bundleTypes: [NODE_DEV, NODE_PROD],
moduleType: RENDERER,
@@ -530,6 +542,17 @@ const bundles = [
wrapWithModuleBoundaries: false,
externals: ['react', 'react-dom', 'util', 'crypto'],
},
{
bundleTypes: [NODE_DEV, NODE_PROD],
moduleType: RENDERER,
entry:
'react-server-dom-webpack/src/client/react-flight-dom-client.node-webstreams',
name: 'react-server-dom-webpack-client.node-webstreams',
global: 'ReactServerDOMClient',
minifyWithProdErrorCodes: false,
wrapWithModuleBoundaries: false,
externals: ['react', 'react-dom', 'util', 'crypto'],
},
{
bundleTypes: [NODE_DEV, NODE_PROD],
moduleType: RENDERER,

View File

@@ -190,6 +190,19 @@ module.exports = [
isFlowTyped: true,
isServerSupported: true,
},
{
shortName: 'dom-node-webstreams-webpack',
entryPoints: [
'react-server-dom-webpack/src/client/react-flight-dom-client.node-webstreams',
'react-server-dom-webpack/src/server/react-flight-dom-server.node-webstreams',
],
paths: [
'react-server-dom-webpack/src/client/react-flight-dom-client.node-webstreams',
'react-server-dom-webpack/src/server/react-flight-dom-server.node-webstreams',
],
isFlowTyped: false,
isServerSupported: true,
},
{
shortName: 'dom-node-turbopack',
entryPoints: [