summaryrefslogtreecommitdiffstats
path: root/js/src/shell/ModuleLoader.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/shell/ModuleLoader.js')
-rw-r--r--js/src/shell/ModuleLoader.js43
1 files changed, 43 insertions, 0 deletions
diff --git a/js/src/shell/ModuleLoader.js b/js/src/shell/ModuleLoader.js
new file mode 100644
index 000000000..d8767f05f
--- /dev/null
+++ b/js/src/shell/ModuleLoader.js
@@ -0,0 +1,43 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// A basic synchronous module loader for testing the shell.
+
+Reflect.Loader = new class {
+ constructor() {
+ this.registry = new Map();
+ this.loadPath = getModuleLoadPath();
+ }
+
+ resolve(name) {
+ if (os.path.isAbsolute(name))
+ return name;
+
+ return os.path.join(this.loadPath, name);
+ }
+
+ fetch(path) {
+ return os.file.readFile(path);
+ }
+
+ loadAndParse(name) {
+ let path = this.resolve(name);
+
+ if (this.registry.has(path))
+ return this.registry.get(path);
+
+ let source = this.fetch(path);
+ let module = parseModule(source, path);
+ this.registry.set(path, module);
+ return module;
+ }
+
+ ["import"](name, referrer) {
+ let module = this.loadAndParse(name);
+ module.declarationInstantiation();
+ return module.evaluation();
+ }
+};
+
+setModuleResolveHook((module, requestName) => Reflect.Loader.loadAndParse(requestName));