summaryrefslogtreecommitdiff
path: root/lib/internal/vm/source_text_module.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/internal/vm/source_text_module.js')
-rw-r--r--lib/internal/vm/source_text_module.js47
1 files changed, 34 insertions, 13 deletions
diff --git a/lib/internal/vm/source_text_module.js b/lib/internal/vm/source_text_module.js
index c1c3611d8f..d22db6e914 100644
--- a/lib/internal/vm/source_text_module.js
+++ b/lib/internal/vm/source_text_module.js
@@ -1,5 +1,6 @@
'use strict';
+const { isModuleNamespaceObject } = require('util').types;
const { URL } = require('internal/url');
const { isContext } = internalBinding('contextify');
const {
@@ -9,7 +10,7 @@ const {
ERR_VM_MODULE_LINKING_ERRORED,
ERR_VM_MODULE_NOT_LINKED,
ERR_VM_MODULE_NOT_MODULE,
- ERR_VM_MODULE_STATUS
+ ERR_VM_MODULE_STATUS,
} = require('internal/errors').codes;
const {
getConstructorOf,
@@ -21,6 +22,7 @@ const { validateInt32, validateUint32 } = require('internal/validators');
const {
ModuleWrap,
+ callbackMap,
kUninstantiated,
kInstantiating,
kInstantiated,
@@ -43,8 +45,6 @@ const perContextModuleId = new WeakMap();
const wrapMap = new WeakMap();
const dependencyCacheMap = new WeakMap();
const linkingStatusMap = new WeakMap();
-// vm.SourceTextModule -> function
-const initImportMetaMap = new WeakMap();
// ModuleWrap -> vm.SourceTextModule
const wrapToModuleMap = new WeakMap();
const defaultModuleName = 'vm:module';
@@ -63,7 +63,8 @@ class SourceTextModule {
context,
lineOffset = 0,
columnOffset = 0,
- initializeImportMeta
+ initializeImportMeta,
+ importModuleDynamically,
} = options;
if (context !== undefined) {
@@ -96,13 +97,16 @@ class SourceTextModule {
validateInt32(lineOffset, 'options.lineOffset');
validateInt32(columnOffset, 'options.columnOffset');
- if (initializeImportMeta !== undefined) {
- if (typeof initializeImportMeta === 'function') {
- initImportMetaMap.set(this, initializeImportMeta);
- } else {
- throw new ERR_INVALID_ARG_TYPE(
- 'options.initializeImportMeta', 'function', initializeImportMeta);
- }
+ if (initializeImportMeta !== undefined &&
+ typeof initializeImportMeta !== 'function') {
+ throw new ERR_INVALID_ARG_TYPE(
+ 'options.initializeImportMeta', 'function', initializeImportMeta);
+ }
+
+ if (importModuleDynamically !== undefined &&
+ typeof importModuleDynamically !== 'function') {
+ throw new ERR_INVALID_ARG_TYPE(
+ 'options.importModuleDynamically', 'function', importModuleDynamically);
}
const wrap = new ModuleWrap(src, url, context, lineOffset, columnOffset);
@@ -110,6 +114,22 @@ class SourceTextModule {
linkingStatusMap.set(this, 'unlinked');
wrapToModuleMap.set(wrap, this);
+ callbackMap.set(wrap, {
+ initializeImportMeta,
+ importModuleDynamically: importModuleDynamically ? async (...args) => {
+ const m = await importModuleDynamically(...args);
+ if (isModuleNamespaceObject(m)) {
+ return m;
+ }
+ if (!m || !wrapMap.has(m))
+ throw new ERR_VM_MODULE_NOT_MODULE();
+ const childLinkingStatus = linkingStatusMap.get(m);
+ if (childLinkingStatus === 'errored')
+ throw m.error;
+ return m.namespace;
+ } : undefined,
+ });
+
Object.defineProperties(this, {
url: { value: url, enumerable: true },
context: { value: context, enumerable: true },
@@ -245,6 +265,7 @@ class SourceTextModule {
module.exports = {
SourceTextModule,
- initImportMetaMap,
- wrapToModuleMap
+ wrapToModuleMap,
+ wrapMap,
+ linkingStatusMap,
};