(renderingProps: RenderRouteInfo)
| 796 | } |
| 797 | |
| 798 | async function render(renderingProps: RenderRouteInfo): Promise<void> { |
| 799 | // if an error occurs in a server-side page (e.g. in getInitialProps), |
| 800 | // skip re-rendering the error page client-side as data-fetching operations |
| 801 | // will already have been done on the server and NEXT_DATA contains the correct |
| 802 | // data for straight-forward hydration of the error page |
| 803 | if ( |
| 804 | renderingProps.err && |
| 805 | // renderingProps.Component might be undefined if there is a top/module-level error |
| 806 | (typeof renderingProps.Component === 'undefined' || |
| 807 | !renderingProps.isHydratePass) |
| 808 | ) { |
| 809 | await renderError(renderingProps) |
| 810 | return |
| 811 | } |
| 812 | |
| 813 | try { |
| 814 | await doRender(renderingProps) |
| 815 | } catch (err) { |
| 816 | const renderErr = getProperError(err) |
| 817 | // bubble up cancelation errors |
| 818 | if ((renderErr as Error & { cancelled?: boolean }).cancelled) { |
| 819 | throw renderErr |
| 820 | } |
| 821 | |
| 822 | if (process.env.NODE_ENV === 'development') { |
| 823 | // Ensure this error is displayed in the overlay in development |
| 824 | setTimeout(() => { |
| 825 | throw renderErr |
| 826 | }) |
| 827 | } |
| 828 | await renderError({ ...renderingProps, err: renderErr }) |
| 829 | } |
| 830 | } |
| 831 | |
| 832 | export async function hydrate(opts?: { beforeRender?: () => Promise<void> }) { |
| 833 | let initialErr = initialData.err |
no test coverage detected