@@ -32,6 +32,7 @@ let ReactDOMClient;
32
32
let ReactServerDOMServer ;
33
33
let ReactServerDOMClient ;
34
34
let ReactDOMFizzServer ;
35
+ let ReactDOMStaticServer ;
35
36
let Suspense ;
36
37
let ErrorBoundary ;
37
38
let JSDOM ;
@@ -71,6 +72,7 @@ describe('ReactFlightDOM', () => {
71
72
Suspense = React . Suspense ;
72
73
ReactDOMClient = require ( 'react-dom/client' ) ;
73
74
ReactDOMFizzServer = require ( 'react-dom/server.node' ) ;
75
+ ReactDOMStaticServer = require ( 'react-dom/static.node' ) ;
74
76
ReactServerDOMClient = require ( 'react-server-dom-webpack/client' ) ;
75
77
76
78
ErrorBoundary = class extends React . Component {
@@ -1300,6 +1302,88 @@ describe('ReactFlightDOM', () => {
1300
1302
expect ( getMeaningfulChildren ( container ) ) . toEqual ( < p > hello world</ p > ) ;
1301
1303
} ) ;
1302
1304
1305
+ it ( 'should allow postponing in Flight through a serialized promise' , async ( ) => {
1306
+ const Context = React . createContext ( ) ;
1307
+ const ContextProvider = Context . Provider ;
1308
+
1309
+ function Foo ( ) {
1310
+ const value = React . use ( React . useContext ( Context ) ) ;
1311
+ return < span > { value } </ span > ;
1312
+ }
1313
+
1314
+ const ClientModule = clientExports ( {
1315
+ ContextProvider,
1316
+ Foo,
1317
+ } ) ;
1318
+
1319
+ async function getFoo ( ) {
1320
+ await 1 ;
1321
+ React . unstable_postpone ( 'foo' ) ;
1322
+ }
1323
+
1324
+ function App ( ) {
1325
+ return (
1326
+ < ClientModule . ContextProvider value = { getFoo ( ) } >
1327
+ < div >
1328
+ < Suspense fallback = "loading..." >
1329
+ < ClientModule . Foo />
1330
+ </ Suspense >
1331
+ </ div >
1332
+ </ ClientModule . ContextProvider >
1333
+ ) ;
1334
+ }
1335
+
1336
+ const { writable, readable} = getTestStream ( ) ;
1337
+
1338
+ const { pipe} = ReactServerDOMServer . renderToPipeableStream (
1339
+ < App /> ,
1340
+ webpackMap ,
1341
+ ) ;
1342
+ pipe ( writable ) ;
1343
+
1344
+ let response = null ;
1345
+ function getResponse ( ) {
1346
+ if ( response === null ) {
1347
+ response = ReactServerDOMClient . createFromReadableStream ( readable ) ;
1348
+ }
1349
+ return response ;
1350
+ }
1351
+
1352
+ function Response ( ) {
1353
+ return getResponse ( ) ;
1354
+ }
1355
+
1356
+ const errors = [ ] ;
1357
+ function onError ( error , errorInfo ) {
1358
+ errors . push ( error , errorInfo ) ;
1359
+ }
1360
+ const result = await ReactDOMStaticServer . prerenderToNodeStream (
1361
+ < Response /> ,
1362
+ onError ,
1363
+ ) ;
1364
+
1365
+ const prelude = await new Promise ( ( resolve , reject ) => {
1366
+ let content = '' ;
1367
+ result . prelude . on ( 'data' , chunk => {
1368
+ content += Buffer . from ( chunk ) . toString ( 'utf8' ) ;
1369
+ } ) ;
1370
+ result . prelude . on ( 'error' , error => {
1371
+ reject ( error ) ;
1372
+ } ) ;
1373
+ result . prelude . on ( 'end' , ( ) => resolve ( content ) ) ;
1374
+ } ) ;
1375
+
1376
+ const doc = new JSDOM ( prelude ) . window . document ;
1377
+ expect ( getMeaningfulChildren ( doc ) ) . toEqual (
1378
+ < html >
1379
+ < head />
1380
+ < body >
1381
+ < div > loading...</ div >
1382
+ </ body >
1383
+ </ html > ,
1384
+ ) ;
1385
+ } ) ;
1386
+
1303
1387
it ( 'should support float methods when rendering in Fizz' , async ( ) => {
1304
1388
function Component ( ) {
1305
1389
return < p > hello world</ p > ;
0 commit comments