From d5230143676a2feb1801985a986fb02ae1f3aa0d Mon Sep 17 00:00:00 2001 From: Sylvain Corlay Date: Wed, 3 Jul 2019 13:34:13 +0200 Subject: [PATCH] Drop HTML manager --- js/package-lock.json | 41 -------------------------- js/package.json | 3 +- js/src/loader.js | 68 ++++++++++++++++++++++++++++++++++++++++++++ js/src/manager.js | 3 +- 4 files changed, 71 insertions(+), 44 deletions(-) create mode 100644 js/src/loader.js diff --git a/js/package-lock.json b/js/package-lock.json index a1fc2e6be..9889b0128 100644 --- a/js/package-lock.json +++ b/js/package-lock.json @@ -908,42 +908,6 @@ "underscore": "^1.8.3" } }, - "@jupyter-widgets/html-manager": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/@jupyter-widgets/html-manager/-/html-manager-0.18.1.tgz", - "integrity": "sha512-p8rQUViy2P2HBUPwgcoCsut09MAzBQPnIMi5R78phz758HvswGz54OEaOStGoR0v1Y3xR0oI4yWAI/WBTU7lmg==", - "requires": { - "@jupyter-widgets/base": "^2.0.1", - "@jupyter-widgets/controls": "^1.5.0", - "@jupyter-widgets/output": "^2.0.0", - "@jupyter-widgets/schema": "^0.4.0", - "@jupyterlab/outputarea": "^1.0.0", - "@jupyterlab/rendermime": "^1.0.0", - "@jupyterlab/rendermime-interfaces": "^1.3.0", - "@phosphor/widgets": "^1.6.0", - "ajv": "^6.10.0", - "font-awesome": "^4.7.0", - "jquery": "^3.1.1" - }, - "dependencies": { - "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - } - } - }, "@jupyter-widgets/jupyterlab-manager": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@jupyter-widgets/jupyterlab-manager/-/jupyterlab-manager-1.0.0.tgz", @@ -988,11 +952,6 @@ "@jupyter-widgets/base": "^2.0.1" } }, - "@jupyter-widgets/schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@jupyter-widgets/schema/-/schema-0.4.0.tgz", - "integrity": "sha512-0MAZ6hLOCe2dYiUvEAfYvWKD7zV9AdkC4AoIEQiWqAai9Pq06oPNWMMg6x+J0ZaNnZWqR2c16f62ehd57Ql7Zw==" - }, "@jupyterlab/application": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@jupyterlab/application/-/application-1.0.0.tgz", diff --git a/js/package.json b/js/package.json index 4f88da973..b9147d42f 100644 --- a/js/package.json +++ b/js/package.json @@ -5,9 +5,8 @@ "main": "lib/index.js", "browserslist": ">0.8%, not ie 11, not op_mini all, not dead", "dependencies": { - "@jupyter-widgets/base": "^1.2.5 || ^2.0.1", + "@jupyter-widgets/base": "^2.0.1", "@jupyter-widgets/controls": "^1.5.0", - "@jupyter-widgets/html-manager": "^0.18.1", "@jupyter-widgets/jupyterlab-manager": "^1.0.0", "@jupyter-widgets/output": "^2.0.0", "@jupyterlab/coreutils": "^3.0.0", diff --git a/js/src/loader.js b/js/src/loader.js new file mode 100644 index 000000000..18695faac --- /dev/null +++ b/js/src/loader.js @@ -0,0 +1,68 @@ +let cdn = 'https://unpkg.com/'; + +/** + * Load a package using requirejs and return a promise + * + * @param pkg Package name or names to load + */ +let requirePromise = function(pkg) { + return new Promise((resolve, reject) => { + let require =window.requirejs; + if (require === undefined) { + reject("Requirejs is needed, please ensure it is loaded on the page."); + } else { + require(pkg, resolve, reject); + } + }); +} + +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}`; +} + +/** + * 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 unpkg.com. However, this default can be + * overriden 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. + */ +export +function requireLoader(moduleName, moduleVersion) { + return requirePromise([`${moduleName}`]).catch((err) => { + let failedId = err.requireModules && err.requireModules[0]; + if (failedId) { + console.log(`Falling back to ${cdn} for ${moduleName}@${moduleVersion}`); + let require = window.requirejs; + if (require === undefined) { + throw new Error("Requirejs is needed, please ensure it is loaded on the page."); + } + const conf = {paths: {}}; + conf.paths[moduleName] = moduleNameToCDNUrl(moduleName, moduleVersion); + require.undef(failedId); + require.config(conf); + + return requirePromise([`${moduleName}`]); + } + }); +} diff --git a/js/src/manager.js b/js/src/manager.js index ee241d04e..87ea9876c 100644 --- a/js/src/manager.js +++ b/js/src/manager.js @@ -7,7 +7,6 @@ ****************************************************************************/ import { RenderMimeRegistry, standardRendererFactories } from '@jupyterlab/rendermime'; -import { requireLoader } from '@jupyter-widgets/html-manager'; import { WidgetManager as JupyterLabManager } from '@jupyter-widgets/jupyterlab-manager'; import { WidgetRenderer } from '@jupyter-widgets/jupyterlab-manager'; import { output } from '@jupyter-widgets/jupyterlab-manager'; @@ -15,6 +14,8 @@ import * as base from '@jupyter-widgets/base'; import * as controls from '@jupyter-widgets/controls'; import * as PhosphorWidget from '@phosphor/widgets'; +import { requireLoader } from './loader'; + if (typeof window !== "undefined" && typeof window.define !== "undefined") { window.define("@jupyter-widgets/base", base); window.define("@jupyter-widgets/controls", controls);