diff options
author | guybedford <guybedford@gmail.com> | 2017-09-03 13:20:06 +0200 |
---|---|---|
committer | Bradley Farias <bradley.meck@gmail.com> | 2017-10-11 08:47:23 -0500 |
commit | d21a11dc23d6104b1d03fa2ddc1c808dcaf89c31 (patch) | |
tree | 14098b620e958d693f0c420a6073d7e26986069e /lib/module.js | |
parent | acb36abf753e524b03c15558537ef52f53e8f170 (diff) | |
download | node-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.js | 48 |
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); } } }; |