summaryrefslogtreecommitdiff
path: root/lib/internal/bootstrap
diff options
context:
space:
mode:
authorBradley Farias <bfarias@godaddy.com>2019-09-30 14:55:59 -0500
committerGuy Bedford <guybedford@gmail.com>2019-10-16 21:50:05 -0400
commita6b030d5ac2c4a2d34f6b9eb3f945d252a42843e (patch)
treedfd91dad91d60e90e39db3b5326d509c32a62f5f /lib/internal/bootstrap
parent1784b7fafac2755f870db3de9eb45a754b7a6477 (diff)
downloadandroid-node-v8-a6b030d5ac2c4a2d34f6b9eb3f945d252a42843e.tar.gz
android-node-v8-a6b030d5ac2c4a2d34f6b9eb3f945d252a42843e.tar.bz2
android-node-v8-a6b030d5ac2c4a2d34f6b9eb3f945d252a42843e.zip
module: refactor modules bootstrap
PR-URL: https://github.com/nodejs/node/pull/29937 Reviewed-By: Myles Borins <myles.borins@gmail.com> Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
Diffstat (limited to 'lib/internal/bootstrap')
-rw-r--r--lib/internal/bootstrap/loaders.js5
-rw-r--r--lib/internal/bootstrap/pre_execution.js69
2 files changed, 64 insertions, 10 deletions
diff --git a/lib/internal/bootstrap/loaders.js b/lib/internal/bootstrap/loaders.js
index 775fea064e..48afed2556 100644
--- a/lib/internal/bootstrap/loaders.js
+++ b/lib/internal/bootstrap/loaders.js
@@ -220,7 +220,10 @@ NativeModule.prototype.compileForPublicLoader = function(needToSyncExports) {
this.compile();
if (needToSyncExports) {
if (!this.exportKeys) {
- this.exportKeys = Object.keys(this.exports);
+ // When using --expose-internals, we do not want to reflect the named
+ // exports from core modules as this can trigger unnecessary getters.
+ const internal = this.id.startsWith('internal/');
+ this.exportKeys = internal ? [] : Object.keys(this.exports);
}
this.getESMFacade();
this.syncExports();
diff --git a/lib/internal/bootstrap/pre_execution.js b/lib/internal/bootstrap/pre_execution.js
index 1126fbcdd7..80ac97ee45 100644
--- a/lib/internal/bootstrap/pre_execution.js
+++ b/lib/internal/bootstrap/pre_execution.js
@@ -5,6 +5,7 @@ const { Object, SafeWeakMap } = primordials;
const { getOptionValue } = require('internal/options');
const { Buffer } = require('buffer');
const { ERR_MANIFEST_ASSERT_INTEGRITY } = require('internal/errors').codes;
+const path = require('path');
function prepareMainThreadExecution(expandArgv1 = false) {
// Patch the process object with legacy properties and normalizations
@@ -404,7 +405,6 @@ function initializeESMLoader() {
'The ESM module loader is experimental.',
'ExperimentalWarning', undefined);
}
-
const {
setImportModuleDynamicallyCallback,
setInitializeImportMetaObjectCallback
@@ -414,14 +414,6 @@ function initializeESMLoader() {
// track of for different ESM modules.
setInitializeImportMetaObjectCallback(esm.initializeImportMetaObject);
setImportModuleDynamicallyCallback(esm.importModuleDynamicallyCallback);
- const userLoader = getOptionValue('--experimental-loader');
- // If --experimental-loader is specified, create a loader with user hooks.
- // Otherwise create the default loader.
- if (userLoader) {
- const { emitExperimentalWarning } = require('internal/util');
- emitExperimentalWarning('--experimental-loader');
- }
- esm.initializeLoader(process.cwd(), userLoader);
}
}
@@ -446,11 +438,70 @@ function loadPreloadModules() {
}
}
+function resolveMainPath(main) {
+ const { toRealPath, Module: CJSModule } =
+ require('internal/modules/cjs/loader');
+
+ // Note extension resolution for the main entry point can be deprecated in a
+ // future major.
+ let mainPath = CJSModule._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 experimentalModules = getOptionValue('--experimental-modules');
+ if (!experimentalModules)
+ return false;
+ const userLoader = getOptionValue('--experimental-loader');
+ if (userLoader)
+ return true;
+ // Determine the module format of the main
+ if (mainPath && mainPath.endsWith('.mjs'))
+ return true;
+ if (!mainPath || mainPath.endsWith('.cjs'))
+ return false;
+ const { readPackageScope } = require('internal/modules/cjs/loader');
+ 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 */
+ );
+ });
+ });
+}
+
+
module.exports = {
patchProcessObject,
+ resolveMainPath,
+ runMainESM,
setupCoverageHooks,
setupWarningHandler,
setupDebugEnv,
+ shouldUseESMLoader,
prepareMainThreadExecution,
initializeDeprecations,
initializeESMLoader,