UNPKG

js-slang

Version:

Javascript-based implementations of Source, written in Typescript

85 lines 3.44 kB
"use strict"; 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