-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Description
When using @react-pdf/renderer in a Next.js App Router project via an external package (e.g. from a monorepo), PDF generation fails at runtime.
However, the same code works correctly if @react-pdf/renderer is installed directly in the Next.js application.
TypeError: Cannot read properties of undefined (reading 'S')Thrown during renderToStream.
Environment
• Next.js: 15 (App Router)
• React: 19
• Node.js: 22
• Monorepo: Turborepo
• Package manager: pnpm
• @react-pdf/renderer: 4.3.2
Project structure
apps/
web/ ← Next.js App Router app
packages/
pdf/ ← custom package wrapping @react-pdf/renderer
packages/pdf exports React components based on @react-pdf/renderer:
// packages/pdf/components.ts
export { Document, Page, Text } from "@react-pdf/renderer";❌ Failing case (renderer used via external package)
// apps/web/app/api/pdf/route.tsx
import { Document, Page, Text } from "@repo/pdf/components";
import { renderToStream } from "@repo/pdf/server";
export async function GET() {
const stream = await renderToStream(
<Document>
<Page>
<Text>Hello</Text>
</Page>
</Document>
);
return new Response(stream);
}Result:
TypeError: Cannot read properties of undefined (reading 'S')✅ Working case (renderer installed in app)
// apps/web/app/api/pdf/route.tsx
import { Document, Page, Text, renderToStream } from "@react-pdf/renderer";
export async function GET() {
const stream = await renderToStream(
<Document>
<Page>
<Text>Hello</Text>
</Page>
</Document>
);
return new Response(stream);
}✅ Works without errors.
Key observation
• JSX, runtime, and code are identical
• Only difference:
• ❌ @react-pdf/renderer resolved from external package
• ✅ @react-pdf/renderer resolved from Next.js app itself
This indicates a possible issue with:
• multiple React renderers / reconciler instances
• module resolution in monorepos
• assumptions inside @react-pdf/renderer about React element identity
• interaction with Next.js App Router (RSC)