summaryrefslogtreecommitdiff
path: root/lib/module.js
diff options
context:
space:
mode:
authorguybedford <guybedford@gmail.com>2017-09-03 13:20:06 +0200
committerBradley Farias <bradley.meck@gmail.com>2017-10-11 08:47:23 -0500
commitd21a11dc23d6104b1d03fa2ddc1c808dcaf89c31 (patch)
tree14098b620e958d693f0c420a6073d7e26986069e /lib/module.js
parentacb36abf753e524b03c15558537ef52f53e8f170 (diff)
downloadnode-new-d21a11dc23d6104b1d03fa2ddc1c808dcaf89c31.tar.gz
module: resolve and instantiate loader pipeline hooks
This enables a --loader flag for Node, which can provide custom "resolve" and "dynamicInstantiate" methods for custom ES module loading. In the process, module providers have been converted from classes into functions and the module APIs have been made to pass URL strings over objects. PR-URL: https://github.com/nodejs/node/pull/15445 Reviewed-By: Bradley Farias <bradley.meck@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com> Reviewed-By: Michaƫl Zasso <targos@protonmail.com> Reviewed-By: Timothy Gu <timothygu99@gmail.com>
Diffstat (limited to 'lib/module.js')
-rw-r--r--lib/module.js48
1 files changed, 26 insertions, 22 deletions
diff --git a/lib/module.js b/lib/module.js
index 6693bedeb1..73f3cc8dd8 100644
--- a/lib/module.js
+++ b/lib/module.js
@@ -40,7 +40,7 @@ const errors = require('internal/errors');
const Loader = require('internal/loader/Loader');
const ModuleJob = require('internal/loader/ModuleJob');
const { createDynamicModule } = require('internal/loader/ModuleWrap');
-const ESMLoader = new Loader();
+let ESMLoader;
function stat(filename) {
filename = path.toNamespacedPath(filename);
@@ -424,29 +424,31 @@ Module._load = function(request, parent, isMain) {
var filename = null;
if (isMain) {
- let err;
try {
filename = Module._resolveFilename(request, parent, isMain);
} catch (e) {
// try to keep stack
e.stack;
- err = e;
+ throw e;
}
if (experimentalModules) {
- if (filename === null || /\.mjs$/.test(filename)) {
- try {
- ESMLoader.import(getURLFromFilePath(filename).href).catch((e) => {
- console.error(e);
- process.exit(1);
- });
- return;
- } catch (e) {
- // well, it isn't ESM
+ (async () => {
+ // loader setup
+ if (!ESMLoader) {
+ ESMLoader = new Loader();
+ const userLoader = process.binding('config').userLoader;
+ if (userLoader) {
+ const hooks = await new Loader().import(userLoader);
+ ESMLoader.hook(hooks);
+ }
}
- }
- }
- if (err) {
- throw err;
+ await ESMLoader.import(getURLFromFilePath(filename).href);
+ })()
+ .catch((e) => {
+ console.error(e);
+ process.exit(1);
+ });
+ return;
}
} else {
filename = Module._resolveFilename(request, parent, isMain);
@@ -521,16 +523,18 @@ Module.prototype.load = function(filename) {
Module._extensions[extension](this, filename);
this.loaded = true;
- if (experimentalModules) {
+ if (ESMLoader) {
const url = getURLFromFilePath(filename);
- if (ESMLoader.moduleMap.has(`${url}`) !== true) {
+ const urlString = `${url}`;
+ if (ESMLoader.moduleMap.has(urlString) !== true) {
const ctx = createDynamicModule(['default'], url);
ctx.reflect.exports.default.set(this.exports);
- ESMLoader.moduleMap.set(`${url}`,
- new ModuleJob(ESMLoader, ctx.module));
+ ESMLoader.moduleMap.set(urlString,
+ new ModuleJob(ESMLoader, url, async () => ctx));
} else {
- ESMLoader.moduleMap.get(`${url}`).moduleProvider.finish(
- Module._cache[filename]);
+ const job = ESMLoader.moduleMap.get(urlString);
+ if (job.reflect)
+ job.reflect.exports.default.set(this.exports);
}
}
};