'use strict'; // Flags: --experimental-vm-modules const common = require('../common'); const { SyntheticModule, SourceTextModule } = require('vm'); const assert = require('assert'); (async () => { { const s = new SyntheticModule(['x'], () => { s.setExport('x', 1); }); const m = new SourceTextModule(` import { x } from 'synthetic'; export const getX = () => x; `); await m.link(() => s); await m.evaluate(); assert.strictEqual(m.namespace.getX(), 1); s.setExport('x', 42); assert.strictEqual(m.namespace.getX(), 42); } { const s = new SyntheticModule([], () => { const p = Promise.reject(); p.catch(() => {}); return p; }); await s.link(common.mustNotCall()); assert.strictEqual(await s.evaluate(), undefined); } for (const invalidName of [1, Symbol.iterator, {}, [], null, true, 0]) { const s = new SyntheticModule([], () => {}); await s.link(() => {}); assert.throws(() => { s.setExport(invalidName, undefined); }, { name: 'TypeError', }); } { const s = new SyntheticModule([], () => {}); await s.link(() => {}); assert.throws(() => { s.setExport('does not exist'); }, { name: 'ReferenceError', }); } { const s = new SyntheticModule([], () => {}); assert.throws(() => { s.setExport('name', 'value'); }, { code: 'ERR_VM_MODULE_STATUS', }); } { assert.throws(() => { SyntheticModule.prototype.setExport.call({}, 'foo'); }, { code: 'ERR_VM_MODULE_NOT_MODULE', message: /Provided module is not an instance of Module/ }); } })().then(common.mustCall());