diff options
Diffstat (limited to 'lib/internal/process/esm_loader.js')
-rw-r--r-- | lib/internal/process/esm_loader.js | 55 |
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; +}; |