@ 261106.9
current
'use strict';
const path = require('path');
const { pathToFileURL } = require('url');
const common = require('../common.js');

const bench = common.createBenchmark(main, {
  type: ['cjs', 'esm'],
  files: [1e2, 1e3],
  n: [10],
}, { flags: ['--experimental-vfs', '--no-warnings'] });

// Builds a module graph of `files` packages, each with its own package.json,
// an index requiring a package-local file and a shared root module, and an
// entry point that pulls in every package.
function buildGraph(layer, files, type) {
  const entryRequires = [];
  if (type === 'esm') {
    layer.writeFileSync('/package.json', '{"type":"module"}');
  }
  layer.writeFileSync('/shared.js',
                      type === 'cjs' ? 'module.exports = 0;' : 'export default 0;');
  for (let i = 0; i < files; i++) {
    layer.mkdirSync(`/${i}`, { recursive: true });
    if (type === 'cjs') {
      layer.writeFileSync(`/${i}/package.json`, '{"main":"index.js"}');
      layer.writeFileSync(`/${i}/lib.js`, 'module.exports = 1;');
      layer.writeFileSync(
        `/${i}/index.js`,
        'require("./lib.js"); require("../shared.js"); module.exports = __filename;');
      entryRequires.push(`require('./${i}/');`);
    } else {
      layer.writeFileSync(`/${i}/package.json`, '{"type":"module"}');
      layer.writeFileSync(`/${i}/lib.js`, 'export default 1;');
      layer.writeFileSync(
        `/${i}/index.js`,
        'import "./lib.js"; import "../shared.js"; export default import.meta.url;');
      entryRequires.push(`import './${i}/index.js';`);
    }
  }
  layer.writeFileSync('/entry.js', entryRequires.join('\n'));
}

async function main({ n, type, files }) {
  const vfs = require('node:vfs');
  const layer = vfs.create();
  buildGraph(layer, files, type);

  bench.start();
  for (let i = 0; i < n; i++) {
    const mountPoint = layer.mount();
    const entry = path.join(mountPoint, 'entry.js');
    if (type === 'cjs') {
      require(entry);
    } else {
      await import(pathToFileURL(entry).href);
    }
    // Unmounting purges the module caches for the mount prefix, so every
    // iteration is a cold load of the full graph.
    layer.unmount();
  }
  bench.end(n * files);
}