52 lines
1.1 KiB
JavaScript
52 lines
1.1 KiB
JavaScript
/**
|
|
* Any copyright is dedicated to the Public Domain.
|
|
* http://creativecommons.org/publicdomain/zero/1.0/
|
|
*/
|
|
|
|
function ModuleLoader(base, depth) {
|
|
const modules = {};
|
|
|
|
const require = async function (id) {
|
|
if (modules[id]) {
|
|
return modules[id].exported_symbols;
|
|
}
|
|
|
|
const url = new URL(depth + id, base);
|
|
|
|
const module = Object.create(null, {
|
|
exported_symbols: {
|
|
configurable: false,
|
|
enumerable: true,
|
|
value: Object.create(null),
|
|
writable: true,
|
|
},
|
|
});
|
|
|
|
modules[id] = module;
|
|
|
|
const xhr = new XMLHttpRequest();
|
|
xhr.open("GET", url.href, false);
|
|
xhr.responseType = "text";
|
|
xhr.send();
|
|
|
|
let source = xhr.responseText;
|
|
|
|
let code = new Function(
|
|
"require_module",
|
|
"exported_symbols",
|
|
`eval(arguments[2] + "\\n//# sourceURL=" + arguments[3] + "\\n")`
|
|
);
|
|
code(require, module.exported_symbols, source, url.href);
|
|
|
|
return module.exported_symbols;
|
|
};
|
|
|
|
const returnObj = {
|
|
require: {
|
|
enumerable: true,
|
|
value: require,
|
|
},
|
|
};
|
|
|
|
return Object.create(null, returnObj);
|
|
}
|