234
suspend = true;
235
ReactDOMClient.hydrateRoot(container, <App />, {
236
onRecoverableError(error) {
237
- Scheduler.log(normalizeError(error.message));
237
+ Scheduler.log('onRecoverableError: ' + normalizeError(error.message));
238
+ if (error.cause) {
239
+ Scheduler.log('Cause: ' + normalizeError(error.cause.message));
240
+ }
241
},
242
});
243
await waitForAll([]);
305
306
ReactDOMClient.hydrateRoot(container, <App />, {
307
onRecoverableError(error) {
305
- Scheduler.log(normalizeError(error.message));
308
+ Scheduler.log('onRecoverableError: ' + normalizeError(error.message));
309
+ if (error.cause) {
310
+ Scheduler.log('Cause: ' + normalizeError(error.cause.message));
311
+ }
312
},
313
});
314
await waitForAll(['Suspend']);
337
'Component',
338
'Component',
339
// Hydration mismatch is logged
334
- "Hydration failed because the server rendered HTML didn't match the client.",
335
- 'There was an error while hydrating this Suspense boundary.',
340
+ "onRecoverableError: Hydration failed because the server rendered HTML didn't match the client.",
341
]);
342
343
// Client rendered - suspense comment nodes removed
398
399
ReactDOMClient.hydrateRoot(container, <App />, {
400
onRecoverableError(error) {
396
- Scheduler.log(normalizeError(error.message));
401
+ Scheduler.log('onRecoverableError: ' + normalizeError(error.message));
402
+ if (error.cause) {
403
+ Scheduler.log('Cause: ' + normalizeError(error.cause.message));
404
+ }
405
},
406
});
407
await waitForAll(['Suspend']);
421
'Component',
422
'Hello',
423
'Component',
416
- "Hydration failed because the server rendered HTML didn't match the client.",
417
- 'There was an error while hydrating this Suspense boundary.',
424
+ "onRecoverableError: Hydration failed because the server rendered HTML didn't match the client.",
425
]);
426
jest.runAllTimers();
427
482
483
ReactDOMClient.hydrateRoot(container, <App />, {
484
onRecoverableError(error) {
478
- Scheduler.log(normalizeError(error.message));
485
+ Scheduler.log('onRecoverableError: ' + normalizeError(error.message));
486
+ if (error.cause) {
487
+ Scheduler.log('Cause: ' + normalizeError(error.cause.message));
488
+ }
489
},
490
});
491
await waitForAll(['Suspend']);
505
'Component',
506
'Hello',
507
'Component',
498
- "Hydration failed because the server rendered HTML didn't match the client.",
499
- 'There was an error while hydrating this Suspense boundary.',
508
+ "onRecoverableError: Hydration failed because the server rendered HTML didn't match the client.",
509
]);
510
jest.runAllTimers();
511
576
577
ReactDOMClient.hydrateRoot(container, <App />, {
578
onRecoverableError(error) {
570
- Scheduler.log(normalizeError(error.message));
579
+ Scheduler.log('onRecoverableError: ' + normalizeError(error.message));
580
+ if (error.cause) {
581
+ Scheduler.log('Cause: ' + normalizeError(error.cause.message));
582
+ }
583
},
584
});
585
await waitForAll(['Component', 'Suspend']);
599
'Hello',
600
'Component',
601
'Hello',
590
- "Hydration failed because the server rendered HTML didn't match the client.",
591
- 'There was an error while hydrating this Suspense boundary.',
602
+ "onRecoverableError: Hydration failed because the server rendered HTML didn't match the client.",
603
]);
604
jest.runAllTimers();
605
672
673
ReactDOMClient.hydrateRoot(container, <App />, {
674
onRecoverableError(error) {
664
- Scheduler.log(normalizeError(error.message));
675
+ Scheduler.log('onRecoverableError: ' + normalizeError(error.message));
676
+ if (error.cause) {
677
+ Scheduler.log('Cause: ' + normalizeError(error.cause.message));
678
+ }
679
},
680
});
681
await waitForAll([
683
'Component',
684
'Suspend',
685
'Fallback',
672
- "Hydration failed because the server rendered HTML didn't match the client.",
673
- 'There was an error while hydrating this Suspense boundary.',
686
+ "onRecoverableError: Hydration failed because the server rendered HTML didn't match the client.",
687
]);
688
jest.runAllTimers();
689
753
754
ReactDOMClient.hydrateRoot(container, <App />, {
755
onRecoverableError(error) {
743
- Scheduler.log(normalizeError(error.message));
756
+ Scheduler.log('onRecoverableError: ' + normalizeError(error.message));
757
+ if (error.cause) {
758
+ Scheduler.log('Cause: ' + normalizeError(error.cause.message));
759
+ }
760
},
761
});
762
await waitForAll([
764
'Component',
765
'Suspend',
766
'Fallback',
751
- "Hydration failed because the server rendered HTML didn't match the client.",
752
- 'There was an error while hydrating this Suspense boundary.',
767
+ "onRecoverableError: Hydration failed because the server rendered HTML didn't match the client.",
768
]);
769
jest.runAllTimers();
770
833
834
ReactDOMClient.hydrateRoot(container, <App />, {
835
onRecoverableError(error) {
821
- Scheduler.log(normalizeError(error.message));
836
+ Scheduler.log('onRecoverableError: ' + normalizeError(error.message));
837
+ if (error.cause) {
838
+ Scheduler.log('Cause: ' + normalizeError(error.cause.message));
839
+ }
840
},
841
});
842
await waitForAll([
844
'Component',
845
'Suspend',
846
'Fallback',
829
- "Hydration failed because the server rendered HTML didn't match the client.",
830
- 'There was an error while hydrating this Suspense boundary.',
847
+ "onRecoverableError: Hydration failed because the server rendered HTML didn't match the client.",
848
]);
849
jest.runAllTimers();
850
919
920
ReactDOMClient.hydrateRoot(container, <App />, {
921
onRecoverableError(error) {
905
- Scheduler.log(normalizeError(error.message));
922
+ Scheduler.log('onRecoverableError: ' + normalizeError(error.message));
923
+ if (error.cause) {
924
+ Scheduler.log('Cause: ' + normalizeError(error.cause.message));
925
+ }
926
},
927
});
928
await waitForAll([
930
'Component',
931
'Suspend',
932
'Fallback',
913
- "Hydration failed because the server rendered HTML didn't match the client.",
914
- 'There was an error while hydrating this Suspense boundary.',
933
+ "onRecoverableError: Hydration failed because the server rendered HTML didn't match the client.",
934
]);
935
jest.runAllTimers();
936
1013
deleted.push(node);
1014
},
1015
onRecoverableError(error) {
997
- Scheduler.log(normalizeError(error.message));
1016
+ Scheduler.log('onRecoverableError: ' + normalizeError(error.message));
1017
+ if (error.cause) {
1018
+ Scheduler.log('Cause: ' + normalizeError(error.cause.message));
1019
+ }
1020
},
1021
});
1022
await waitForAll([]);
1114
await act(() => {
1115
ReactDOMClient.hydrateRoot(container, <App hasB={false} />, {
1116
onRecoverableError(error) {
1095
- Scheduler.log(normalizeError(error.message));
1117
+ Scheduler.log('onRecoverableError: ' + normalizeError(error.message));
1118
+ if (error.cause) {
1119
+ Scheduler.log('Cause: ' + normalizeError(error.cause.message));
1120
+ }
1121
},
1122
});
1123
});
1128
assertLog([
1129
'Server rendered',
1130
'Client rendered',
1106
- "Hydration failed because the server rendered HTML didn't match the client.",
1107
- 'There was an error while hydrating this Suspense boundary.',
1131
+ "onRecoverableError: Hydration failed because the server rendered HTML didn't match the client.",
1132
]);
1133
expect(ref.current).not.toBe(span);
1134
});
1176
await act(() => {
1177
ReactDOMClient.hydrateRoot(container, <App hasB={false} />, {
1178
onRecoverableError(error) {
1155
- Scheduler.log(normalizeError(error.message));
1179
+ Scheduler.log('onRecoverableError: ' + normalizeError(error.message));
1180
+ if (error.cause) {
1181
+ Scheduler.log('Cause: ' + normalizeError(error.cause.message));
1182
+ }
1183
},
1184
});
1185
});
1189
});
1190
1191
assertLog([
1165
- "Hydration failed because the server rendered HTML didn't match the client.",
1166
- 'There was an error while hydrating this Suspense boundary.',
1192
+ "onRecoverableError: Hydration failed because the server rendered HTML didn't match the client.",
1193
]);
1194
1195
expect(container.innerHTML).toContain('<span>A</span>');
1227
await act(() => {
1228
ReactDOMClient.hydrateRoot(container, <App hasB={false} />, {
1229
onRecoverableError(error) {
1204
- Scheduler.log(normalizeError(error.message));
1230
+ Scheduler.log('onRecoverableError: ' + normalizeError(error.message));
1231
+ if (error.cause) {
1232
+ Scheduler.log('Cause: ' + normalizeError(error.cause.message));
1233
+ }
1234
},
1235
});
1236
});
1237
assertLog([
1209
- "Hydration failed because the server rendered HTML didn't match the client.",
1210
- 'There was an error while hydrating this Suspense boundary.',
1238
+ "onRecoverableError: Hydration failed because the server rendered HTML didn't match the client.",
1239
]);
1240
1241
expect(container.innerHTML).toContain('<span>A</span>');
1594
<App text="Hello" className="hello" />,
1595
{
1596
onRecoverableError(error) {
1569
- Scheduler.log(normalizeError(error.message));
1597
+ Scheduler.log('onRecoverableError: ' + normalizeError(error.message));
1598
+ if (error.cause) {
1599
+ Scheduler.log('Cause: ' + normalizeError(error.cause.message));
1600
+ }
1601
},
1602
},
1603
);
1675
<App text="Hello" className="hello" />,
1676
{
1677
onRecoverableError(error) {
1647
- Scheduler.log(normalizeError(error.message));
1678
+ Scheduler.log('onRecoverableError: ' + normalizeError(error.message));
1679
+ if (error.cause) {
1680
+ Scheduler.log('Cause: ' + normalizeError(error.cause.message));
1681
+ }
1682
},
1683
},
1684
);
1754
<App text="Hello" className="hello" />,
1755
{
1756
onRecoverableError(error) {
1723
- Scheduler.log(normalizeError(error.message));
1757
+ Scheduler.log('onRecoverableError: ' + normalizeError(error.message));
1758
+ if (error.cause) {
1759
+ Scheduler.log('Cause: ' + normalizeError(error.cause.message));
1760
+ }
1761
},
1762
},
1763
);
2065
</Context.Provider>,
2066
{
2067
onRecoverableError(error) {
2031
- Scheduler.log(normalizeError(error.message));
2068
+ Scheduler.log('onRecoverableError: ' + normalizeError(error.message));
2069
+ if (error.cause) {
2070
+ Scheduler.log('Cause: ' + normalizeError(error.cause.message));
2071
+ }
2072
},
2073
},
2074
);
2143
suspend = false;
2144
ReactDOMClient.hydrateRoot(container, <App />, {
2145
onRecoverableError(error) {
2106
- Scheduler.log(normalizeError(error.message));
2146
+ Scheduler.log('onRecoverableError: ' + normalizeError(error.message));
2147
+ if (error.cause) {
2148
+ Scheduler.log('Cause: ' + normalizeError(error.cause.message));
2149
+ }
2150
},
2151
});
2152
if (__DEV__) {
2153
await waitForAll([
2111
- 'Switched to client rendering because the server rendering aborted due to:\n\n' +
2154
+ 'onRecoverableError: Switched to client rendering because the server rendering aborted due to:\n\n' +
2155
'The server used' +
2156
' "renderToString" which does not support Suspense.',
2157
]);
2158
} else {
2159
await waitForAll([
2117
- 'The server could not finish this Suspense boundary, likely due to ' +
2160
+ 'onRecoverableError: The server could not finish this Suspense boundary, likely due to ' +
2161
'an error during server rendering.',
2162
]);
2163
}
2216
suspend = false;
2217
ReactDOMClient.hydrateRoot(container, <App />, {
2218
onRecoverableError(error) {
2176
- Scheduler.log(normalizeError(error.message));
2219
+ Scheduler.log('onRecoverableError: ' + normalizeError(error.message));
2220
+ if (error.cause) {
2221
+ Scheduler.log('Cause: ' + normalizeError(error.cause.message));
2222
+ }
2223
},
2224
});
2225
if (__DEV__) {
2226
await waitForAll([
2181
- 'Switched to client rendering because the server rendering aborted due to:\n\n' +
2227
+ 'onRecoverableError: Switched to client rendering because the server rendering aborted due to:\n\n' +
2228
'The server used' +
2229
' "renderToString" which does not support Suspense.',
2230
]);
2231
} else {
2232
await waitForAll([
2187
- 'The server could not finish this Suspense boundary, likely due to ' +
2233
+ 'onRecoverableError: The server could not finish this Suspense boundary, likely due to ' +
2234
'an error during server rendering.',
2235
]);
2236
}
2294
suspend = false;
2295
ReactDOMClient.hydrateRoot(container, <App />, {
2296
onRecoverableError(error) {
2251
- Scheduler.log(normalizeError(error.message));
2297
+ Scheduler.log('onRecoverableError: ' + normalizeError(error.message));
2298
+ if (error.cause) {
2299
+ Scheduler.log('Cause: ' + normalizeError(error.cause.message));
2300
+ }
2301
},
2302
});
2303
if (__DEV__) {
2304
await waitForAll([
2256
- 'Switched to client rendering because the server rendering aborted due to:\n\n' +
2305
+ 'onRecoverableError: Switched to client rendering because the server rendering aborted due to:\n\n' +
2306
'The server used' +
2307
' "renderToString" which does not support Suspense.',
2308
]);
2309
} else {
2310
await waitForAll([
2262
- 'The server could not finish this Suspense boundary, likely due to ' +
2311
+ 'onRecoverableError: The server could not finish this Suspense boundary, likely due to ' +
2312
'an error during server rendering.',
2313
]);
2314
}
2616
2617
ReactDOMClient.hydrateRoot(container, <App />, {
2618
onRecoverableError(error) {
2570
- Scheduler.log(normalizeError(error.message));
2619
+ Scheduler.log('onRecoverableError: ' + normalizeError(error.message));
2620
+ if (error.cause) {
2621
+ Scheduler.log('Cause: ' + normalizeError(error.cause.message));
2622
+ }
2623
},
2624
});
2625
2626
suspend = true;
2627
if (__DEV__) {
2628
await waitForAll([
2577
- 'Switched to client rendering because the server rendering aborted due to:\n\n' +
2629
+ 'onRecoverableError: Switched to client rendering because the server rendering aborted due to:\n\n' +
2630
'The server used' +
2631
' "renderToString" which does not support Suspense.',
2632
]);
2633
} else {
2634
await waitForAll([
2583
- 'The server could not finish this Suspense boundary, likely due to ' +
2635
+ 'onRecoverableError: The server could not finish this Suspense boundary, likely due to ' +
2636
'an error during server rendering.',
2637
]);
2638
}
2692
suspend = false;
2693
ReactDOMClient.hydrateRoot(container, <App />, {
2694
onRecoverableError(error) {
2643
- Scheduler.log(normalizeError(error.message));
2695
+ Scheduler.log('onRecoverableError: ' + normalizeError(error.message));
2696
+ if (error.cause) {
2697
+ Scheduler.log('Cause: ' + normalizeError(error.cause.message));
2698
+ }
2699
},
2700
});
2701
if (__DEV__) {
2702
await waitForAll([
2648
- 'Switched to client rendering because the server rendering aborted due to:\n\n' +
2703
+ 'onRecoverableError: Switched to client rendering because the server rendering aborted due to:\n\n' +
2704
'The server used' +
2705
' "renderToString" which does not support Suspense.',
2706
]);
2707
} else {
2708
await waitForAll([
2654
- 'The server could not finish this Suspense boundary, likely due to ' +
2709
+ 'onRecoverableError: The server could not finish this Suspense boundary, likely due to ' +
2710
'an error during server rendering.',
2711
]);
2712
}
2808
</ClassName.Provider>,
2809
{
2810
onRecoverableError(error) {
2756
- Scheduler.log(normalizeError(error.message));
2811
+ Scheduler.log('onRecoverableError: ' + normalizeError(error.message));
2812
+ if (error.cause) {
2813
+ Scheduler.log('Cause: ' + normalizeError(error.cause.message));
2814
+ }
2815
},
2816
},
2817
);
3609
await act(() =>
3610
ReactDOMClient.hydrateRoot(container, <App />, {
3611
onRecoverableError(error) {
3554
- Scheduler.log('Log recoverable error: ' + error.message);
3612
+ Scheduler.log('onRecoverableError: ' + error.message);
3613
},
3614
}),
3615
);
3848
await act(() => {
3849
ReactDOMClient.hydrateRoot(container, <App isClient={true} />, {
3850
onRecoverableError(error) {
3793
- Scheduler.log(
3794
- 'Log recoverable error: ' + normalizeError(error.message),
3795
- );
3851
+ Scheduler.log('onRecoverableError: ' + normalizeError(error.message));
3852
+ if (error.cause) {
3853
+ Scheduler.log('Cause: ' + normalizeError(error.cause.message));
3854
+ }
3855
},
3856
});
3857
});
3858
assertLog([
3800
- "Log recoverable error: Hydration failed because the server rendered HTML didn't match the client.",
3801
- 'Log recoverable error: There was an error while hydrating.',
3859
+ "onRecoverableError: Hydration failed because the server rendered HTML didn't match the client.",
3860
]);
3861
3862
// We show fallback state when mismatch happens at root
3886
await act(() => {
3887
ReactDOMClient.hydrateRoot(container, <DirectTextChild text="bad" />, {
3888
onRecoverableError(error) {
3831
- Scheduler.log(normalizeError(error.message));
3889
+ Scheduler.log('onRecoverableError: ' + normalizeError(error.message));
3890
+ if (error.cause) {
3891
+ Scheduler.log('Cause: ' + normalizeError(error.cause.message));
3892
+ }
3893
},
3894
});
3895
});
3896
assertLog([
3836
- "Hydration failed because the server rendered HTML didn't match the client.",
3837
- 'There was an error while hydrating.',
3897
+ "onRecoverableError: Hydration failed because the server rendered HTML didn't match the client.",
3898
]);
3899
});
3900
3922
<TextChildWithSibling text="bad" />,
3923
{
3924
onRecoverableError(error) {
3865
- Scheduler.log(normalizeError(error.message));
3925
+ Scheduler.log(
3926
+ 'onRecoverableError: ' + normalizeError(error.message),
3927
+ );
3928
+ if (error.cause) {
3929
+ Scheduler.log('Cause: ' + normalizeError(error.cause.message));
3930
+ }
3931
},
3932
},
3933
);
3934
});
3935
assertLog([
3871
- "Hydration failed because the server rendered HTML didn't match the client.",
3872
- 'There was an error while hydrating.',
3936
+ "onRecoverableError: Hydration failed because the server rendered HTML didn't match the client.",
3937
]);
3938
});
3939
});