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 /test/fixtures/es-module-loaders | |
parent | acb36abf753e524b03c15558537ef52f53e8f170 (diff) | |
download | android-node-v8-d21a11dc23d6104b1d03fa2ddc1c808dcaf89c31.tar.gz android-node-v8-d21a11dc23d6104b1d03fa2ddc1c808dcaf89c31.tar.bz2 android-node-v8-d21a11dc23d6104b1d03fa2ddc1c808dcaf89c31.zip |
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 'test/fixtures/es-module-loaders')
4 files changed, 83 insertions, 0 deletions
diff --git a/test/fixtures/es-module-loaders/builtin-named-exports-loader.mjs b/test/fixtures/es-module-loaders/builtin-named-exports-loader.mjs new file mode 100644 index 0000000000..0734003802 --- /dev/null +++ b/test/fixtures/es-module-loaders/builtin-named-exports-loader.mjs @@ -0,0 +1,29 @@ +import module from 'module'; + +const builtins = new Set( + Object.keys(process.binding('natives')).filter(str => + /^(?!(?:internal|node|v8)\/)/.test(str)) +) + +export function resolve (specifier, base, defaultResolver) { + if (builtins.has(specifier)) { + return { + url: `node:${specifier}`, + format: 'dynamic' + }; + } + return defaultResolver(specifier, base); +} + +export async function dynamicInstantiate (url) { + const builtinInstance = module._load(url.substr(5)); + const builtinExports = ['default', ...Object.keys(builtinInstance)]; + return { + exports: builtinExports, + execute: exports => { + for (let name of builtinExports) + exports[name].set(builtinInstance[name]); + exports.default.set(builtinInstance); + } + }; +} diff --git a/test/fixtures/es-module-loaders/example-loader.mjs b/test/fixtures/es-module-loaders/example-loader.mjs new file mode 100644 index 0000000000..771273a8d8 --- /dev/null +++ b/test/fixtures/es-module-loaders/example-loader.mjs @@ -0,0 +1,34 @@ +import url from 'url'; +import path from 'path'; +import process from 'process'; + +const builtins = new Set( + Object.keys(process.binding('natives')).filter((str) => + /^(?!(?:internal|node|v8)\/)/.test(str)) +); +const JS_EXTENSIONS = new Set(['.js', '.mjs']); + +export function resolve(specifier, parentModuleURL/*, defaultResolve */) { + if (builtins.has(specifier)) { + return { + url: specifier, + format: 'builtin' + }; + } + if (/^\.{0,2}[/]/.test(specifier) !== true && !specifier.startsWith('file:')) { + // For node_modules support: + // return defaultResolve(specifier, parentModuleURL); + throw new Error( + `imports must begin with '/', './', or '../'; '${specifier}' does not`); + } + const resolved = new url.URL(specifier, parentModuleURL); + const ext = path.extname(resolved.pathname); + if (!JS_EXTENSIONS.has(ext)) { + throw new Error( + `Cannot load file with non-JavaScript file extension ${ext}.`); + } + return { + url: resolved.href, + format: 'esm' + }; +} diff --git a/test/fixtures/es-module-loaders/js-as-esm.js b/test/fixtures/es-module-loaders/js-as-esm.js new file mode 100644 index 0000000000..b4d2741b2f --- /dev/null +++ b/test/fixtures/es-module-loaders/js-as-esm.js @@ -0,0 +1 @@ +export const namedExport = 'named-export'; diff --git a/test/fixtures/es-module-loaders/js-loader.mjs b/test/fixtures/es-module-loaders/js-loader.mjs new file mode 100644 index 0000000000..79d9774c1d --- /dev/null +++ b/test/fixtures/es-module-loaders/js-loader.mjs @@ -0,0 +1,19 @@ +import _url from 'url'; +const builtins = new Set( + Object.keys(process.binding('natives')).filter(str => + /^(?!(?:internal|node|v8)\/)/.test(str)) +) +export function resolve (specifier, base) { + if (builtins.has(specifier)) { + return { + url: specifier, + format: 'builtin' + }; + } + // load all dependencies as esm, regardless of file extension + const url = new _url.URL(specifier, base).href; + return { + url, + format: 'esm' + }; +} |