react-pdf: v3.3.6 causes `TypeError: layoutEngine is not a function` in @react-pdf/renderer when using Next.js

Describe the bug After upgrading from v3.3.5 to v3.3.6, my Next.js app’s react-pdf server-side generations are failing with:

TypeError: layoutEngine is not a function
    at Object.<anonymous> (/vercel/path0/node_modules/@react-pdf/layout/lib/index.cjs:308:16)
    at Module._compile (node:internal/modules/cjs/loader:1241:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1295:10)
    at Module.load (node:internal/modules/cjs/loader:1091:32)
    at Module._load (node:internal/modules/cjs/loader:938:12)
    at Module.require (node:internal/modules/cjs/loader:1115:19)
    at mod.require (/vercel/path0/node_modules/next/dist/server/require-hook.js:65:28)
    at require (node:internal/modules/helpers:130:18)
    at Object.<anonymous> (/vercel/path0/node_modules/@react-pdf/renderer/lib/react-pdf.cjs:14:22)
    at Module._compile (node:internal/modules/cjs/loader:1241:14)

Rolling back to v3.3.5 makes the issue go away.

To Reproduce

Minimal repro available here: https://stackblitz.com/edit/stackblitz-starters-rxmqpt?file=app%2Fapi%2Fbuild-pdf%2FMyDocument.tsx

Expected behavior react-pdf should not crash.

Screenshots

image

Desktop (please complete the following information):

  • OS: All
  • Browser: Chrome
  • React-pdf version: v3.3.6

About this issue

  • Original URL
  • State: closed
  • Created 5 months ago
  • Reactions: 5
  • Comments: 24 (4 by maintainers)

Commits related to this issue

Most upvoted comments

Will take a look today

If you have issues even after downgrading, downgrade @react-pdf/renderer to 3.3.5 and override @react-pdf/layout’s version to 3.10.4 in your package.json.

"overrides": {
  "@react-pdf/renderer": {
    "@react-pdf/layout": "3.10.4"
  }
}

pnpm:

"pnpm": {
  "overrides": {
    "@react-pdf/layout": "3.10.4"
  }
}

The error states clearly that layoutEngine is a function in @react-pdf/layout library, a direct dependency of @react-pdf/renderer. Unfortunately in @react-pdf/renderer’s package.json there is a caret (^) symbol next to the versions of its dependencies. That means package managers will try to install the newest version of its dependencies, including faulty @react-pdf/layout, regardless of which version of @react-pdf/renderer you install.

And this is why you should always pin your dependencies.

@wojtekmaj Thanks for your help, is this issue fixed ?

I get the same error using the latest version also on Next.js, but doing the following https://github.com/diegomura/react-pdf/issues/2603#issuecomment-1928973440 fixed the issue for me!

I have a strong suspicion that it is my fault (specifically, in my PR #2594).

Before:

var layoutEngine = require('@react-pdf/textkit');
// …
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
// …
var layoutEngine__default = /*#__PURE__*/_interopDefaultLegacy(layoutEngine);
// …
var engine = layoutEngine__default["default"](engines);

after:

var layoutEngine = require('@react-pdf/textkit');
// …
var engine = layoutEngine(engines);

It must have something to do with output.interop Rollup option.

I just updated using ncu (which updated all the version numbers) and I started getting this error. I am not a fan of “rolling back”, but I will try it for now. Any update on this issue?

Same error with node and express project