diff --git a/doc/api/errors.md b/doc/api/errors.md
index ecb76af85ab03c..94c8d7157bf9f5 100644
--- a/doc/api/errors.md
+++ b/doc/api/errors.md
@@ -2816,12 +2816,6 @@ Cached data cannot be created for modules which have already been evaluated.
The module being returned from the linker function is from a different context
than the parent module. Linked modules must share the same context.
-
-
-### `ERR_VM_MODULE_LINKING_ERRORED`
-
-The linker function returned a module for which linking has failed.
-
### `ERR_VM_MODULE_LINK_FAILURE`
@@ -3296,6 +3290,17 @@ Used when a given value is out of the accepted range.
The module must be successfully linked before instantiation.
+
+
+### `ERR_VM_MODULE_LINKING_ERRORED`
+
+
+
+The linker function returned a module for which linking has failed.
+
### `ERR_WORKER_UNSUPPORTED_EXTENSION`
diff --git a/lib/internal/errors.js b/lib/internal/errors.js
index 150b9608bd0f58..4a55e84eeb1d02 100644
--- a/lib/internal/errors.js
+++ b/lib/internal/errors.js
@@ -1625,8 +1625,10 @@ E('ERR_VM_MODULE_CANNOT_CREATE_CACHED_DATA',
'Cached data cannot be created for a module which has been evaluated', Error);
E('ERR_VM_MODULE_DIFFERENT_CONTEXT',
'Linked modules must use the same context', Error);
-E('ERR_VM_MODULE_LINKING_ERRORED',
- 'Linking has already failed for the provided module', Error);
+E('ERR_VM_MODULE_LINK_FAILURE', function(message, cause) {
+ this.cause = cause;
+ return message;
+}, Error);
E('ERR_VM_MODULE_NOT_MODULE',
'Provided module is not an instance of Module', Error);
E('ERR_VM_MODULE_STATUS', 'Module status %s', Error);
diff --git a/lib/internal/vm/module.js b/lib/internal/vm/module.js
index 911b8f4426e586..eee629dda4fd05 100644
--- a/lib/internal/vm/module.js
+++ b/lib/internal/vm/module.js
@@ -34,7 +34,7 @@ const {
ERR_VM_MODULE_ALREADY_LINKED,
ERR_VM_MODULE_DIFFERENT_CONTEXT,
ERR_VM_MODULE_CANNOT_CREATE_CACHED_DATA,
- ERR_VM_MODULE_LINKING_ERRORED,
+ ERR_VM_MODULE_LINK_FAILURE,
ERR_VM_MODULE_NOT_MODULE,
ERR_VM_MODULE_STATUS,
} = require('internal/errors').codes;
@@ -317,9 +317,7 @@ class SourceTextModule extends Module {
throw new ERR_VM_MODULE_DIFFERENT_CONTEXT();
}
if (module.status === 'errored') {
- // TODO(devsnek): replace with ERR_VM_MODULE_LINK_FAILURE
- // and error cause proposal.
- throw new ERR_VM_MODULE_LINKING_ERRORED();
+ throw new ERR_VM_MODULE_LINK_FAILURE(`request for '${identifier}' resolved to an errored module`, module.error);
}
if (module.status === 'unlinked') {
await module[kLink](linker);
diff --git a/test/parallel/test-vm-module-errors.js b/test/parallel/test-vm-module-errors.js
index 888250cef84f6f..bec8258a4145c7 100644
--- a/test/parallel/test-vm-module-errors.js
+++ b/test/parallel/test-vm-module-errors.js
@@ -139,20 +139,25 @@ async function checkLinking() {
code: 'ERR_VM_MODULE_DIFFERENT_CONTEXT'
});
+ const error = new Error();
await assert.rejects(async () => {
- const erroredModule = new SourceTextModule('import "foo";');
+ globalThis.error = error;
+ const erroredModule = new SourceTextModule('throw error;');
+ await erroredModule.link(common.mustNotCall());
try {
- await erroredModule.link(common.mustCall(() => ({})));
+ await erroredModule.evaluate();
} catch {
// ignored
- } finally {
- assert.strictEqual(erroredModule.status, 'errored');
}
+ delete globalThis.error;
+
+ assert.strictEqual(erroredModule.status, 'errored');
const rootModule = new SourceTextModule('import "errored";');
await rootModule.link(common.mustCall(() => erroredModule));
}, {
- code: 'ERR_VM_MODULE_LINKING_ERRORED'
+ code: 'ERR_VM_MODULE_LINK_FAILURE',
+ cause: error,
});
}