Skip to content

SourceTextModule example snippet does not behave as hinted in the docs #64076

Description

@davidebombelli

Affected URL(s)

https://nodejs.org/api/vm.html#new-vmsourcetextmodulecode-options

Description of the problem

I am trying to understand the example snippet:

import vm from 'node:vm';

const contextifiedObject = vm.createContext({ secret: 42 });

const module = new vm.SourceTextModule(
  'Object.getPrototypeOf(import.meta.prop).secret = secret;',
  {
    initializeImportMeta(meta) {
      // Note: this object is created in the top context. As such,
      // Object.getPrototypeOf(import.meta.prop) points to the
      // Object.prototype in the top context rather than that in
      // the contextified object.
      meta.prop = vm.runInContext('{}', contextifiedObject);
    },
  });
// The module has an empty `moduleRequests` array.
module.linkRequests([]);
module.instantiate();
await module.evaluate();

// Now, Object.prototype.secret will be equal to 42.
//
// To fix this problem, replace
//     meta.prop = {};
// above with
//     meta.prop = vm.runInContext('{}', contextifiedObject);

According to the comment on line 21, the script should execute and should modify the Object.prototype.secret to be 42. However, when I run the script I get the error:

vm:module(0):1
Object.getPrototypeOf(import.meta.prop).secret = secret;
                                                 ^

ReferenceError: secret is not defined
    at vm:module(0):1:50
    at SourceTextModule.evaluate (node:internal/vm/module:233:26)
    at file:///home/username/test.mjs:19:14
    at ModuleJob.run (node:internal/modules/esm/module_job:439:25)
    at async node:internal/modules/esm/loader:646:26
    at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:101:5)

Node.js v26.3.0

and if I try to modify meta.prop = {}; with meta.prop = vm.runInContext('{}', contextifiedObject);, I get the error:

vm:module(0):1
Object.getPrototypeOf(import.meta.prop).secret = secret;
       ^

TypeError: Cannot convert undefined or null to object
    at Object.getPrototypeOf (<anonymous>)
    at vm:module(0):1:8
    at SourceTextModule.evaluate (node:internal/vm/module:233:26)
    at file:///home/username/test.mjs:19:14
    at ModuleJob.run (node:internal/modules/esm/module_job:439:25)
    at async node:internal/modules/esm/loader:646:26
    at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:101:5)

Node.js v26.3.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    docIssues and PRs related to the documentations.

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions