Bun

class

vm.SyntheticModule

class SyntheticModule

This feature is only available with the --experimental-vm-modules command flag enabled.

The vm.SyntheticModule class provides the Synthetic Module Record as defined in the WebIDL specification. The purpose of synthetic modules is to provide a generic interface for exposing non-JavaScript sources to ECMAScript module graphs.

import vm from 'node:vm';

const source = '{ "a": 1 }';
const module = new vm.SyntheticModule(['default'], function() {
  const obj = JSON.parse(source);
  this.setExport('default', obj);
});

// Use `module` in linking...
  • dependencySpecifiers: readonly string[]

    The specifiers of all dependencies of this module. The returned array is frozen to disallow any changes to it.

    Corresponds to the [[RequestedModules]] field of Cyclic Module Record s in the ECMAScript specification.

  • error: any

    If the module.status is 'errored', this property contains the exception thrown by the module during evaluation. If the status is anything else, accessing this property will result in a thrown exception.

    The value undefined cannot be used for cases where there is not a thrown exception due to possible ambiguity with throw undefined;.

    Corresponds to the [[EvaluationError]] field of Cyclic Module Record s in the ECMAScript specification.

  • identifier: string

    The identifier of the current module, as set in the constructor.

  • namespace: Object

    The namespace object of the module. This is only available after linking (module.link()) has completed.

    Corresponds to the GetModuleNamespace abstract operation in the ECMAScript specification.

  • status: ModuleStatus

    The current status of the module. Will be one of:

    • 'unlinked': module.link() has not yet been called.
    • 'linking': module.link() has been called, but not all Promises returned by the linker function have been resolved yet.
    • 'linked': The module has been linked successfully, and all of its dependencies are linked, but module.evaluate() has not yet been called.
    • 'evaluating': The module is being evaluated through a module.evaluate() on itself or a parent module.
    • 'evaluated': The module has been successfully evaluated.
    • 'errored': The module has been evaluated, but an exception was thrown.

    Other than 'errored', this status string corresponds to the specification's Cyclic Module Record's [[Status]] field. 'errored' corresponds to 'evaluated' in the specification, but with [[EvaluationError]] set to a value that is not undefined.

  • ): Promise<void>;

    Evaluate the module.

    This must be called after the module has been linked; otherwise it will reject. It could be called also when the module has already been evaluated, in which case it will either do nothing if the initial evaluation ended in success (module.status is 'evaluated') or it will re-throw the exception that the initial evaluation resulted in (module.status is 'errored').

    This method cannot be called while the module is being evaluated (module.status is 'evaluating').

    Corresponds to the Evaluate() concrete method field of Cyclic Module Record s in the ECMAScript specification.

    @returns

    Fulfills with undefined upon success.

  • name: string,
    value: any
    ): void;

    This method is used after the module is linked to set the values of exports. If it is called before the module is linked, an ERR_VM_MODULE_STATUS error will be thrown.

    import vm from 'node:vm';
    
    const m = new vm.SyntheticModule(['x'], () => {
      m.setExport('x', 1);
    });
    
    await m.link(() => {});
    await m.evaluate();
    
    assert.strictEqual(m.namespace.x, 1);
    
    @param name

    Name of the export to set.

    @param value

    The value to set the export to.