summaryrefslogtreecommitdiff
path: root/test/fixtures/es-module-loaders
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 /test/fixtures/es-module-loaders
parentacb36abf753e524b03c15558537ef52f53e8f170 (diff)
downloadandroid-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')
-rw-r--r--test/fixtures/es-module-loaders/builtin-named-exports-loader.mjs29
-rw-r--r--test/fixtures/es-module-loaders/example-loader.mjs34
-rw-r--r--test/fixtures/es-module-loaders/js-as-esm.js1
-rw-r--r--test/fixtures/es-module-loaders/js-loader.mjs19
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'
+ };
+}