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