123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991 |
- /**
- * The `node:vm` module enables compiling and running code within V8 Virtual
- * Machine contexts.
- *
- * **The `node:vm` module is not a security**
- * **mechanism. Do not use it to run untrusted code.**
- *
- * JavaScript code can be compiled and run immediately or
- * compiled, saved, and run later.
- *
- * A common use case is to run the code in a different V8 Context. This means
- * invoked code has a different global object than the invoking code.
- *
- * One can provide the context by `contextifying` an
- * object. The invoked code treats any property in the context like a
- * global variable. Any changes to global variables caused by the invoked
- * code are reflected in the context object.
- *
- * ```js
- * import vm from 'node:vm';
- *
- * const x = 1;
- *
- * const context = { x: 2 };
- * vm.createContext(context); // Contextify the object.
- *
- * const code = 'x += 40; var y = 17;';
- * // `x` and `y` are global variables in the context.
- * // Initially, x has the value 2 because that is the value of context.x.
- * vm.runInContext(code, context);
- *
- * console.log(context.x); // 42
- * console.log(context.y); // 17
- *
- * console.log(x); // 1; y is not defined.
- * ```
- * @see [source](https://github.com/nodejs/node/blob/v22.x/lib/vm.js)
- */
- declare module "vm" {
- import { ImportAttributes } from "node:module";
- interface Context extends NodeJS.Dict<any> {}
- interface BaseOptions {
- /**
- * Specifies the filename used in stack traces produced by this script.
- * @default ''
- */
- filename?: string | undefined;
- /**
- * Specifies the line number offset that is displayed in stack traces produced by this script.
- * @default 0
- */
- lineOffset?: number | undefined;
- /**
- * Specifies the column number offset that is displayed in stack traces produced by this script.
- * @default 0
- */
- columnOffset?: number | undefined;
- }
- interface ScriptOptions extends BaseOptions {
- /**
- * Provides an optional data with V8's code cache data for the supplied source.
- */
- cachedData?: Buffer | NodeJS.ArrayBufferView | undefined;
- /** @deprecated in favor of `script.createCachedData()` */
- produceCachedData?: boolean | undefined;
- /**
- * Used to specify how the modules should be loaded during the evaluation of this script when `import()` is called. This option is
- * part of the experimental modules API. We do not recommend using it in a production environment. For detailed information, see
- * [Support of dynamic `import()` in compilation APIs](https://nodejs.org/docs/latest-v22.x/api/vm.html#support-of-dynamic-import-in-compilation-apis).
- */
- importModuleDynamically?:
- | ((specifier: string, script: Script, importAttributes: ImportAttributes) => Module | Promise<Module>)
- | typeof constants.USE_MAIN_CONTEXT_DEFAULT_LOADER
- | undefined;
- }
- interface RunningScriptOptions extends BaseOptions {
- /**
- * When `true`, if an `Error` occurs while compiling the `code`, the line of code causing the error is attached to the stack trace.
- * @default true
- */
- displayErrors?: boolean | undefined;
- /**
- * Specifies the number of milliseconds to execute code before terminating execution.
- * If execution is terminated, an `Error` will be thrown. This value must be a strictly positive integer.
- */
- timeout?: number | undefined;
- /**
- * If `true`, the execution will be terminated when `SIGINT` (Ctrl+C) is received.
- * Existing handlers for the event that have been attached via `process.on('SIGINT')` will be disabled during script execution, but will continue to work after that.
- * If execution is terminated, an `Error` will be thrown.
- * @default false
- */
- breakOnSigint?: boolean | undefined;
- }
- interface RunningScriptInNewContextOptions extends RunningScriptOptions {
- /**
- * Human-readable name of the newly created context.
- */
- contextName?: CreateContextOptions["name"];
- /**
- * Origin corresponding to the newly created context for display purposes. The origin should be formatted like a URL,
- * but with only the scheme, host, and port (if necessary), like the value of the `url.origin` property of a `URL` object.
- * Most notably, this string should omit the trailing slash, as that denotes a path.
- */
- contextOrigin?: CreateContextOptions["origin"];
- contextCodeGeneration?: CreateContextOptions["codeGeneration"];
- /**
- * If set to `afterEvaluate`, microtasks will be run immediately after the script has run.
- */
- microtaskMode?: CreateContextOptions["microtaskMode"];
- }
- interface RunningCodeOptions extends RunningScriptOptions {
- /**
- * Provides an optional data with V8's code cache data for the supplied source.
- */
- cachedData?: ScriptOptions["cachedData"] | undefined;
- importModuleDynamically?: ScriptOptions["importModuleDynamically"];
- }
- interface RunningCodeInNewContextOptions extends RunningScriptInNewContextOptions {
- /**
- * Provides an optional data with V8's code cache data for the supplied source.
- */
- cachedData?: ScriptOptions["cachedData"] | undefined;
- importModuleDynamically?: ScriptOptions["importModuleDynamically"];
- }
- interface CompileFunctionOptions extends BaseOptions {
- /**
- * Provides an optional data with V8's code cache data for the supplied source.
- */
- cachedData?: ScriptOptions["cachedData"] | undefined;
- /**
- * Specifies whether to produce new cache data.
- * @default false
- */
- produceCachedData?: boolean | undefined;
- /**
- * The sandbox/context in which the said function should be compiled in.
- */
- parsingContext?: Context | undefined;
- /**
- * An array containing a collection of context extensions (objects wrapping the current scope) to be applied while compiling
- */
- contextExtensions?: Object[] | undefined;
- }
- interface CreateContextOptions {
- /**
- * Human-readable name of the newly created context.
- * @default 'VM Context i' Where i is an ascending numerical index of the created context.
- */
- name?: string | undefined;
- /**
- * Corresponds to the newly created context for display purposes.
- * The origin should be formatted like a `URL`, but with only the scheme, host, and port (if necessary),
- * like the value of the `url.origin` property of a URL object.
- * Most notably, this string should omit the trailing slash, as that denotes a path.
- * @default ''
- */
- origin?: string | undefined;
- codeGeneration?:
- | {
- /**
- * If set to false any calls to eval or function constructors (Function, GeneratorFunction, etc)
- * will throw an EvalError.
- * @default true
- */
- strings?: boolean | undefined;
- /**
- * If set to false any attempt to compile a WebAssembly module will throw a WebAssembly.CompileError.
- * @default true
- */
- wasm?: boolean | undefined;
- }
- | undefined;
- /**
- * If set to `afterEvaluate`, microtasks will be run immediately after the script has run.
- */
- microtaskMode?: "afterEvaluate" | undefined;
- }
- type MeasureMemoryMode = "summary" | "detailed";
- interface MeasureMemoryOptions {
- /**
- * @default 'summary'
- */
- mode?: MeasureMemoryMode | undefined;
- /**
- * @default 'default'
- */
- execution?: "default" | "eager" | undefined;
- }
- interface MemoryMeasurement {
- total: {
- jsMemoryEstimate: number;
- jsMemoryRange: [number, number];
- };
- }
- /**
- * Instances of the `vm.Script` class contain precompiled scripts that can be
- * executed in specific contexts.
- * @since v0.3.1
- */
- class Script {
- constructor(code: string, options?: ScriptOptions | string);
- /**
- * Runs the compiled code contained by the `vm.Script` object within the given `contextifiedObject` and returns the result. Running code does not have access
- * to local scope.
- *
- * The following example compiles code that increments a global variable, sets
- * the value of another global variable, then execute the code multiple times.
- * The globals are contained in the `context` object.
- *
- * ```js
- * import vm from 'node:vm';
- *
- * const context = {
- * animal: 'cat',
- * count: 2,
- * };
- *
- * const script = new vm.Script('count += 1; name = "kitty";');
- *
- * vm.createContext(context);
- * for (let i = 0; i < 10; ++i) {
- * script.runInContext(context);
- * }
- *
- * console.log(context);
- * // Prints: { animal: 'cat', count: 12, name: 'kitty' }
- * ```
- *
- * Using the `timeout` or `breakOnSigint` options will result in new event loops
- * and corresponding threads being started, which have a non-zero performance
- * overhead.
- * @since v0.3.1
- * @param contextifiedObject A `contextified` object as returned by the `vm.createContext()` method.
- * @return the result of the very last statement executed in the script.
- */
- runInContext(contextifiedObject: Context, options?: RunningScriptOptions): any;
- /**
- * This method is a shortcut to `script.runInContext(vm.createContext(options), options)`.
- * It does several things at once:
- *
- * 1. Creates a new context.
- * 2. If `contextObject` is an object, contextifies it with the new context.
- * If `contextObject` is undefined, creates a new object and contextifies it.
- * If `contextObject` is `vm.constants.DONT_CONTEXTIFY`, don't contextify anything.
- * 3. Runs the compiled code contained by the `vm.Script` object within the created context. The code
- * does not have access to the scope in which this method is called.
- * 4. Returns the result.
- *
- * The following example compiles code that sets a global variable, then executes
- * the code multiple times in different contexts. The globals are set on and
- * contained within each individual `context`.
- *
- * ```js
- * const vm = require('node:vm');
- *
- * const script = new vm.Script('globalVar = "set"');
- *
- * const contexts = [{}, {}, {}];
- * contexts.forEach((context) => {
- * script.runInNewContext(context);
- * });
- *
- * console.log(contexts);
- * // Prints: [{ globalVar: 'set' }, { globalVar: 'set' }, { globalVar: 'set' }]
- *
- * // This would throw if the context is created from a contextified object.
- * // vm.constants.DONT_CONTEXTIFY allows creating contexts with ordinary
- * // global objects that can be frozen.
- * const freezeScript = new vm.Script('Object.freeze(globalThis); globalThis;');
- * const frozenContext = freezeScript.runInNewContext(vm.constants.DONT_CONTEXTIFY);
- * ```
- * @since v0.3.1
- * @param contextObject Either `vm.constants.DONT_CONTEXTIFY` or an object that will be contextified.
- * If `undefined`, an empty contextified object will be created for backwards compatibility.
- * @return the result of the very last statement executed in the script.
- */
- runInNewContext(
- contextObject?: Context | typeof constants.DONT_CONTEXTIFY,
- options?: RunningScriptInNewContextOptions,
- ): any;
- /**
- * Runs the compiled code contained by the `vm.Script` within the context of the
- * current `global` object. Running code does not have access to local scope, but _does_ have access to the current `global` object.
- *
- * The following example compiles code that increments a `global` variable then
- * executes that code multiple times:
- *
- * ```js
- * import vm from 'node:vm';
- *
- * global.globalVar = 0;
- *
- * const script = new vm.Script('globalVar += 1', { filename: 'myfile.vm' });
- *
- * for (let i = 0; i < 1000; ++i) {
- * script.runInThisContext();
- * }
- *
- * console.log(globalVar);
- *
- * // 1000
- * ```
- * @since v0.3.1
- * @return the result of the very last statement executed in the script.
- */
- runInThisContext(options?: RunningScriptOptions): any;
- /**
- * Creates a code cache that can be used with the `Script` constructor's `cachedData` option. Returns a `Buffer`. This method may be called at any
- * time and any number of times.
- *
- * The code cache of the `Script` doesn't contain any JavaScript observable
- * states. The code cache is safe to be saved along side the script source and
- * used to construct new `Script` instances multiple times.
- *
- * Functions in the `Script` source can be marked as lazily compiled and they are
- * not compiled at construction of the `Script`. These functions are going to be
- * compiled when they are invoked the first time. The code cache serializes the
- * metadata that V8 currently knows about the `Script` that it can use to speed up
- * future compilations.
- *
- * ```js
- * const script = new vm.Script(`
- * function add(a, b) {
- * return a + b;
- * }
- *
- * const x = add(1, 2);
- * `);
- *
- * const cacheWithoutAdd = script.createCachedData();
- * // In `cacheWithoutAdd` the function `add()` is marked for full compilation
- * // upon invocation.
- *
- * script.runInThisContext();
- *
- * const cacheWithAdd = script.createCachedData();
- * // `cacheWithAdd` contains fully compiled function `add()`.
- * ```
- * @since v10.6.0
- */
- createCachedData(): Buffer;
- /** @deprecated in favor of `script.createCachedData()` */
- cachedDataProduced?: boolean | undefined;
- /**
- * When `cachedData` is supplied to create the `vm.Script`, this value will be set
- * to either `true` or `false` depending on acceptance of the data by V8.
- * Otherwise the value is `undefined`.
- * @since v5.7.0
- */
- cachedDataRejected?: boolean | undefined;
- cachedData?: Buffer | undefined;
- /**
- * When the script is compiled from a source that contains a source map magic
- * comment, this property will be set to the URL of the source map.
- *
- * ```js
- * import vm from 'node:vm';
- *
- * const script = new vm.Script(`
- * function myFunc() {}
- * //# sourceMappingURL=sourcemap.json
- * `);
- *
- * console.log(script.sourceMapURL);
- * // Prints: sourcemap.json
- * ```
- * @since v19.1.0, v18.13.0
- */
- sourceMapURL?: string | undefined;
- }
- /**
- * If the given `contextObject` is an object, the `vm.createContext()` method will
- * [prepare that object](https://nodejs.org/docs/latest-v22.x/api/vm.html#what-does-it-mean-to-contextify-an-object)
- * and return a reference to it so that it can be used in calls to {@link runInContext} or
- * [`script.runInContext()`](https://nodejs.org/docs/latest-v22.x/api/vm.html#scriptrunincontextcontextifiedobject-options).
- * Inside such scripts, the global object will be wrapped by the `contextObject`, retaining all of its
- * existing properties but also having the built-in objects and functions any standard
- * [global object](https://es5.github.io/#x15.1) has. Outside of scripts run by the vm module, global
- * variables will remain unchanged.
- *
- * ```js
- * const vm = require('node:vm');
- *
- * global.globalVar = 3;
- *
- * const context = { globalVar: 1 };
- * vm.createContext(context);
- *
- * vm.runInContext('globalVar *= 2;', context);
- *
- * console.log(context);
- * // Prints: { globalVar: 2 }
- *
- * console.log(global.globalVar);
- * // Prints: 3
- * ```
- *
- * If `contextObject` is omitted (or passed explicitly as `undefined`), a new,
- * empty contextified object will be returned.
- *
- * When the global object in the newly created context is contextified, it has some quirks
- * compared to ordinary global objects. For example, it cannot be frozen. To create a context
- * without the contextifying quirks, pass `vm.constants.DONT_CONTEXTIFY` as the `contextObject`
- * argument. See the documentation of `vm.constants.DONT_CONTEXTIFY` for details.
- *
- * The `vm.createContext()` method is primarily useful for creating a single
- * context that can be used to run multiple scripts. For instance, if emulating a
- * web browser, the method can be used to create a single context representing a
- * window's global object, then run all `<script>` tags together within that
- * context.
- *
- * The provided `name` and `origin` of the context are made visible through the
- * Inspector API.
- * @since v0.3.1
- * @param contextObject Either `vm.constants.DONT_CONTEXTIFY` or an object that will be contextified.
- * If `undefined`, an empty contextified object will be created for backwards compatibility.
- * @return contextified object.
- */
- function createContext(
- contextObject?: Context | typeof constants.DONT_CONTEXTIFY,
- options?: CreateContextOptions,
- ): Context;
- /**
- * Returns `true` if the given `object` object has been contextified using {@link createContext},
- * or if it's the global object of a context created using `vm.constants.DONT_CONTEXTIFY`.
- * @since v0.11.7
- */
- function isContext(sandbox: Context): boolean;
- /**
- * The `vm.runInContext()` method compiles `code`, runs it within the context of
- * the `contextifiedObject`, then returns the result. Running code does not have
- * access to the local scope. The `contextifiedObject` object _must_ have been
- * previously `contextified` using the {@link createContext} method.
- *
- * If `options` is a string, then it specifies the filename.
- *
- * The following example compiles and executes different scripts using a single `contextified` object:
- *
- * ```js
- * import vm from 'node:vm';
- *
- * const contextObject = { globalVar: 1 };
- * vm.createContext(contextObject);
- *
- * for (let i = 0; i < 10; ++i) {
- * vm.runInContext('globalVar *= 2;', contextObject);
- * }
- * console.log(contextObject);
- * // Prints: { globalVar: 1024 }
- * ```
- * @since v0.3.1
- * @param code The JavaScript code to compile and run.
- * @param contextifiedObject The `contextified` object that will be used as the `global` when the `code` is compiled and run.
- * @return the result of the very last statement executed in the script.
- */
- function runInContext(code: string, contextifiedObject: Context, options?: RunningCodeOptions | string): any;
- /**
- * This method is a shortcut to
- * `(new vm.Script(code, options)).runInContext(vm.createContext(options), options)`.
- * If `options` is a string, then it specifies the filename.
- *
- * It does several things at once:
- *
- * 1. Creates a new context.
- * 2. If `contextObject` is an object, contextifies it with the new context.
- * If `contextObject` is undefined, creates a new object and contextifies it.
- * If `contextObject` is `vm.constants.DONT_CONTEXTIFY`, don't contextify anything.
- * 3. Compiles the code as a`vm.Script`
- * 4. Runs the compield code within the created context. The code does not have access to the scope in
- * which this method is called.
- * 5. Returns the result.
- *
- * The following example compiles and executes code that increments a global
- * variable and sets a new one. These globals are contained in the `contextObject`.
- *
- * ```js
- * const vm = require('node:vm');
- *
- * const contextObject = {
- * animal: 'cat',
- * count: 2,
- * };
- *
- * vm.runInNewContext('count += 1; name = "kitty"', contextObject);
- * console.log(contextObject);
- * // Prints: { animal: 'cat', count: 3, name: 'kitty' }
- *
- * // This would throw if the context is created from a contextified object.
- * // vm.constants.DONT_CONTEXTIFY allows creating contexts with ordinary global objects that
- * // can be frozen.
- * const frozenContext = vm.runInNewContext('Object.freeze(globalThis); globalThis;', vm.constants.DONT_CONTEXTIFY);
- * ```
- * @since v0.3.1
- * @param code The JavaScript code to compile and run.
- * @param contextObject Either `vm.constants.DONT_CONTEXTIFY` or an object that will be contextified.
- * If `undefined`, an empty contextified object will be created for backwards compatibility.
- * @return the result of the very last statement executed in the script.
- */
- function runInNewContext(
- code: string,
- contextObject?: Context | typeof constants.DONT_CONTEXTIFY,
- options?: RunningCodeInNewContextOptions | string,
- ): any;
- /**
- * `vm.runInThisContext()` compiles `code`, runs it within the context of the
- * current `global` and returns the result. Running code does not have access to
- * local scope, but does have access to the current `global` object.
- *
- * If `options` is a string, then it specifies the filename.
- *
- * The following example illustrates using both `vm.runInThisContext()` and
- * the JavaScript [`eval()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) function to run the same code:
- *
- * ```js
- * import vm from 'node:vm';
- * let localVar = 'initial value';
- *
- * const vmResult = vm.runInThisContext('localVar = "vm";');
- * console.log(`vmResult: '${vmResult}', localVar: '${localVar}'`);
- * // Prints: vmResult: 'vm', localVar: 'initial value'
- *
- * const evalResult = eval('localVar = "eval";');
- * console.log(`evalResult: '${evalResult}', localVar: '${localVar}'`);
- * // Prints: evalResult: 'eval', localVar: 'eval'
- * ```
- *
- * Because `vm.runInThisContext()` does not have access to the local scope, `localVar` is unchanged. In contrast,
- * [`eval()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval) _does_ have access to the
- * local scope, so the value `localVar` is changed. In this way `vm.runInThisContext()` is much like an [indirect `eval()` call](https://es5.github.io/#x10.4.2), e.g.`(0,eval)('code')`.
- *
- * ## Example: Running an HTTP server within a VM
- *
- * When using either `script.runInThisContext()` or {@link runInThisContext}, the code is executed within the current V8 global
- * context. The code passed to this VM context will have its own isolated scope.
- *
- * In order to run a simple web server using the `node:http` module the code passed
- * to the context must either import `node:http` on its own, or have a
- * reference to the `node:http` module passed to it. For instance:
- *
- * ```js
- * 'use strict';
- * import vm from 'node:vm';
- *
- * const code = `
- * ((require) => {
- * const http = require('node:http');
- *
- * http.createServer((request, response) => {
- * response.writeHead(200, { 'Content-Type': 'text/plain' });
- * response.end('Hello World\\n');
- * }).listen(8124);
- *
- * console.log('Server running at http://127.0.0.1:8124/');
- * })`;
- *
- * vm.runInThisContext(code)(require);
- * ```
- *
- * The `require()` in the above case shares the state with the context it is
- * passed from. This may introduce risks when untrusted code is executed, e.g.
- * altering objects in the context in unwanted ways.
- * @since v0.3.1
- * @param code The JavaScript code to compile and run.
- * @return the result of the very last statement executed in the script.
- */
- function runInThisContext(code: string, options?: RunningCodeOptions | string): any;
- /**
- * Compiles the given code into the provided context (if no context is
- * supplied, the current context is used), and returns it wrapped inside a
- * function with the given `params`.
- * @since v10.10.0
- * @param code The body of the function to compile.
- * @param params An array of strings containing all parameters for the function.
- */
- function compileFunction(
- code: string,
- params?: readonly string[],
- options?: CompileFunctionOptions,
- ): Function & {
- cachedData?: Script["cachedData"] | undefined;
- cachedDataProduced?: Script["cachedDataProduced"] | undefined;
- cachedDataRejected?: Script["cachedDataRejected"] | undefined;
- };
- /**
- * Measure the memory known to V8 and used by all contexts known to the
- * current V8 isolate, or the main context.
- *
- * The format of the object that the returned Promise may resolve with is
- * specific to the V8 engine and may change from one version of V8 to the next.
- *
- * The returned result is different from the statistics returned by `v8.getHeapSpaceStatistics()` in that `vm.measureMemory()` measure the
- * memory reachable by each V8 specific contexts in the current instance of
- * the V8 engine, while the result of `v8.getHeapSpaceStatistics()` measure
- * the memory occupied by each heap space in the current V8 instance.
- *
- * ```js
- * import vm from 'node:vm';
- * // Measure the memory used by the main context.
- * vm.measureMemory({ mode: 'summary' })
- * // This is the same as vm.measureMemory()
- * .then((result) => {
- * // The current format is:
- * // {
- * // total: {
- * // jsMemoryEstimate: 2418479, jsMemoryRange: [ 2418479, 2745799 ]
- * // }
- * // }
- * console.log(result);
- * });
- *
- * const context = vm.createContext({ a: 1 });
- * vm.measureMemory({ mode: 'detailed', execution: 'eager' })
- * .then((result) => {
- * // Reference the context here so that it won't be GC'ed
- * // until the measurement is complete.
- * console.log(context.a);
- * // {
- * // total: {
- * // jsMemoryEstimate: 2574732,
- * // jsMemoryRange: [ 2574732, 2904372 ]
- * // },
- * // current: {
- * // jsMemoryEstimate: 2438996,
- * // jsMemoryRange: [ 2438996, 2768636 ]
- * // },
- * // other: [
- * // {
- * // jsMemoryEstimate: 135736,
- * // jsMemoryRange: [ 135736, 465376 ]
- * // }
- * // ]
- * // }
- * console.log(result);
- * });
- * ```
- * @since v13.10.0
- * @experimental
- */
- function measureMemory(options?: MeasureMemoryOptions): Promise<MemoryMeasurement>;
- interface ModuleEvaluateOptions {
- timeout?: RunningScriptOptions["timeout"] | undefined;
- breakOnSigint?: RunningScriptOptions["breakOnSigint"] | undefined;
- }
- type ModuleLinker = (
- specifier: string,
- referencingModule: Module,
- extra: {
- attributes: ImportAttributes;
- },
- ) => Module | Promise<Module>;
- type ModuleStatus = "unlinked" | "linking" | "linked" | "evaluating" | "evaluated" | "errored";
- /**
- * This feature is only available with the `--experimental-vm-modules` command
- * flag enabled.
- *
- * The `vm.Module` class provides a low-level interface for using
- * ECMAScript modules in VM contexts. It is the counterpart of the `vm.Script` class that closely mirrors [Module Record](https://262.ecma-international.org/14.0/#sec-abstract-module-records) s as
- * defined in the ECMAScript
- * specification.
- *
- * Unlike `vm.Script` however, every `vm.Module` object is bound to a context from
- * its creation. Operations on `vm.Module` objects are intrinsically asynchronous,
- * in contrast with the synchronous nature of `vm.Script` objects. The use of
- * 'async' functions can help with manipulating `vm.Module` objects.
- *
- * Using a `vm.Module` object requires three distinct steps: creation/parsing,
- * linking, and evaluation. These three steps are illustrated in the following
- * example.
- *
- * This implementation lies at a lower level than the `ECMAScript Module
- * loader`. There is also no way to interact with the Loader yet, though
- * support is planned.
- *
- * ```js
- * import vm from 'node:vm';
- *
- * const contextifiedObject = vm.createContext({
- * secret: 42,
- * print: console.log,
- * });
- *
- * // Step 1
- * //
- * // Create a Module by constructing a new `vm.SourceTextModule` object. This
- * // parses the provided source text, throwing a `SyntaxError` if anything goes
- * // wrong. By default, a Module is created in the top context. But here, we
- * // specify `contextifiedObject` as the context this Module belongs to.
- * //
- * // Here, we attempt to obtain the default export from the module "foo", and
- * // put it into local binding "secret".
- *
- * const bar = new vm.SourceTextModule(`
- * import s from 'foo';
- * s;
- * print(s);
- * `, { context: contextifiedObject });
- *
- * // Step 2
- * //
- * // "Link" the imported dependencies of this Module to it.
- * //
- * // The provided linking callback (the "linker") accepts two arguments: the
- * // parent module (`bar` in this case) and the string that is the specifier of
- * // the imported module. The callback is expected to return a Module that
- * // corresponds to the provided specifier, with certain requirements documented
- * // in `module.link()`.
- * //
- * // If linking has not started for the returned Module, the same linker
- * // callback will be called on the returned Module.
- * //
- * // Even top-level Modules without dependencies must be explicitly linked. The
- * // callback provided would never be called, however.
- * //
- * // The link() method returns a Promise that will be resolved when all the
- * // Promises returned by the linker resolve.
- * //
- * // Note: This is a contrived example in that the linker function creates a new
- * // "foo" module every time it is called. In a full-fledged module system, a
- * // cache would probably be used to avoid duplicated modules.
- *
- * async function linker(specifier, referencingModule) {
- * if (specifier === 'foo') {
- * return new vm.SourceTextModule(`
- * // The "secret" variable refers to the global variable we added to
- * // "contextifiedObject" when creating the context.
- * export default secret;
- * `, { context: referencingModule.context });
- *
- * // Using `contextifiedObject` instead of `referencingModule.context`
- * // here would work as well.
- * }
- * throw new Error(`Unable to resolve dependency: ${specifier}`);
- * }
- * await bar.link(linker);
- *
- * // Step 3
- * //
- * // Evaluate the Module. The evaluate() method returns a promise which will
- * // resolve after the module has finished evaluating.
- *
- * // Prints 42.
- * await bar.evaluate();
- * ```
- * @since v13.0.0, v12.16.0
- * @experimental
- */
- class Module {
- /**
- * 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](https://tc39.es/ecma262/#sec-cyclic-module-records) s in
- * the ECMAScript specification.
- */
- dependencySpecifiers: readonly string[];
- /**
- * 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](https://tc39.es/ecma262/#sec-cyclic-module-records) s
- * in the ECMAScript specification.
- */
- error: any;
- /**
- * The identifier of the current module, as set in the constructor.
- */
- identifier: string;
- context: Context;
- /**
- * The namespace object of the module. This is only available after linking
- * (`module.link()`) has completed.
- *
- * Corresponds to the [GetModuleNamespace](https://tc39.es/ecma262/#sec-getmodulenamespace) abstract operation in the ECMAScript
- * specification.
- */
- namespace: Object;
- /**
- * 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](https://tc39.es/ecma262/#sec-cyclic-module-records)'s `[[Status]]` field. `'errored'`
- * corresponds to `'evaluated'` in the specification, but with `[[EvaluationError]]` set to a
- * value that is not `undefined`.
- */
- status: ModuleStatus;
- /**
- * 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](https://tc39.es/ecma262/#sec-moduleevaluation) field of [Cyclic Module Record](https://tc39.es/ecma262/#sec-cyclic-module-records) s in the
- * ECMAScript specification.
- * @return Fulfills with `undefined` upon success.
- */
- evaluate(options?: ModuleEvaluateOptions): Promise<void>;
- /**
- * Link module dependencies. This method must be called before evaluation, and
- * can only be called once per module.
- *
- * The function is expected to return a `Module` object or a `Promise` that
- * eventually resolves to a `Module` object. The returned `Module` must satisfy the
- * following two invariants:
- *
- * * It must belong to the same context as the parent `Module`.
- * * Its `status` must not be `'errored'`.
- *
- * If the returned `Module`'s `status` is `'unlinked'`, this method will be
- * recursively called on the returned `Module` with the same provided `linker` function.
- *
- * `link()` returns a `Promise` that will either get resolved when all linking
- * instances resolve to a valid `Module`, or rejected if the linker function either
- * throws an exception or returns an invalid `Module`.
- *
- * The linker function roughly corresponds to the implementation-defined [HostResolveImportedModule](https://tc39.es/ecma262/#sec-hostresolveimportedmodule) abstract operation in the
- * ECMAScript
- * specification, with a few key differences:
- *
- * * The linker function is allowed to be asynchronous while [HostResolveImportedModule](https://tc39.es/ecma262/#sec-hostresolveimportedmodule) is synchronous.
- *
- * The actual [HostResolveImportedModule](https://tc39.es/ecma262/#sec-hostresolveimportedmodule) implementation used during module
- * linking is one that returns the modules linked during linking. Since at
- * that point all modules would have been fully linked already, the [HostResolveImportedModule](https://tc39.es/ecma262/#sec-hostresolveimportedmodule) implementation is fully synchronous per
- * specification.
- *
- * Corresponds to the [Link() concrete method](https://tc39.es/ecma262/#sec-moduledeclarationlinking) field of [Cyclic Module Record](https://tc39.es/ecma262/#sec-cyclic-module-records) s in
- * the ECMAScript specification.
- */
- link(linker: ModuleLinker): Promise<void>;
- }
- interface SourceTextModuleOptions {
- /**
- * String used in stack traces.
- * @default 'vm:module(i)' where i is a context-specific ascending index.
- */
- identifier?: string | undefined;
- /**
- * Provides an optional data with V8's code cache data for the supplied source.
- */
- cachedData?: ScriptOptions["cachedData"] | undefined;
- context?: Context | undefined;
- lineOffset?: BaseOptions["lineOffset"] | undefined;
- columnOffset?: BaseOptions["columnOffset"] | undefined;
- /**
- * Called during evaluation of this module to initialize the `import.meta`.
- */
- initializeImportMeta?: ((meta: ImportMeta, module: SourceTextModule) => void) | undefined;
- importModuleDynamically?:
- | ((
- specifier: string,
- referrer: SourceTextModule,
- importAttributes: ImportAttributes,
- ) => Module | Promise<Module>)
- | undefined;
- }
- /**
- * This feature is only available with the `--experimental-vm-modules` command
- * flag enabled.
- *
- * The `vm.SourceTextModule` class provides the [Source Text Module Record](https://tc39.es/ecma262/#sec-source-text-module-records) as
- * defined in the ECMAScript specification.
- * @since v9.6.0
- * @experimental
- */
- class SourceTextModule extends Module {
- /**
- * Creates a new `SourceTextModule` instance.
- * @param code JavaScript Module code to parse
- */
- constructor(code: string, options?: SourceTextModuleOptions);
- }
- interface SyntheticModuleOptions {
- /**
- * String used in stack traces.
- * @default 'vm:module(i)' where i is a context-specific ascending index.
- */
- identifier?: string | undefined;
- /**
- * The contextified object as returned by the `vm.createContext()` method, to compile and evaluate this module in.
- */
- context?: Context | undefined;
- }
- /**
- * This feature is only available with the `--experimental-vm-modules` command
- * flag enabled.
- *
- * The `vm.SyntheticModule` class provides the [Synthetic Module Record](https://heycam.github.io/webidl/#synthetic-module-records) 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.
- *
- * ```js
- * 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...
- * ```
- * @since v13.0.0, v12.16.0
- * @experimental
- */
- class SyntheticModule extends Module {
- /**
- * Creates a new `SyntheticModule` instance.
- * @param exportNames Array of names that will be exported from the module.
- * @param evaluateCallback Called when the module is evaluated.
- */
- constructor(
- exportNames: string[],
- evaluateCallback: (this: SyntheticModule) => void,
- options?: SyntheticModuleOptions,
- );
- /**
- * 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.
- *
- * ```js
- * 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);
- * ```
- * @since v13.0.0, v12.16.0
- * @param name Name of the export to set.
- * @param value The value to set the export to.
- */
- setExport(name: string, value: any): void;
- }
- /**
- * Returns an object containing commonly used constants for VM operations.
- * @since v21.7.0, v20.12.0
- */
- namespace constants {
- /**
- * A constant that can be used as the `importModuleDynamically` option to `vm.Script`
- * and `vm.compileFunction()` so that Node.js uses the default ESM loader from the main
- * context to load the requested module.
- *
- * For detailed information, see [Support of dynamic `import()` in compilation APIs](https://nodejs.org/docs/latest-v22.x/api/vm.html#support-of-dynamic-import-in-compilation-apis).
- * @since v21.7.0, v20.12.0
- */
- const USE_MAIN_CONTEXT_DEFAULT_LOADER: number;
- /**
- * This constant, when used as the `contextObject` argument in vm APIs, instructs Node.js to create
- * a context without wrapping its global object with another object in a Node.js-specific manner.
- * As a result, the `globalThis` value inside the new context would behave more closely to an ordinary
- * one.
- *
- * When `vm.constants.DONT_CONTEXTIFY` is used as the `contextObject` argument to {@link createContext},
- * the returned object is a proxy-like object to the global object in the newly created context with
- * fewer Node.js-specific quirks. It is reference equal to the `globalThis` value in the new context,
- * can be modified from outside the context, and can be used to access built-ins in the new context directly.
- * @since v22.8.0
- */
- const DONT_CONTEXTIFY: number;
- }
- }
- declare module "node:vm" {
- export * from "vm";
- }
|