diff --git a/packages/render/package.json b/packages/render/package.json index 483bcc3ad9..636f708a44 100644 --- a/packages/render/package.json +++ b/packages/render/package.json @@ -46,7 +46,8 @@ "html-to-text": "9.0.5", "js-beautify": "^1.14.11", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "react-promise-suspense": "0.3.4" }, "devDependencies": { "@babel/preset-react": "7.23.3", diff --git a/packages/render/src/__snapshots__/render-async-node.spec.tsx.snap b/packages/render/src/__snapshots__/render-async-node.spec.tsx.snap new file mode 100644 index 0000000000..b2d543c0ca --- /dev/null +++ b/packages/render/src/__snapshots__/render-async-node.spec.tsx.snap @@ -0,0 +1,51 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`renderAsync on node environments > that it properly waits for Suepsense boundaries to resolve before resolving 1`] = ` +"
+ + + Example Domain + + + + + + + + +
+

Example Domain

+

This domain is for use in illustrative examples in documents. You may use this + domain in literature without prior coordination or asking for permission.

+

More information...

+
+ + +
" +`; diff --git a/packages/render/src/render-async-node.spec.tsx b/packages/render/src/render-async-node.spec.tsx index 1aad42c89c..405166528e 100644 --- a/packages/render/src/render-async-node.spec.tsx +++ b/packages/render/src/render-async-node.spec.tsx @@ -2,6 +2,8 @@ * @vitest-environment node */ +import usePromise from "react-promise-suspense"; +import { Suspense } from "react"; import { Template } from "./utils/template"; import { Preview } from "./utils/preview"; import { renderAsync } from "./render-async"; @@ -36,6 +38,25 @@ describe("renderAsync on node environments", () => { vi.resetAllMocks(); }); + it("that it properly waits for Suepsense boundaries to resolve before resolving", async () => { + const EmailTemplate = () => { + const html = usePromise( + () => fetch("https://example.com").then((res) => res.text()), + [], + ); + + return
; + }; + + const renderedTemplate = await renderAsync( + + + , + ); + + expect(renderedTemplate).toMatchSnapshot(); + }); + it("converts a React component into HTML", async () => { const actualOutput = await renderAsync(