diff --git a/packages/docusaurus/src/client/renderToHtml.tsx b/packages/docusaurus/src/client/renderToHtml.tsx index b9131581b05f..48f03219a455 100644 --- a/packages/docusaurus/src/client/renderToHtml.tsx +++ b/packages/docusaurus/src/client/renderToHtml.tsx @@ -6,11 +6,31 @@ */ import type {ReactNode} from 'react'; -import {renderToReadableStream} from 'react-dom/server.browser'; +// @ts-expect-error: see https://github.com/facebook/react/issues/31134 +import {renderToReadableStream as renderToReadableStreamImpl} from 'react-dom/server.browser'; +import { + renderToString, + type renderToReadableStream as renderToReadableStreamType, +} from 'react-dom/server'; import {text} from 'stream/consumers'; +const renderToReadableStream: typeof renderToReadableStreamType = + renderToReadableStreamImpl; + export async function renderToHtml(app: ReactNode): Promise { - const stream = await renderToReadableStream(app); - await stream.allReady; - return text(stream); + return new Promise((resolve, reject) => { + renderToReadableStream(app, { + onError: (error) => reject(error), + }).then(async (stream) => { + await stream.allReady; + // @ts-expect-error: it works fine + const html = await text(stream); + + if (html !== renderToString(app)) { + throw new Error('Bad'); + } + + resolve(html); + }, reject); + }); }