Skip to content

Commit

Permalink
esm: exit the process with an error if loader has an issue
Browse files Browse the repository at this point in the history
Previously, this would trigger an unhandled rejection that the user
cannot handle.

Fixes: #30205

PR-URL: #30219
Reviewed-By: Guy Bedford <guybedford@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Yongsheng Zhang <zyszys98@gmail.com>
  • Loading branch information
targos authored and BethGriggs committed Feb 6, 2020
1 parent 680ae77 commit 7b46b20
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 10 deletions.
20 changes: 10 additions & 10 deletions lib/internal/bootstrap/pre_execution.js
Expand Up @@ -480,16 +480,16 @@ function runMainESM(mainPath) {
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 */
);
});
return esmLoader.ESMLoader.import(main);
}).catch((e) => {
if (hasUncaughtExceptionCaptureCallback()) {
process._fatalException(e);
return;
}
internalBinding('errors').triggerUncaughtException(
e,
true /* fromPromise */
);
});
}

Expand Down
3 changes: 3 additions & 0 deletions test/message/esm_loader_not_found.mjs
@@ -0,0 +1,3 @@
// Flags: --experimental-modules --experimental-loader i-dont-exist
import '../common/index.mjs';
console.log('This should not be printed');
18 changes: 18 additions & 0 deletions test/message/esm_loader_not_found.out
@@ -0,0 +1,18 @@
(node:*) ExperimentalWarning: The ESM module loader is experimental.
(node:*) ExperimentalWarning: --experimental-loader is an experimental feature. This feature could change at any time
internal/modules/esm/default_resolve.js:*
let url = moduleWrapResolve(specifier, parentURL);
^

Error: Cannot find package 'i-dont-exist' imported from *
at Loader.resolve [as _resolve] (internal/modules/esm/default_resolve.js:*:*)
at Loader.resolve (internal/modules/esm/loader.js:*:*)
at Loader.getModuleJob (internal/modules/esm/loader.js:*:*)
at Loader.import (internal/modules/esm/loader.js:*:*)
at internal/process/esm_loader.js:*:*
at Object.initializeLoader (internal/process/esm_loader.js:*:*)
at runMainESM (internal/bootstrap/pre_execution.js:*:*)
at Function.Module.runMain (internal/modules/cjs/loader.js:*:*)
at internal/main/run_main_module.js:*:* {
code: 'ERR_MODULE_NOT_FOUND'
}
3 changes: 3 additions & 0 deletions test/message/esm_loader_syntax_error.mjs
@@ -0,0 +1,3 @@
// Flags: --experimental-modules --experimental-loader ./test/fixtures/es-module-loaders/syntax-error.mjs
import '../common/index.mjs';
console.log('This should not be printed');
9 changes: 9 additions & 0 deletions test/message/esm_loader_syntax_error.out
@@ -0,0 +1,9 @@
(node:*) ExperimentalWarning: The ESM module loader is experimental.
(node:*) ExperimentalWarning: --experimental-loader is an experimental feature. This feature could change at any time
file://*/test/fixtures/es-module-loaders/syntax-error.mjs:2
await async () => 0;
^^^^^

SyntaxError: Unexpected reserved word
at Loader.moduleStrategy (internal/modules/esm/translators.js:*:*)
at async link (internal/modules/esm/module_job.js:*:*)

0 comments on commit 7b46b20

Please sign in to comment.