Package detail

@peggyjs/from-mem

peggyjs477.6kMIT3.0.3

Load a string as if it was an esm or commonjs module with a given filename.

vm, module, esm, eval

readme

@peggyjs/from-mem

Execute some text in memory as if it was a file with a given name, so that all of the imports/require's happen out of that directory's associated node_modules directory or relative to where the file would have been.

This is NOT intended to be a security boundary. In particular, all files will be required or imported through the node module cache.

This code was originally a part of peggy, but was refactored out when it was needed in a related project. Several ideas in this code came from the module-from-string and eval modules -- thanks to those authors.

Installation

npm install @peggyjs/from-mem

Usage

import fromMem from "@peggyjs/from-mem"; // or require("@peggyjs/from-mem")
const consoleOutput = {};
const result = await fromMem(`
import foo from "../foo.js"; // Loads ./test/foo.js

console.log("hi");
export async function bar() {
  return await foo() + 2;
}
`, {
  filename: path.join(__dirname, "test", "fixtures", "test.js"),
  format: "es",
  consoleOutput,
  exec: `
console.log("there");
const b = await IMPORTED.bar();
return b + arg;
`;
  arg: 12,
});

// consoleOutput.out === "hi\nthere\n"

filename is the only required option, unless you are processing an ES6 module and your runtime does not have --experimental_vm_modules set. In that case, you must pass in an exec option, and may pass in an arg also.

Full API docs are available.

Caveats

  • This module has a strong requirement for node 20.8+ at runtime when using the es6 format, due to a bug that crashes node in node's vm module that got fixed there and in 21.0. There is a runtime check to prevent the crash.

Tests codecov