diff options
author | punteek <prateek1@ucla.edu> | 2018-03-06 19:46:39 -0800 |
---|---|---|
committer | Gus Caplan <me@gus.host> | 2018-03-31 19:55:50 -0500 |
commit | 07ba9141e475ec63f6ef56b67ec5f98077cd3446 (patch) | |
tree | 99f36abde8cd6fd8b4a074fdfe8b1d8fe7fa6388 /lib/internal | |
parent | 28b622cb08602d77512fa3d659451cd317dfcc41 (diff) | |
download | node-new-07ba9141e475ec63f6ef56b67ec5f98077cd3446.tar.gz |
vm: add support for import.meta to Module
Fixes: https://github.com/nodejs/node/issues/18570
PR-URL: https://github.com/nodejs/node/pull/19277
Reviewed-By: Gus Caplan <me@gus.host>
Reviewed-By: Tiancheng "Timothy" Gu <timothygu99@gmail.com>
Diffstat (limited to 'lib/internal')
-rw-r--r-- | lib/internal/bootstrap/node.js | 11 | ||||
-rw-r--r-- | lib/internal/process/esm_loader.js | 17 | ||||
-rw-r--r-- | lib/internal/vm/module.js | 19 |
3 files changed, 41 insertions, 6 deletions
diff --git a/lib/internal/bootstrap/node.js b/lib/internal/bootstrap/node.js index 01efe6f329..99bf00a6d6 100644 --- a/lib/internal/bootstrap/node.js +++ b/lib/internal/bootstrap/node.js @@ -108,10 +108,13 @@ 'DeprecationWarning', 'DEP0062', startup, true); } - if (process.binding('config').experimentalModules) { - process.emitWarning( - 'The ESM module loader is experimental.', - 'ExperimentalWarning', undefined); + if (process.binding('config').experimentalModules || + process.binding('config').experimentalVMModules) { + if (process.binding('config').experimentalModules) { + process.emitWarning( + 'The ESM module loader is experimental.', + 'ExperimentalWarning', undefined); + } NativeModule.require('internal/process/esm_loader').setup(); } diff --git a/lib/internal/process/esm_loader.js b/lib/internal/process/esm_loader.js index bcb6501af6..db28ca04b1 100644 --- a/lib/internal/process/esm_loader.js +++ b/lib/internal/process/esm_loader.js @@ -10,6 +10,10 @@ const { getURLFromFilePath } = require('internal/url'); const Loader = require('internal/modules/esm/loader'); const path = require('path'); const { URL } = require('url'); +const { + initImportMetaMap, + wrapToModuleMap +} = require('internal/vm/module'); function normalizeReferrerURL(referrer) { if (typeof referrer === 'string' && path.isAbsolute(referrer)) { @@ -19,7 +23,18 @@ function normalizeReferrerURL(referrer) { } function initializeImportMetaObject(wrap, meta) { - meta.url = wrap.url; + const vmModule = wrapToModuleMap.get(wrap); + if (vmModule === undefined) { + // This ModuleWrap belongs to the Loader. + meta.url = wrap.url; + } else { + const initializeImportMeta = initImportMetaMap.get(vmModule); + if (initializeImportMeta !== undefined) { + // This ModuleWrap belongs to vm.Module, initializer callback was + // provided. + initializeImportMeta(meta, vmModule); + } + } } let loaderResolve; diff --git a/lib/internal/vm/module.js b/lib/internal/vm/module.js index 48d591f3bf..9af071ce28 100644 --- a/lib/internal/vm/module.js +++ b/lib/internal/vm/module.js @@ -43,6 +43,10 @@ const perContextModuleId = new WeakMap(); const wrapMap = new WeakMap(); const dependencyCacheMap = new WeakMap(); const linkingStatusMap = new WeakMap(); +// vm.Module -> function +const initImportMetaMap = new WeakMap(); +// ModuleWrap -> vm.Module +const wrapToModuleMap = new WeakMap(); class Module { constructor(src, options = {}) { @@ -80,6 +84,16 @@ class Module { perContextModuleId.set(context, 1); } + if (options.initializeImportMeta !== undefined) { + if (typeof options.initializeImportMeta === 'function') { + initImportMetaMap.set(this, options.initializeImportMeta); + } else { + throw new ERR_INVALID_ARG_TYPE( + 'options.initializeImportMeta', 'function', + options.initializeImportMeta); + } + } + const wrap = new ModuleWrap(src, url, { [kParsingContext]: context, lineOffset: options.lineOffset, @@ -88,6 +102,7 @@ class Module { wrapMap.set(this, wrap); linkingStatusMap.set(this, 'unlinked'); + wrapToModuleMap.set(wrap, this); Object.defineProperties(this, { url: { value: url, enumerable: true }, @@ -206,5 +221,7 @@ class Module { } module.exports = { - Module + Module, + initImportMetaMap, + wrapToModuleMap }; |