I regularly use Gitbook, a Node.js software that converts a set of markdown files into an ebook. Recently, while trying to generate a PDF using the command gitbook pdf ., I encountered a strange error:

➜ ebook git:(master) ✗ gitbook pdf .
/usr/local/lib/node\_modules/gitbook-cli/node\_modules/npm/node\_modules/graceful-fs/polyfills.js:287
 if (cb) cb.apply(this, arguments)
 ^

TypeError: cb.apply is not a function
 at /usr/local/lib/node\_modules/gitbook-cli/node\_modules/npm/node\_modules/graceful-fs/polyfills.js:287:18

The error message “cb.apply is not a function” left me wondering about its meaning and why it occurred at that moment. I hadn’t recently updated the gitbook package, but I realized that I had updated my Node.js version. This raised the suspicion that the Node.js version could be the cause.

Upon investigation, I discovered that the error originated from the /usr/local/lib/node_modules/gitbook-cli/node_modules/npm/node_modules/graceful-fs/polyfills.js file. This file is part of the graceful-js npm package, which is installed over 33 million times per week. It aims to improve the built-in Node.js fs module.

One of the improvements made by this package seemed to conflict with my workflow. However, I did not have much time to investigate the exact reason why my Node.js version caused this problem with Gitbook and graceful-js.

To fix the issue quickly, I decided to modify the /usr/local/lib/node_modules/gitbook-cli/node_modules/npm/node_modules/graceful-fs/polyfills.js file directly.

Here is the problematic function in the file:

function statFix (orig) {
 if (!orig) return orig
 return function (target, cb) {
 return orig.call(fs, target, function (er, stats) {
 if (!stats) return cb.apply(this, arguments)
 if (stats.uid < 0) stats.uid += 0x100000000
 if (stats.gid < 0) stats.gid += 0x100000000
 if (cb) cb.apply(this, arguments)
 })
 }
}

This function seems to be addressing an issue in older versions of Node.js, which shouldn’t be relevant to my situation.

I noticed that this function is used in lines 62-64 of the same file:

fs.stat = statFix(fs.stat)
fs.fstat = statFix(fs.fstat)
fs.lstat = statFix(fs.lstat)

To temporarily bypass this problematic code, I commented out those lines:

// fs.stat = statFix(fs.stat)
// fs.fstat = statFix(fs.fstat)
// fs.lstat = statFix(fs.lstat)

After making this change, the gitbook command worked fine, and I successfully generated the PDF I needed.