'use strict'; // Flags: --experimental-vm-modules const common = require('../common'); const assert = require('assert'); const { SourceTextModule, createContext } = require('vm'); (async function test1() { const context = createContext({ foo: 'bar', baz: undefined, typeofProcess: undefined, }); const m = new SourceTextModule( 'baz = foo; typeofProcess = typeof process; typeof Object;', { context } ); assert.strictEqual(m.status, 'uninstantiated'); await m.link(common.mustNotCall()); m.instantiate(); assert.strictEqual(m.status, 'instantiated'); const result = await m.evaluate(); assert.strictEqual(m.status, 'evaluated'); assert.strictEqual(Object.getPrototypeOf(result), null); assert.deepStrictEqual(context, { foo: 'bar', baz: 'bar', typeofProcess: 'undefined' }); assert.strictEqual(result.result, 'function'); }()); (async () => { const m = new SourceTextModule( 'global.vmResult = "foo"; Object.prototype.toString.call(process);' ); await m.link(common.mustNotCall()); m.instantiate(); const { result } = await m.evaluate(); assert.strictEqual(global.vmResult, 'foo'); assert.strictEqual(result, '[object process]'); delete global.vmResult; })(); (async () => { const m = new SourceTextModule('while (true) {}'); await m.link(common.mustNotCall()); m.instantiate(); await m.evaluate({ timeout: 500 }) .then(() => assert(false), () => {}); })(); // Check the generated url for each module (async () => { const context1 = createContext({ }); const context2 = createContext({ }); const m1 = new SourceTextModule('1', { context: context1 }); assert.strictEqual(m1.url, 'vm:module(0)'); const m2 = new SourceTextModule('2', { context: context1 }); assert.strictEqual(m2.url, 'vm:module(1)'); const m3 = new SourceTextModule('3', { context: context2 }); assert.strictEqual(m3.url, 'vm:module(0)'); })();