thebe-core
Version:
Typescript based core functionality for Thebe
78 lines • 3.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.requireLoader = void 0;
const tslib_1 = require("tslib");
const cdn = 'https://cdn.jsdelivr.net/npm/';
/**
* Load a package using requirejs and return a promise
*/
function requirePromise(requirejs, moduleName) {
return new Promise((resolve, reject) => requirejs.require([`${moduleName}`], resolve, reject));
}
/**
* The URL structure is /npm/package@version/file.js
*/
function moduleNameToCDNUrl(moduleName, moduleVersion) {
let packageName = moduleName;
let fileName = 'index'; // default filename
// if a '/' is present, like 'foo/bar', packageName is changed to 'foo', and path to 'bar'
// We first find the first '/'
let index = moduleName.indexOf('/');
if (index !== -1 && moduleName[0] === '@') {
// if we have a namespace, it's a different story
// @foo/bar/baz should translate to @foo/bar and baz
// so we find the 2nd '/'
index = moduleName.indexOf('/', index + 1);
}
if (index !== -1) {
fileName = moduleName.substr(index + 1);
packageName = moduleName.substr(0, index);
}
return `${cdn}${packageName}@${moduleVersion}/dist/${fileName}`;
}
function requireFromCDN(requirejs, moduleName, moduleVersion) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
const url = moduleNameToCDNUrl(moduleName, moduleVersion);
const conf = { paths: {} };
conf.paths[moduleName] = url;
requirejs.require.config(conf);
try {
// note: await needed here for try/catch behaviour
const module = yield requirePromise(requirejs, moduleName);
return module;
}
catch (err) {
console.error(`thebe:loader requirejs error on cdn require`, err);
throw err;
}
});
}
/**
* Load an amd module locally and fall back to specified CDN if unavailable.
*
* @param moduleName The name of the module to load..
* @param version The semver range for the module, if loaded from a CDN.
*
* By default, the CDN service used is cdn.jsdelivr.net. However, this default can be
* overridden by specifying another URL via the HTML attribute
* "data-jupyter-widgets-cdn" on a script tag of the page.
*
* The semver range is only used with the CDN.
*/
function requireLoader(requirejs, moduleName, moduleVersion, useCDNOnly = false) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
console.debug(`thebe:loader loading ${moduleName}@${moduleVersion}`);
if (useCDNOnly) {
return requireFromCDN(requirejs, moduleName, moduleVersion);
}
else {
if (requirejs.require.defined(moduleName)) {
return requirePromise(requirejs, moduleName);
}
console.debug(`thebe:loader falling back to ${cdn} for ${moduleName}@${moduleVersion}`);
return requireFromCDN(requirejs, moduleName, moduleVersion);
}
});
}
exports.requireLoader = requireLoader;
//# sourceMappingURL=loader.js.map