summaryrefslogtreecommitdiff
path: root/lib/internal/process/esm_loader.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/internal/process/esm_loader.js')
-rw-r--r--lib/internal/process/esm_loader.js55
1 files changed, 55 insertions, 0 deletions
diff --git a/lib/internal/process/esm_loader.js b/lib/internal/process/esm_loader.js
new file mode 100644
index 0000000000..e45c0faa18
--- /dev/null
+++ b/lib/internal/process/esm_loader.js
@@ -0,0 +1,55 @@
+'use strict';
+
+const { internalBinding } = require('internal/bootstrap/loaders');
+const {
+ setImportModuleDynamicallyCallback,
+ setInitializeImportMetaObjectCallback
+} = internalBinding('module_wrap');
+
+const { getURLFromFilePath } = require('internal/url');
+const Loader = require('internal/modules/esm/Loader');
+const path = require('path');
+const { URL } = require('url');
+
+function normalizeReferrerURL(referrer) {
+ if (typeof referrer === 'string' && path.isAbsolute(referrer)) {
+ return getURLFromFilePath(referrer).href;
+ }
+ return new URL(referrer).href;
+}
+
+function initializeImportMetaObject(wrap, meta) {
+ meta.url = wrap.url;
+}
+
+let loaderResolve;
+exports.loaderPromise = new Promise((resolve, reject) => {
+ loaderResolve = resolve;
+});
+
+exports.ESMLoader = undefined;
+
+exports.setup = function() {
+ setInitializeImportMetaObjectCallback(initializeImportMetaObject);
+
+ let ESMLoader = new Loader();
+ const loaderPromise = (async () => {
+ const userLoader = process.binding('config').userLoader;
+ if (userLoader) {
+ const hooks = await ESMLoader.import(
+ userLoader, getURLFromFilePath(`${process.cwd()}/`).href);
+ ESMLoader = new Loader();
+ ESMLoader.hook(hooks);
+ exports.ESMLoader = ESMLoader;
+ }
+ return ESMLoader;
+ })();
+ loaderResolve(loaderPromise);
+
+ setImportModuleDynamicallyCallback(async (referrer, specifier) => {
+ const loader = await loaderPromise;
+ return loader.import(specifier, normalizeReferrerURL(referrer));
+ });
+
+ exports.ESMLoader = ESMLoader;
+};