current commit
261019.15 · module: add "worker" condition for Web Worker threads
// Flags: --experimental-web-worker --conditions=custom-condition
'use strict';

// The `worker` package condition applies only within Web Worker threads,
// not on the main thread or in `worker_threads` threads.

const common = require('../common');
const fixtures = require('../common/fixtures');
const assert = require('node:assert');
const { once } = require('node:events');
const { Worker: ThreadWorker } = require('node:worker_threads');

const base = fixtures.fileURL('es-modules/worker-condition/');
const pkg = new URL('node_modules/pkg/', base);

function runWebWorker(url, options) {
  const worker = new Worker(url, options);
  worker.onerror = common.mustNotCall('worker failed');
  return new Promise((resolve) => {
    worker.onmessage = common.mustCall(({ data }) => {
      worker.terminate();
      resolve(data);
    });
  });
}

(async () => {
  // Main thread: no worker condition.
  assert.deepStrictEqual((await import(new URL('main.mjs', base))).default, {
    import: 'default',
    custom: 'custom',
    require: 'default',
    resolve: new URL('default.mjs', pkg).href,
    workerOnly: 'ERR_PACKAGE_PATH_NOT_EXPORTED',
  });

  // Module Web Worker: entry point dependencies, dynamic import,
  // import.meta.resolve, require, nested threads.
  assert.deepStrictEqual(
    await runWebWorker(new URL('module-worker.mjs', base), { type: 'module' }),
    {
      staticImport: 'worker',
      dynamicImport: 'worker',
      custom: 'custom-worker',
      workerOnly: 'worker',
      resolve: new URL('worker.mjs', pkg).href,
      require: 'worker',
      // worker_threads created from a Web Worker revert to no worker condition.
      thread: {
        import: 'default',
        custom: 'custom',
        require: 'default',
        resolve: new URL('default.mjs', pkg).href,
      },
      // Nested Web Workers retain it.
      nested: 'worker',
    });

  // Classic Web Worker.
  assert.deepStrictEqual(
    await runWebWorker(new URL('classic-worker.js', base)),
    {
      require: 'worker',
      import: 'worker',
      resolve: fixtures.path('es-modules/worker-condition/node_modules/pkg/worker.cjs'),
    });

  // Web Worker created from a worker_threads thread.
  const thread = new ThreadWorker(new URL('thread-spawns-webworker.mjs', base));
  const [threadResult] = await once(thread, 'message');
  assert.deepStrictEqual(threadResult, { thread: 'default', webWorker: 'worker' });

  // Async module customization hooks registered from a Web Worker.
  assert.strictEqual(
    await runWebWorker(new URL('hooks-worker.mjs', base), { type: 'module' }),
    'worker');
})().then(common.mustCall());