current commit
250919.2 · vm: expose hasTopLevelAwait on SourceTextModule
'use strict';

// Flags: --experimental-vm-modules

require('../common');

const assert = require('assert');

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

test('module is not instantiated yet', () => {
  const foo = new SourceTextModule(`
    export const foo = 4
    export default 5;
  `);
  assert.throws(() => foo.hasAsyncGraph(), {
    code: 'ERR_VM_MODULE_STATUS',
  });
});

test('simple module with top-level await', () => {
  const foo = new SourceTextModule(`
    export const foo = 4
    export default 5;

    await 0;
  `);
  foo.linkRequests([]);
  foo.instantiate();

  assert.strictEqual(foo.hasAsyncGraph(), true);
});

test('simple module with non top-level await', () => {
  const foo = new SourceTextModule(`
    export const foo = 4
    export default 5;

    export async function f() {
      await 0;
    }
  `);
  foo.linkRequests([]);
  foo.instantiate();

  assert.strictEqual(foo.hasAsyncGraph(), false);
});

test('module with a dependency containing top-level await', () => {
  const foo = new SourceTextModule(`
    export const foo = 4
    export default 5;

    await 0;
  `);
  foo.linkRequests([]);

  const bar = new SourceTextModule(`
    export { foo } from 'foo';
  `);
  bar.linkRequests([foo]);
  bar.instantiate();

  assert.strictEqual(foo.hasAsyncGraph(), true);
  assert.strictEqual(bar.hasAsyncGraph(), true);
});