import quibble from "quibble";
import { vol, fs as fsm } from "memfs";
vol.fromJSON({
"foo.txt": "foo",
});
quibble("fs", { ...fsm });
const fse = (await import("fs-extra")).default;
await fse.stat("foo.txt");
In this use case, the ESM-Loader loads the fs-extra module with it's internal cjs loader. Because quibble restores the Module._cache entry, the cjs loader only returns an empty object for the exports:
TypeError: fse.stat is not a function
Hint:
If I remove the line delete Module._cache[filename] (in doAndRestoreCache) my use-case works.
I think the ESM Loader reads the exports from the cached value after quibble deleted it.
If I use require to load fs-extra, there is no problem:
I want to fake the
fs
package usingmemfs
. My production code usesfs-extra
.The require-stack looks like: app.js (ESM) -> fs-extra (CJS) -> graceful-fs (CJS) -> fs (Built-In)
Reproduction
Example:
In this use case, the ESM-Loader loads the fs-extra module with it's internal cjs loader. Because quibble restores the
Module._cache
entry, the cjs loader only returns an empty object for the exports:TypeError: fse.stat is not a function
Hint:
If I remove the line
delete Module._cache[filename]
(indoAndRestoreCache
) my use-case works. I think the ESM Loader reads the exports from the cached value after quibble deleted it.If I use require to load fs-extra, there is no problem: