9
10
'use strict';
11
12
+import {patchMessageChannel} from '../../../../scripts/jest/patchMessageChannel';
13
+
14
import {
15
getVisibleChildren,
16
insertNodesAndExecuteScripts,
28
let ReactDOMFizzStatic;
29
let Suspense;
30
let container;
31
+let Scheduler;
32
+let act;
33
34
describe('ReactDOMFizzStaticBrowser', () => {
35
beforeEach(() => {
36
jest.resetModules();
37
+
38
+ Scheduler = require('scheduler');
39
+ patchMessageChannel(Scheduler);
40
+ act = require('internal-test-utils').act;
41
+
42
React = require('react');
43
ReactDOM = require('react-dom');
44
ReactDOMFizzServer = require('react-dom/server.browser');
54
document.body.removeChild(container);
55
});
56
57
+ async function serverAct(callback) {
58
+ let maybePromise;
59
+ await act(() => {
60
+ maybePromise = callback();
61
+ if (maybePromise && typeof maybePromise.catch === 'function') {
62
+ maybePromise.catch(() => {});
63
+ }
64
+ });
65
+ return maybePromise;
66
+ }
67
+
68
const theError = new Error('This is an error');
69
function Throw() {
70
throw theError;
133
134
// @gate experimental
135
it('should call prerender', async () => {
116
- const result = await ReactDOMFizzStatic.prerender(<div>hello world</div>);
136
+ const result = await serverAct(() =>
137
+ ReactDOMFizzStatic.prerender(<div>hello world</div>),
138
+ );
139
const prelude = await readContent(result.prelude);
140
expect(prelude).toMatchInlineSnapshot(`"<div>hello world</div>"`);
141
});
142
143
// @gate experimental
144
it('should emit DOCTYPE at the root of the document', async () => {
123
- const result = await ReactDOMFizzStatic.prerender(
124
- <html>
125
- <body>hello world</body>
126
- </html>,
145
+ const result = await serverAct(() =>
146
+ ReactDOMFizzStatic.prerender(
147
+ <html>
148
+ <body>hello world</body>
149
+ </html>,
150
+ ),
151
);
152
const prelude = await readContent(result.prelude);
153
expect(prelude).toMatchInlineSnapshot(
157
158
// @gate experimental
159
it('should emit bootstrap script src at the end', async () => {
136
- const result = await ReactDOMFizzStatic.prerender(<div>hello world</div>, {
137
- bootstrapScriptContent: 'INIT();',
138
- bootstrapScripts: ['init.js'],
139
- bootstrapModules: ['init.mjs'],
140
- });
160
+ const result = await serverAct(() =>
161
+ ReactDOMFizzStatic.prerender(<div>hello world</div>, {
162
+ bootstrapScriptContent: 'INIT();',
163
+ bootstrapScripts: ['init.js'],
164
+ bootstrapModules: ['init.mjs'],
165
+ }),
166
+ );
167
const prelude = await readContent(result.prelude);
168
expect(prelude).toMatchInlineSnapshot(
169
`"<link rel="preload" as="script" fetchPriority="low" href="init.js"/><link rel="modulepreload" fetchPriority="low" href="init.mjs"/><div>hello world</div><script>INIT();</script><script src="init.js" async=""></script><script type="module" src="init.mjs" async=""></script>"`,
181
}
182
return 'Done';
183
}
158
- const resultPromise = ReactDOMFizzStatic.prerender(
159
- <div>
160
- <Suspense fallback="Loading">
161
- <Wait />
162
- </Suspense>
163
- </div>,
184
+ const resultPromise = serverAct(() =>
185
+ ReactDOMFizzStatic.prerender(
186
+ <div>
187
+ <Suspense fallback="Loading">
188
+ <Wait />
189
+ </Suspense>
190
+ </div>,
191
+ ),
192
);
193
194
await jest.runAllTimers();
199
200
const result = await resultPromise;
201
const prelude = await readContent(result.prelude);
174
- expect(prelude).toMatchInlineSnapshot(
175
- `"<div><!--$-->Done<!-- --><!--/$--></div>"`,
176
- );
202
+ expect(prelude).toMatchInlineSnapshot(`"<div><!--$-->Done<!--/$--></div>"`);
203
});
204
205
// @gate experimental
207
const reportedErrors = [];
208
let caughtError = null;
209
try {
184
- await ReactDOMFizzStatic.prerender(
185
- <div>
186
- <Throw />
187
- </div>,
188
- {
189
- onError(x) {
190
- reportedErrors.push(x);
210
+ await serverAct(() =>
211
+ ReactDOMFizzStatic.prerender(
212
+ <div>
213
+ <Throw />
214
+ </div>,
215
+ {
216
+ onError(x) {
217
+ reportedErrors.push(x);
218
+ },
219
},
192
- },
220
+ ),
221
);
222
} catch (error) {
223
caughtError = error;
231
const reportedErrors = [];
232
let caughtError = null;
233
try {
206
- await ReactDOMFizzStatic.prerender(
207
- <div>
208
- <Suspense fallback={<Throw />}>
209
- <InfiniteSuspend />
210
- </Suspense>
211
- </div>,
212
- {
213
- onError(x) {
214
- reportedErrors.push(x);
234
+ await serverAct(() =>
235
+ ReactDOMFizzStatic.prerender(
236
+ <div>
237
+ <Suspense fallback={<Throw />}>
238
+ <InfiniteSuspend />
239
+ </Suspense>
240
+ </div>,
241
+ {
242
+ onError(x) {
243
+ reportedErrors.push(x);
244
+ },
245
},
216
- },
246
+ ),
247
);
248
} catch (error) {
249
caughtError = error;
255
// @gate experimental
256
it('should not error the stream when an error is thrown inside suspense boundary', async () => {
257
const reportedErrors = [];
228
- const result = await ReactDOMFizzStatic.prerender(
229
- <div>
230
- <Suspense fallback={<div>Loading</div>}>
231
- <Throw />
232
- </Suspense>
233
- </div>,
234
- {
235
- onError(x) {
236
- reportedErrors.push(x);
258
+ const result = await serverAct(() =>
259
+ ReactDOMFizzStatic.prerender(
260
+ <div>
261
+ <Suspense fallback={<div>Loading</div>}>
262
+ <Throw />
263
+ </Suspense>
264
+ </div>,
265
+ {
266
+ onError(x) {
267
+ reportedErrors.push(x);
268
+ },
269
},
238
- },
270
+ ),
271
);
272
273
const prelude = await readContent(result.prelude);
279
it('should be able to complete by aborting even if the promise never resolves', async () => {
280
const errors = [];
281
const controller = new AbortController();
250
- const resultPromise = ReactDOMFizzStatic.prerender(
251
- <div>
252
- <Suspense fallback={<div>Loading</div>}>
253
- <InfiniteSuspend />
254
- </Suspense>
255
- </div>,
256
- {
257
- signal: controller.signal,
258
- onError(x) {
259
- errors.push(x.message);
282
+ let resultPromise;
283
+ await serverAct(() => {
284
+ resultPromise = ReactDOMFizzStatic.prerender(
285
+ <div>
286
+ <Suspense fallback={<div>Loading</div>}>
287
+ <InfiniteSuspend />
288
+ </Suspense>
289
+ </div>,
290
+ {
291
+ signal: controller.signal,
292
+ onError(x) {
293
+ errors.push(x.message);
294
+ },
295
},
261
- },
262
- );
263
-
264
- await jest.runAllTimers();
296
+ );
297
+ });
298
299
controller.abort();
300
310
it('should reject if aborting before the shell is complete', async () => {
311
const errors = [];
312
const controller = new AbortController();
280
- const promise = ReactDOMFizzStatic.prerender(
281
- <div>
282
- <InfiniteSuspend />
283
- </div>,
284
- {
285
- signal: controller.signal,
286
- onError(x) {
287
- errors.push(x.message);
313
+ const promise = serverAct(() =>
314
+ ReactDOMFizzStatic.prerender(
315
+ <div>
316
+ <InfiniteSuspend />
317
+ </div>,
318
+ {
319
+ signal: controller.signal,
320
+ onError(x) {
321
+ errors.push(x.message);
322
+ },
323
},
289
- },
324
+ ),
325
);
326
327
await jest.runAllTimers();
351
</Suspense>
352
);
353
}
319
- const streamPromise = ReactDOMFizzStatic.prerender(
320
- <div>
321
- <App />
322
- </div>,
323
- {
324
- signal: controller.signal,
325
- onError(x) {
326
- errors.push(x.message);
354
+ const streamPromise = serverAct(() =>
355
+ ReactDOMFizzStatic.prerender(
356
+ <div>
357
+ <App />
358
+ </div>,
359
+ {
360
+ signal: controller.signal,
361
+ onError(x) {
362
+ errors.push(x.message);
363
+ },
364
},
328
- },
365
+ ),
366
);
367
368
let caughtError = null;
382
const theReason = new Error('aborted for reasons');
383
controller.abort(theReason);
384
348
- const promise = ReactDOMFizzStatic.prerender(
349
- <div>
350
- <Suspense fallback={<div>Loading</div>}>
351
- <InfiniteSuspend />
352
- </Suspense>
353
- </div>,
354
- {
355
- signal: controller.signal,
356
- onError(x) {
357
- errors.push(x.message);
385
+ const promise = serverAct(() =>
386
+ ReactDOMFizzStatic.prerender(
387
+ <div>
388
+ <Suspense fallback={<div>Loading</div>}>
389
+ <InfiniteSuspend />
390
+ </Suspense>
391
+ </div>,
392
+ {
393
+ signal: controller.signal,
394
+ onError(x) {
395
+ errors.push(x.message);
396
+ },
397
},
359
- },
398
+ ),
399
);
400
401
// Technically we could still continue rendering the shell but currently the
435
436
const errors = [];
437
const controller = new AbortController();
399
- const resultPromise = ReactDOMFizzStatic.prerender(<App />, {
400
- signal: controller.signal,
401
- onError(x) {
402
- errors.push(x);
403
- return 'a digest';
404
- },
438
+ let resultPromise;
439
+ await serverAct(() => {
440
+ resultPromise = ReactDOMFizzStatic.prerender(<App />, {
441
+ signal: controller.signal,
442
+ onError(x) {
443
+ errors.push(x);
444
+ return 'a digest';
445
+ },
446
+ });
447
});
448
449
controller.abort('foobar');
478
479
const errors = [];
480
const controller = new AbortController();
439
- const resultPromise = ReactDOMFizzStatic.prerender(<App />, {
440
- signal: controller.signal,
441
- onError(x) {
442
- errors.push(x.message);
443
- return 'a digest';
444
- },
481
+ let resultPromise;
482
+ await serverAct(() => {
483
+ resultPromise = ReactDOMFizzStatic.prerender(<App />, {
484
+ signal: controller.signal,
485
+ onError(x) {
486
+ errors.push(x.message);
487
+ return 'a digest';
488
+ },
489
+ });
490
});
491
492
controller.abort(new Error('uh oh'));
516
);
517
}
518
474
- const prerendered = await ReactDOMFizzStatic.prerender(<App />);
519
+ const prerendered = await serverAct(() =>
520
+ ReactDOMFizzStatic.prerender(<App />),
521
+ );
522
expect(prerendered.postponed).not.toBe(null);
523
524
prerendering = false;
525
479
- const resumed = await ReactDOMFizzServer.resume(
480
- <App />,
481
- JSON.parse(JSON.stringify(prerendered.postponed)),
526
+ const resumed = await serverAct(() =>
527
+ ReactDOMFizzServer.resume(
528
+ <App />,
529
+ JSON.parse(JSON.stringify(prerendered.postponed)),
530
+ ),
531
);
532
533
await readIntoContainer(prerendered.prelude);
562
);
563
}
564
516
- const prerendered = await ReactDOMFizzStatic.prerender(<App />);
565
+ const prerendered = await serverAct(() =>
566
+ ReactDOMFizzStatic.prerender(<App />),
567
+ );
568
expect(prerendered.postponed).not.toBe(null);
569
570
prerendering = false;
571
521
- const resumed = await ReactDOMFizzServer.resume(
522
- <App />,
523
- JSON.parse(JSON.stringify(prerendered.postponed)),
572
+ const resumed = await serverAct(() =>
573
+ ReactDOMFizzServer.resume(
574
+ <App />,
575
+ JSON.parse(JSON.stringify(prerendered.postponed)),
576
+ ),
577
);
578
579
await readIntoContainer(prerendered.prelude);
605
);
606
}
607
555
- const prerendered = await ReactDOMFizzStatic.prerender(<App />);
608
+ const prerendered = await serverAct(() =>
609
+ ReactDOMFizzStatic.prerender(<App />),
610
+ );
611
expect(prerendered.postponed).not.toBe(null);
612
613
prerendering = false;
614
560
- const resumed = await ReactDOMFizzServer.resume(
561
- <App />,
562
- JSON.parse(JSON.stringify(prerendered.postponed)),
615
+ const resumed = await serverAct(() =>
616
+ ReactDOMFizzServer.resume(
617
+ <App />,
618
+ JSON.parse(JSON.stringify(prerendered.postponed)),
619
+ ),
620
);
621
622
await readIntoContainer(prerendered.prelude);
657
);
658
}
659
603
- const prerendered = await ReactDOMFizzStatic.prerender(<App />);
660
+ const prerendered = await serverAct(() =>
661
+ ReactDOMFizzStatic.prerender(<App />),
662
+ );
663
expect(prerendered.postponed).not.toBe(null);
664
665
prerendering = false;
666
608
- const resumed = await ReactDOMFizzServer.resume(
609
- <App />,
610
- JSON.parse(JSON.stringify(prerendered.postponed)),
667
+ const resumed = await serverAct(() =>
668
+ ReactDOMFizzServer.resume(
669
+ <App />,
670
+ JSON.parse(JSON.stringify(prerendered.postponed)),
671
+ ),
672
);
673
674
await readIntoContainer(prerendered.prelude);
702
);
703
}
704
644
- const prerendered = await ReactDOMFizzStatic.prerender(<App />);
705
+ const prerendered = await serverAct(() =>
706
+ ReactDOMFizzStatic.prerender(<App />),
707
+ );
708
expect(prerendered.postponed).not.toBe(null);
709
710
prerendering = false;
711
649
- const resumed = await ReactDOMFizzServer.resume(
650
- <App />,
651
- JSON.parse(JSON.stringify(prerendered.postponed)),
712
+ const resumed = await serverAct(() =>
713
+ ReactDOMFizzServer.resume(
714
+ <App />,
715
+ JSON.parse(JSON.stringify(prerendered.postponed)),
716
+ ),
717
);
718
719
await readIntoContainer(prerendered.prelude);
747
);
748
}
749
685
- const prerendered = await ReactDOMFizzStatic.prerender(<App />);
750
+ const prerendered = await serverAct(() =>
751
+ ReactDOMFizzStatic.prerender(<App />),
752
+ );
753
expect(prerendered.postponed).not.toBe(null);
754
755
prerendering = false;
756
690
- const content = await ReactDOMFizzServer.resume(
691
- <App />,
692
- JSON.parse(JSON.stringify(prerendered.postponed)),
757
+ const content = await serverAct(() =>
758
+ ReactDOMFizzServer.resume(
759
+ <App />,
760
+ JSON.parse(JSON.stringify(prerendered.postponed)),
761
+ ),
762
);
763
764
const html = await readContent(concat(prerendered.prelude, content));
817
{virtual: true},
818
);
819
751
- const prerendered = await ReactDOMFizzStatic.prerender(<App />, {
752
- bootstrapScripts: ['init.js'],
753
- });
820
+ const prerendered = await serverAct(() =>
821
+ ReactDOMFizzStatic.prerender(<App />, {
822
+ bootstrapScripts: ['init.js'],
823
+ }),
824
+ );
825
expect(prerendered.postponed).not.toBe(null);
826
827
await readIntoContainer(prerendered.prelude);
850
]);
851
852
prerendering = false;
782
- const content = await ReactDOMFizzServer.resume(
783
- <App />,
784
- JSON.parse(JSON.stringify(prerendered.postponed)),
853
+ const content = await serverAct(() =>
854
+ ReactDOMFizzServer.resume(
855
+ <App />,
856
+ JSON.parse(JSON.stringify(prerendered.postponed)),
857
+ ),
858
);
859
860
await readIntoContainer(content);
933
);
934
}
935
863
- const prerendered = await ReactDOMFizzStatic.prerender(<App />);
936
+ const prerendered = await serverAct(() =>
937
+ ReactDOMFizzStatic.prerender(<App />),
938
+ );
939
expect(prerendered.postponed).not.toBe(null);
940
941
prerendering = false;
942
868
- const resumed = await ReactDOMFizzServer.resume(
869
- <App />,
870
- JSON.parse(JSON.stringify(prerendered.postponed)),
943
+ const resumed = await serverAct(() =>
944
+ ReactDOMFizzServer.resume(
945
+ <App />,
946
+ JSON.parse(JSON.stringify(prerendered.postponed)),
947
+ ),
948
);
949
950
await readIntoContainer(prerendered.prelude);
988
);
989
}
990
914
- const prerendered = await ReactDOMFizzStatic.prerender(<App />);
991
+ const prerendered = await serverAct(() =>
992
+ ReactDOMFizzStatic.prerender(<App />),
993
+ );
994
expect(prerendered.postponed).not.toBe(null);
995
996
prerendering = false;
997
919
- const resumed = await ReactDOMFizzServer.resume(
920
- <App />,
921
- JSON.parse(JSON.stringify(prerendered.postponed)),
998
+ const resumed = await serverAct(() =>
999
+ ReactDOMFizzServer.resume(
1000
+ <App />,
1001
+ JSON.parse(JSON.stringify(prerendered.postponed)),
1002
+ ),
1003
);
1004
1005
await readIntoContainer(prerendered.prelude);
1038
);
1039
}
1040
960
- const prerendered = await ReactDOMFizzStatic.prerender(<App />);
1041
+ const prerendered = await serverAct(() =>
1042
+ ReactDOMFizzStatic.prerender(<App />),
1043
+ );
1044
// TODO: This should actually be null because we should've been able to fully
1045
// resolve the render on the server eventually, even though the fallback postponed.
1046
// So we should not need to resume.
1050
1051
expect(getVisibleChildren(container)).toEqual(<div>Outer</div>);
1052
970
- const resumed = await ReactDOMFizzServer.resume(
971
- <App />,
972
- JSON.parse(JSON.stringify(prerendered.postponed)),
1053
+ const resumed = await serverAct(() =>
1054
+ ReactDOMFizzServer.resume(
1055
+ <App />,
1056
+ JSON.parse(JSON.stringify(prerendered.postponed)),
1057
+ ),
1058
);
1059
1060
await readIntoContainer(resumed);
1105
);
1106
}
1107
1023
- const prerendered = await ReactDOMFizzStatic.prerender(<App />);
1108
+ const prerendered = await serverAct(() =>
1109
+ ReactDOMFizzStatic.prerender(<App />),
1110
+ );
1111
expect(prerendered.postponed).not.toBe(null);
1112
1113
await readIntoContainer(prerendered.prelude);
1120
prerendering = false;
1121
1122
const errors = [];
1036
- const resumed = await ReactDOMFizzServer.resume(
1037
- <App />,
1038
- JSON.parse(JSON.stringify(prerendered.postponed)),
1039
- {
1040
- onError(x) {
1041
- errors.push(x.message);
1123
+ const resumed = await serverAct(() =>
1124
+ ReactDOMFizzServer.resume(
1125
+ <App />,
1126
+ JSON.parse(JSON.stringify(prerendered.postponed)),
1127
+ {
1128
+ onError(x) {
1129
+ errors.push(x.message);
1130
+ },
1131
},
1043
- },
1132
+ ),
1133
);
1134
1135
expect(errors).toEqual([
1174
);
1175
}
1176
1088
- const prerendered = await ReactDOMFizzStatic.prerender(<App />);
1177
+ const prerendered = await serverAct(() =>
1178
+ ReactDOMFizzStatic.prerender(<App />),
1179
+ );
1180
expect(prerendered.postponed).not.toBe(null);
1181
1182
await readIntoContainer(prerendered.prelude);
1189
1190
const errors = [];
1191
1101
- const resumedPromise = ReactDOMFizzServer.resume(
1102
- <App />,
1103
- JSON.parse(JSON.stringify(prerendered.postponed)),
1104
- {
1105
- signal: controller.signal,
1106
- onError(x) {
1107
- errors.push(x);
1192
+ const resumedPromise = serverAct(() =>
1193
+ ReactDOMFizzServer.resume(
1194
+ <App />,
1195
+ JSON.parse(JSON.stringify(prerendered.postponed)),
1196
+ {
1197
+ signal: controller.signal,
1198
+ onError(x) {
1199
+ errors.push(x);
1200
+ },
1201
},
1109
- },
1202
+ ),
1203
);
1204
1205
controller.abort('abort');
1253
);
1254
}
1255
1163
- const prerendered = await ReactDOMFizzStatic.prerender(<App />);
1256
+ const prerendered = await serverAct(() =>
1257
+ ReactDOMFizzStatic.prerender(<App />),
1258
+ );
1259
expect(prerendered.postponed).not.toBe(null);
1260
1261
await readIntoContainer(prerendered.prelude);
1262
1263
prerendering = false;
1264
1170
- const resumedPromise = ReactDOMFizzServer.resume(
1171
- <App />,
1172
- JSON.parse(JSON.stringify(prerendered.postponed)),
1265
+ const resumedPromise = serverAct(() =>
1266
+ ReactDOMFizzServer.resume(
1267
+ <App />,
1268
+ JSON.parse(JSON.stringify(prerendered.postponed)),
1269
+ ),
1270
);
1271
1272
await jest.runAllTimers();
1301
);
1302
}
1303
1207
- const prerendered = await ReactDOMFizzStatic.prerender(<App />);
1304
+ const prerendered = await serverAct(() =>
1305
+ ReactDOMFizzStatic.prerender(<App />),
1306
+ );
1307
expect(prerendered.postponed).not.toBe(null);
1308
1309
prerendering = false;
1310
1311
expect(await readContent(prerendered.prelude)).toBe('');
1312
1214
- const content = await ReactDOMFizzServer.resume(
1215
- <App />,
1216
- JSON.parse(JSON.stringify(prerendered.postponed)),
1313
+ const content = await serverAct(() =>
1314
+ ReactDOMFizzServer.resume(
1315
+ <App />,
1316
+ JSON.parse(JSON.stringify(prerendered.postponed)),
1317
+ ),
1318
);
1319
1320
expect(await readContent(content)).toBe(
1347
);
1348
}
1349
1249
- const prerendered = await ReactDOMFizzStatic.prerender(<App />);
1350
+ const prerendered = await serverAct(() =>
1351
+ ReactDOMFizzStatic.prerender(<App />),
1352
+ );
1353
expect(prerendered.postponed).not.toBe(null);
1354
1355
prerendering = false;
1356
1357
expect(await readContent(prerendered.prelude)).toBe('');
1358
1256
- const content = await ReactDOMFizzServer.resume(
1257
- <App />,
1258
- JSON.parse(JSON.stringify(prerendered.postponed)),
1359
+ const content = await serverAct(() =>
1360
+ ReactDOMFizzServer.resume(
1361
+ <App />,
1362
+ JSON.parse(JSON.stringify(prerendered.postponed)),
1363
+ ),
1364
);
1365
1366
expect(await readContent(content)).toBe(
1398
);
1399
}
1400
1296
- const prerendered = await ReactDOMFizzStatic.prerender(<App />);
1401
+ const prerendered = await serverAct(() =>
1402
+ ReactDOMFizzStatic.prerender(<App />),
1403
+ );
1404
expect(prerendered.postponed).not.toBe(null);
1405
1406
prerendering = false;
1407
1408
expect(await readContent(prerendered.prelude)).toBe('');
1409
1303
- const content = await ReactDOMFizzServer.resume(
1304
- <App />,
1305
- JSON.parse(JSON.stringify(prerendered.postponed)),
1410
+ const content = await serverAct(() =>
1411
+ ReactDOMFizzServer.resume(
1412
+ <App />,
1413
+ JSON.parse(JSON.stringify(prerendered.postponed)),
1414
+ ),
1415
);
1416
1417
expect(await readContent(content)).toBe(
1465
);
1466
}
1467
1359
- const prerendered = await ReactDOMFizzStatic.prerender(<App />, {
1360
- onHeaders,
1361
- });
1468
+ const prerendered = await serverAct(() =>
1469
+ ReactDOMFizzStatic.prerender(<App />, {
1470
+ onHeaders,
1471
+ }),
1472
+ );
1473
expect(prerendered.postponed).not.toBe(null);
1474
1475
prerendering = false;
1486
}),
1487
);
1488
1378
- const content = await ReactDOMFizzServer.resume(
1379
- <App />,
1380
- JSON.parse(JSON.stringify(prerendered.postponed)),
1489
+ const content = await serverAct(() =>
1490
+ ReactDOMFizzServer.resume(
1491
+ <App />,
1492
+ JSON.parse(JSON.stringify(prerendered.postponed)),
1493
+ ),
1494
);
1495
1496
const decoder = new TextDecoder();
1504
1505
await 1;
1506
hasLoaded = true;
1394
- resolve();
1507
+ await serverAct(resolve);
1508
1509
while (true) {
1510
({value, done} = await reader.read());
1538
throw new Error('bad onHeaders');
1539
}
1540
1428
- const prerendered = await ReactDOMFizzStatic.prerender(<div>hello</div>, {
1429
- onHeaders,
1430
- onError,
1431
- });
1541
+ const prerendered = await serverAct(() =>
1542
+ ReactDOMFizzStatic.prerender(<div>hello</div>, {
1543
+ onHeaders,
1544
+ onError,
1545
+ }),
1546
+ );
1547
expect(prerendered.postponed).toBe(null);
1548
expect(errors).toEqual(['bad onHeaders']);
1549
1584
{virtual: true},
1585
);
1586
1472
- const prerendered = await ReactDOMFizzStatic.prerender(<App />, {
1473
- bootstrapScripts: ['init.js'],
1474
- });
1587
+ const prerendered = await serverAct(() =>
1588
+ ReactDOMFizzStatic.prerender(<App />, {
1589
+ bootstrapScripts: ['init.js'],
1590
+ }),
1591
+ );
1592
1593
const postponedSerializedState = JSON.stringify(prerendered.postponed);
1594
1614
1615
prerendering = false;
1616
1500
- const content = await ReactDOMFizzServer.resume(
1501
- <App />,
1502
- JSON.parse(postponedSerializedState),
1617
+ const content = await serverAct(() =>
1618
+ ReactDOMFizzServer.resume(<App />, JSON.parse(postponedSerializedState)),
1619
);
1620
1621
await readIntoContainer(content);
1658
);
1659
}
1660
1545
- const prerendered = await ReactDOMFizzStatic.prerender(<App />);
1661
+ const prerendered = await serverAct(() =>
1662
+ ReactDOMFizzStatic.prerender(<App />),
1663
+ );
1664
const postponedState = JSON.stringify(prerendered.postponed);
1665
1666
await readIntoContainer(prerendered.prelude);
1668
1669
isPrerendering = false;
1670
1553
- const dynamic = await ReactDOMFizzServer.resume(
1554
- <App />,
1555
- JSON.parse(postponedState),
1671
+ const dynamic = await serverAct(() =>
1672
+ ReactDOMFizzServer.resume(<App />, JSON.parse(postponedState)),
1673
);
1674
1675
await readIntoContainer(dynamic);