js-slang
Version:
Javascript-based implementations of Source, written in Typescript
85 lines • 3.44 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.memoizedGetModuleDocsAsync = exports.memoizedGetModuleManifestAsync = void 0;
exports.setModulesStaticURL = setModulesStaticURL;
exports.loadModuleTabsAsync = loadModuleTabsAsync;
exports.loadModuleBundleAsync = loadModuleBundleAsync;
const errors_1 = require("../errors");
const importers_1 = require("./importers");
const requireProvider_1 = require("./requireProvider");
function setModulesStaticURL(value) {
(0, importers_1.setModulesStaticURL)(value);
// Changing the backend url should clear the caches
// TODO: Do we want to memoize based on backend url?
exports.memoizedGetModuleDocsAsync.cache.clear();
exports.memoizedGetModuleManifestAsync.reset();
}
// lodash's memoize function memoizes on errors. This is undesirable,
// so we have our own custom memoization that won't memoize on errors
function getManifestImporter() {
let manifest = null;
async function func() {
if (manifest !== null) {
return manifest;
}
;
({ default: manifest } = await (0, importers_1.docsImporter)(`${importers_1.MODULES_STATIC_URL}/modules.json`));
return manifest;
}
func.reset = () => {
manifest = null;
};
return func;
}
function getMemoizedDocsImporter() {
const docs = new Map();
async function func(moduleName, throwOnError) {
if (docs.has(moduleName)) {
return docs.get(moduleName);
}
try {
const { default: loadedDocs } = await (0, importers_1.docsImporter)(`${importers_1.MODULES_STATIC_URL}/jsons/${moduleName}.json`);
docs.set(moduleName, loadedDocs);
return loadedDocs;
}
catch (error) {
if (throwOnError)
throw error;
console.warn(`Failed to load documentation for ${moduleName}:`, error);
return null;
}
}
func.cache = docs;
return func;
}
exports.memoizedGetModuleManifestAsync = getManifestImporter();
exports.memoizedGetModuleDocsAsync = getMemoizedDocsImporter();
async function loadModuleTabsAsync(moduleName) {
const manifest = await (0, exports.memoizedGetModuleManifestAsync)();
const moduleInfo = manifest[moduleName];
return Promise.all(moduleInfo.tabs.map(async (tabName) => {
const { default: result } = await (0, importers_1.bundleAndTabImporter)(`${importers_1.MODULES_STATIC_URL}/tabs/${tabName}.js`);
return result;
}));
}
async function loadModuleBundleAsync(moduleName, context, node) {
const { default: result } = await (0, importers_1.bundleAndTabImporter)(`${importers_1.MODULES_STATIC_URL}/bundles/${moduleName}.js`);
try {
const loadedModule = result((0, requireProvider_1.getRequireProvider)(context));
return Object.entries(loadedModule).reduce((res, [name, value]) => {
if (typeof value === 'function') {
const repr = `function ${name} {\n\t[Function from ${moduleName}\n\tImplementation hidden]\n}`;
value[Symbol.toStringTag] = () => repr;
value.toString = () => repr;
}
return {
...res,
[name]: value
};
}, {});
}
catch (error) {
throw new errors_1.ModuleInternalError(moduleName, error, node);
}
}
//# sourceMappingURL=loaders.js.map