123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- /*-----------------------------------------------------------------------------
- | Copyright (c) Jupyter Development Team.
- | Distributed under the terms of the Modified BSD License.
- |----------------------------------------------------------------------------*/
- import { PageConfig } from '@jupyterlab/coreutils';
- // Promise.allSettled polyfill, until our supported browsers implement it
- // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled
- if (Promise.allSettled === undefined) {
- Promise.allSettled = promises =>
- Promise.all(
- promises.map(promise =>
- promise
- .then(value => ({
- status: "fulfilled",
- value,
- }), reason => ({
- status: "rejected",
- reason,
- }))
- )
- );
- }
- import './style.js';
- async function createModule(scope, module) {
- try {
- const factory = await window._JUPYTERLAB[scope].get(module);
- return factory();
- } catch(e) {
- console.warn(`Failed to create module: package: ${scope}; module: ${module}`);
- throw e;
- }
- }
- /**
- * The main entry point for the application.
- */
- export async function main() {
- // Handle a browser test.
- // Set up error handling prior to loading extensions.
- var browserTest = PageConfig.getOption('browserTest');
- if (browserTest.toLowerCase() === 'true') {
- var el = document.createElement('div');
- el.id = 'browserTest';
- document.body.appendChild(el);
- el.textContent = '[]';
- el.style.display = 'none';
- var errors = [];
- var reported = false;
- var timeout = 25000;
- var report = function() {
- if (reported) {
- return;
- }
- reported = true;
- el.className = 'completed';
- }
- window.onerror = function(msg, url, line, col, error) {
- errors.push(String(error));
- el.textContent = JSON.stringify(errors)
- };
- console.error = function(message) {
- errors.push(String(message));
- el.textContent = JSON.stringify(errors)
- };
- }
- var JupyterLab = require('@jupyterlab/application').JupyterLab;
- var disabled = [];
- var deferred = [];
- var ignorePlugins = [];
- var register = [];
- const federatedExtensionPromises = [];
- const federatedMimeExtensionPromises = [];
- const federatedStylePromises = [];
- // Start initializing the federated extensions
- const extensions = JSON.parse(
- PageConfig.getOption('federated_extensions')
- );
- const queuedFederated = [];
- extensions.forEach(data => {
- if (data.extension) {
- queuedFederated.push(data.name);
- federatedExtensionPromises.push(createModule(data.name, data.extension));
- }
- if (data.mimeExtension) {
- queuedFederated.push(data.name);
- federatedMimeExtensionPromises.push(createModule(data.name, data.mimeExtension));
- }
- if (data.style) {
- federatedStylePromises.push(createModule(data.name, data.style));
- }
- });
- /**
- * Iterate over active plugins in an extension.
- *
- * #### Notes
- * This also populates the disabled, deferred, and ignored arrays.
- */
- function* activePlugins(extension) {
- // Handle commonjs or es2015 modules
- let exports;
- if (extension.hasOwnProperty('__esModule')) {
- exports = extension.default;
- } else {
- // CommonJS exports.
- exports = extension;
- }
- let plugins = Array.isArray(exports) ? exports : [exports];
- for (let plugin of plugins) {
- if (PageConfig.Extension.isDisabled(plugin.id)) {
- disabled.push(plugin.id);
- continue;
- }
- if (PageConfig.Extension.isDeferred(plugin.id)) {
- deferred.push(plugin.id);
- ignorePlugins.push(plugin.id);
- }
- yield plugin;
- }
- }
- // Handle the registered mime extensions.
- const mimeExtensions = [];
- {{#each jupyterlab_mime_extensions}}
- if (!queuedFederated.includes('{{@key}}')) {
- try {
- let ext = require('{{@key}}{{#if this}}/{{this}}{{/if}}');
- for (let plugin of activePlugins(ext)) {
- mimeExtensions.push(plugin);
- }
- } catch (e) {
- console.error(e);
- }
- }
- {{/each}}
- // Add the federated mime extensions.
- const federatedMimeExtensions = await Promise.allSettled(federatedMimeExtensionPromises);
- federatedMimeExtensions.forEach(p => {
- if (p.status === "fulfilled") {
- for (let plugin of activePlugins(p.value)) {
- mimeExtensions.push(plugin);
- }
- } else {
- console.error(p.reason);
- }
- });
- // Handled the registered standard extensions.
- {{#each jupyterlab_extensions}}
- if (!queuedFederated.includes('{{@key}}')) {
- try {
- let ext = require('{{@key}}{{#if this}}/{{this}}{{/if}}');
- for (let plugin of activePlugins(ext)) {
- register.push(plugin);
- }
- } catch (e) {
- console.error(e);
- }
- }
- {{/each}}
- // Add the federated extensions.
- const federatedExtensions = await Promise.allSettled(federatedExtensionPromises);
- federatedExtensions.forEach(p => {
- if (p.status === "fulfilled") {
- for (let plugin of activePlugins(p.value)) {
- register.push(plugin);
- }
- } else {
- console.error(p.reason);
- }
- });
- // Load all federated component styles and log errors for any that do not
- (await Promise.allSettled(federatedStylePromises)).filter(({status}) => status === "rejected").forEach(({reason}) => {
- console.error(reason);
- });
- const lab = new JupyterLab({
- mimeExtensions,
- disabled: {
- matches: disabled,
- patterns: PageConfig.Extension.disabled
- .map(function (val) { return val.raw; })
- },
- deferred: {
- matches: deferred,
- patterns: PageConfig.Extension.deferred
- .map(function (val) { return val.raw; })
- },
- });
- register.forEach(function(item) { lab.registerPluginModule(item); });
- lab.start({ ignorePlugins });
- // Expose global app instance when in dev mode or when toggled explicitly.
- var exposeAppInBrowser = (PageConfig.getOption('exposeAppInBrowser') || '').toLowerCase() === 'true';
- var devMode = (PageConfig.getOption('devMode') || '').toLowerCase() === 'true';
- if (exposeAppInBrowser || devMode) {
- window.jupyterlab = lab;
- window.jupyterapp = lab;
- }
- // Handle a browser test.
- if (browserTest.toLowerCase() === 'true') {
- lab.restored
- .then(function() { report(errors); })
- .catch(function(reason) { report([`RestoreError: ${reason.message}`]); });
- // Handle failures to restore after the timeout has elapsed.
- window.setTimeout(function() { report(errors); }, timeout);
- }
- }
|