current commit
251012.1 · vm: hint module identifier in instantiate errors
'use strict';

// Flags: --experimental-vm-modules --js-source-phase-imports

require('../common');

const assert = require('assert');

const { SourceTextModule } = require('vm');
const test = require('node:test');

test('simple graph', async function simple() {
  const foo = new SourceTextModule('export default 5;');
  foo.linkRequests([]);

  globalThis.fiveResult = undefined;
  const bar = new SourceTextModule('import five from "foo"; fiveResult = five');

  bar.linkRequests([foo]);
  bar.instantiate();

  await bar.evaluate();
  assert.strictEqual(globalThis.fiveResult, 5);
  delete globalThis.fiveResult;
});

test('invalid link values', () => {
  const invalidValues = [
    undefined,
    null,
    {},
    SourceTextModule.prototype,
  ];

  for (const value of invalidValues) {
    const module = new SourceTextModule('import "foo"');
    assert.throws(() => module.linkRequests([value]), {
      code: 'ERR_VM_MODULE_NOT_MODULE',
    });
  }
});

test('mismatch linkage', () => {
  const foo = new SourceTextModule('export default 5;');
  foo.linkRequests([]);

  // Link with more modules than requested.
  const bar = new SourceTextModule('import foo from "foo";');
  assert.throws(() => bar.linkRequests([foo, foo]), {
    code: 'ERR_MODULE_LINK_MISMATCH',
  });

  // Link with fewer modules than requested.
  const baz = new SourceTextModule('import foo from "foo"; import bar from "bar";');
  assert.throws(() => baz.linkRequests([foo]), {
    code: 'ERR_MODULE_LINK_MISMATCH',
  });

  // Link a same module cache key with different instances.
  const qux = new SourceTextModule(`
    import foo from "foo";
    import source Foo from "foo";
  `);
  assert.throws(() => qux.linkRequests([foo, bar]), {
    code: 'ERR_MODULE_LINK_MISMATCH',
  });
});

test('instantiate error should hint about module identifier', () => {
  const foo = new SourceTextModule('import bar from "bar"', { identifier: 'file://foo' });
  const bar = new SourceTextModule('import "unknown"', { identifier: 'file://bar' });

  foo.linkRequests([bar]);
  assert.throws(() => foo.instantiate(), {
    message: `request for 'unknown' can not be resolved on module 'file://bar' that is not linked`,
    code: 'ERR_VM_MODULE_LINK_FAILURE',
  });
});