All files / lib/internal/modules run_main.js

96.1% Statements 74/77
93.33% Branches 28/30
100% Functions 4/4
96.1% Lines 74/77

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78140x 140x 140x 140x 140x 140x 140x 3903x 3903x 3903x 3903x 3903x 3903x 3903x 3886x 3886x 3886x 3886x 3886x 3886x 3903x 140x 3902x 3902x 3902x 3902x 3882x 3882x 3882x 3882x 3877x 3902x 3902x 3902x 3902x 3796x 3902x 3902x 140x 88x 88x 88x 88x 88x 88x 85x 85x 85x 88x 17x       17x 17x 17x 17x 88x 88x 140x 140x 140x 140x 3903x 3903x 3903x 3903x 88x 3897x 3809x 3809x 3809x 3903x 140x 140x 140x 140x  
'use strict';
 
const CJSLoader = require('internal/modules/cjs/loader');
const { Module, toRealPath, readPackageScope } = CJSLoader;
const { getOptionValue } = require('internal/options');
const path = require('path');
 
function resolveMainPath(main) {
  // Note extension resolution for the main entry point can be deprecated in a
  // future major.
  // Module._findPath is monkey-patchable here.
  let mainPath = Module._findPath(path.resolve(main), null, true);
  if (!mainPath)
    return;
 
  const preserveSymlinksMain = getOptionValue('--preserve-symlinks-main');
  if (!preserveSymlinksMain)
    mainPath = toRealPath(mainPath);
 
  return mainPath;
}
 
function shouldUseESMLoader(mainPath) {
  const userLoader = getOptionValue('--experimental-loader');
  if (userLoader)
    return true;
  const esModuleSpecifierResolution =
    getOptionValue('--es-module-specifier-resolution');
  if (esModuleSpecifierResolution === 'node')
    return true;
  // Determine the module format of the main
  if (mainPath && mainPath.endsWith('.mjs'))
    return true;
  if (!mainPath || mainPath.endsWith('.cjs'))
    return false;
  const pkg = readPackageScope(mainPath);
  return pkg && pkg.data.type === 'module';
}
 
function runMainESM(mainPath) {
  const esmLoader = require('internal/process/esm_loader');
  const { pathToFileURL } = require('internal/url');
  const { hasUncaughtExceptionCaptureCallback } =
      require('internal/process/execution');
  return esmLoader.initializeLoader().then(() => {
    const main = path.isAbsolute(mainPath) ?
      pathToFileURL(mainPath).href : mainPath;
    return esmLoader.ESMLoader.import(main);
  }).catch((e) => {
    if (hasUncaughtExceptionCaptureCallback()) {
      process._fatalException(e);
      return;
    }
    internalBinding('errors').triggerUncaughtException(
      e,
      true /* fromPromise */
    );
  });
}
 
// For backwards compatibility, we have to run a bunch of
// monkey-patchable code that belongs to the CJS loader (exposed by
// `require('module')`) even when the entry point is ESM.
function executeUserEntryPoint(main = process.argv[1]) {
  const resolvedMain = resolveMainPath(main);
  const useESMLoader = shouldUseESMLoader(resolvedMain);
  if (useESMLoader) {
    runMainESM(resolvedMain || main);
  } else {
    // Module._load is the monkey-patchable CJS module loader.
    Module._load(main, null, true);
  }
}
 
module.exports = {
  executeUserEntryPoint
};