Bläddra i källkod

Merge pull request #1 from jupyterlab/master

Up to date my forge
KsavinN 5 år sedan
förälder
incheckning
af348065a9
8 ändrade filer med 459 tillägg och 274 borttagningar
  1. 4 2
      package.json
  2. 12 2
      schema/debugger.json
  3. 59 18
      src/debugger.ts
  4. 144 13
      src/index.ts
  5. 16 0
      src/sidebar.ts
  6. 18 13
      src/tokens.ts
  7. 1 1
      style/index.css
  8. 205 225
      yarn.lock

+ 4 - 2
package.json

@@ -41,7 +41,9 @@
     "@jupyterlab/application": "^1.0.0",
     "@jupyterlab/apputils": "^1.0.0",
     "@jupyterlab/codeeditor": "^1.0.0",
-    "@jupyterlab/console": "^1.0.0",
+    "@jupyterlab/console": "^1.0.2",
+    "@jupyterlab/coreutils": "^3.0.0",
+    "@jupyterlab/fileeditor": "^1.0.2",
     "@jupyterlab/launcher": "^1.0.0",
     "@jupyterlab/notebook": "^1.0.0",
     "@phosphor/coreutils": "^1.3.1",
@@ -53,7 +55,7 @@
     "rimraf": "~2.6.2",
     "tslint": "^5.18.0",
     "tslint-plugin-prettier": "^2.0.1",
-    "typedoc": "^0.14.2",
+    "typedoc": "^0.15.0",
     "typescript": "~3.5.1"
   },
   "publishConfig": {

+ 12 - 2
schema/debugger.json

@@ -3,9 +3,19 @@
   "description": "Debugger settings.",
   "jupyter.lab.shortcuts": [
     {
-      "command": "debugger:open",
+      "command": "debugger:debug-console",
       "keys": ["Accel Shift I"],
-      "selector": "body"
+      "selector": ".jp-CodeConsole"
+    },
+    {
+      "command": "debugger:debug-file",
+      "keys": ["Accel Shift I"],
+      "selector": ".jp-FileEditor"
+    },
+    {
+      "command": "debugger:debug-notebook",
+      "keys": ["Accel Shift I"],
+      "selector": ".jp-Notebook"
     }
   ],
   "properties": {},

+ 59 - 18
src/debugger.ts

@@ -1,25 +1,41 @@
 // Copyright (c) Jupyter Development Team.
 // Distributed under the terms of the Modified BSD License.
 
+import { IDataConnector } from '@jupyterlab/coreutils';
+
+import { BoxPanel, TabPanel } from '@phosphor/widgets';
+
+import { ReadonlyJSONValue, UUID } from '@phosphor/coreutils';
+
 import { IDisposable } from '@phosphor/disposable';
 
-import { Widget } from '@phosphor/widgets';
+import { DebuggerSidebar } from './sidebar';
 
-import { IDebugger } from './tokens';
+export class Debugger extends BoxPanel {
+  constructor(options: Debugger.IOptions) {
+    super({ direction: 'left-to-right' });
+
+    this.model = new Debugger.Model(options);
+    this.sidebar = new DebuggerSidebar(this.model);
+    this.title.label = 'Debugger';
 
-export class Debugger extends Widget implements IDebugger {
-  constructor(options: Widget.IOptions = {}) {
-    super(options);
     this.addClass('jp-Debugger');
+    this.addWidget(this.tabs);
+    this.addWidget(this.sidebar);
   }
 
-  readonly model = new Debugger.Model();
+  readonly model: Debugger.Model;
 
-  get session(): IDebugger.ISession | null {
-    return this.model.session;
-  }
-  set session(session: IDebugger.ISession | null) {
-    this.model.session = session;
+  readonly tabs = new TabPanel();
+
+  readonly sidebar: DebuggerSidebar;
+
+  dispose(): void {
+    if (this.isDisposed) {
+      return;
+    }
+    this.model.dispose();
+    super.dispose();
   }
 }
 
@@ -27,18 +43,43 @@ export class Debugger extends Widget implements IDebugger {
  * A namespace for `Debugger` statics.
  */
 export namespace Debugger {
+  export interface IOptions {
+    connector?: IDataConnector<ReadonlyJSONValue>;
+
+    id?: string;
+  }
+
   export class Model implements IDisposable {
-    isDisposed = false;
+    constructor(options: Debugger.Model.IOptions) {
+      this.connector = options.connector || null;
+      this.id = options.id || UUID.uuid4();
+      void this._populate();
+    }
+
+    readonly connector: IDataConnector<ReadonlyJSONValue> | null;
 
-    get session(): IDebugger.ISession | null {
-      return this._session;
+    readonly id: string;
+
+    get isDisposed(): boolean {
+      return this._isDisposed;
     }
-    set session(session: IDebugger.ISession | null) {
-      this._session = session;
+
+    dispose(): void {
+      this._isDisposed = true;
     }
 
-    dispose = (): void => undefined;
+    private async _populate(): Promise<void> {
+      const { connector } = this;
+
+      if (!connector) {
+        return;
+      }
+    }
+
+    private _isDisposed = false;
+  }
 
-    private _session: IDebugger.ISession | null = null;
+  export namespace Model {
+    export interface IOptions extends Debugger.IOptions {}
   }
 }

+ 144 - 13
src/index.ts

@@ -7,41 +7,172 @@ import {
   JupyterFrontEndPlugin
 } from '@jupyterlab/application';
 
+import { WidgetTracker, MainAreaWidget } from '@jupyterlab/apputils';
+
+import { IConsoleTracker } from '@jupyterlab/console';
+
+import { IStateDB } from '@jupyterlab/coreutils';
+
+import { IEditorTracker } from '@jupyterlab/fileeditor';
+
+import { INotebookTracker } from '@jupyterlab/notebook';
+
 import { Debugger } from './debugger';
 
+import { DebuggerSidebar } from './sidebar';
+
 import { IDebugger } from './tokens';
 
 /**
- * A plugin providing a UI for code debugging and environment inspection.
+ * The command IDs used by the debugger plugin.
+ */
+export namespace CommandIDs {
+  export const create = 'debugger:create';
+
+  export const debugConsole = 'debugger:debug-console';
+
+  export const debugFile = 'debugger:debug-file';
+
+  export const debugNotebook = 'debugger:debug-notebook';
+}
+
+/**
+ * A plugin that provides visual debugging support for consoles.
+ */
+const consoles: JupyterFrontEndPlugin<void> = {
+  id: '@jupyterlab/debugger:consoles',
+  autoStart: true,
+  requires: [IDebugger],
+  optional: [IConsoleTracker],
+  activate: (_, debug, tracker: IConsoleTracker | null) => {
+    if (!tracker) {
+      console.log(`${consoles.id} load failed. There is no console tracker.`);
+      return;
+    }
+    console.log(`${consoles.id} has not been implemented.`, debug);
+  }
+};
+
+/**
+ * A plugin that provides visual debugging support for file editors.
  */
-const plugin: JupyterFrontEndPlugin<IDebugger> = {
-  id: '@jupyterlab/debugger:plugin',
+const files: JupyterFrontEndPlugin<void> = {
+  id: '@jupyterlab/debugger:files',
+  autoStart: true,
+  optional: [IEditorTracker],
+  activate: (app: JupyterFrontEnd, tracker: IEditorTracker | null) => {
+    app.commands.addCommand(CommandIDs.debugFile, {
+      execute: async _ => {
+        if (!tracker || !tracker.currentWidget) {
+          return;
+        }
+        if (tracker.currentWidget) {
+          // TODO: Find if the file is backed by a kernel or attach it to one.
+          const widget = await app.commands.execute(CommandIDs.create);
+          app.shell.add(widget, 'main');
+        }
+      }
+    });
+  }
+};
+
+/**
+ * A plugin that provides visual debugging support for notebooks.
+ */
+const notebooks: JupyterFrontEndPlugin<void> = {
+  id: '@jupyterlab/debugger:notebooks',
+  autoStart: true,
+  requires: [IDebugger],
+  optional: [INotebookTracker],
+  activate: (_, debug, tracker: INotebookTracker | null) => {
+    if (!tracker) {
+      console.log(`${notebooks.id} load failed. There is no notebook tracker.`);
+      return;
+    }
+    console.log(`${notebooks.id} has not been implemented.`, debug);
+  }
+};
+
+/**
+ * A plugin providing a condensed sidebar UI for debugging.
+ */
+const sidebar: JupyterFrontEndPlugin<void> = {
+  id: '@jupyterlab/debugger:sidebar',
   optional: [ILayoutRestorer],
+  autoStart: true,
+  activate: (app: JupyterFrontEnd, restorer: ILayoutRestorer | null) => {
+    const { shell } = app;
+    const label = 'Environment';
+    const namespace = 'jp-debugger-sidebar';
+    const sidebar = new DebuggerSidebar(null);
+
+    sidebar.id = namespace;
+    sidebar.title.label = label;
+    shell.add(sidebar, 'right', { activate: false });
+
+    if (restorer) {
+      restorer.add(sidebar, sidebar.id);
+    }
+  }
+};
+
+/**
+ * A plugin providing a tracker code debuggers.
+ */
+const tracker: JupyterFrontEndPlugin<IDebugger> = {
+  id: '@jupyterlab/debugger:tracker',
+  optional: [ILayoutRestorer],
+  requires: [IStateDB],
   provides: IDebugger,
   autoStart: true,
   activate: (
     app: JupyterFrontEnd,
+    state: IStateDB,
     restorer: ILayoutRestorer | null
   ): IDebugger => {
-    console.log(plugin.id, 'Hello, world.');
-    const { shell } = app;
-    const label = 'Environment';
-    const widget = new Debugger();
+    const tracker = new WidgetTracker<MainAreaWidget<Debugger>>({
+      namespace: 'debugger'
+    });
+
+    app.commands.addCommand(CommandIDs.create, {
+      execute: args => {
+        const id = (args.id as string) || '';
+
+        if (tracker.find(widget => id === widget.content.model.id)) {
+          return;
+        }
+
+        const widget = new MainAreaWidget({
+          content: new Debugger({ connector: state, id })
+        });
+
+        void tracker.add(widget);
 
-    widget.id = 'jp-debugger';
-    widget.title.label = label;
-    shell.add(widget, 'right', { activate: false });
+        return widget;
+      }
+    });
 
     if (restorer) {
-      restorer.add(widget, widget.id);
+      // Handle state restoration.
+      void restorer.restore(tracker, {
+        command: CommandIDs.create,
+        args: widget => ({ id: widget.content.model.id }),
+        name: widget => widget.content.model.id
+      });
     }
 
-    return widget;
+    return tracker;
   }
 };
 
 /**
  * Export the plugins as default.
  */
-const plugins: JupyterFrontEndPlugin<any>[] = [plugin];
+const plugins: JupyterFrontEndPlugin<any>[] = [
+  consoles,
+  files,
+  notebooks,
+  sidebar,
+  tracker
+];
 export default plugins;

+ 16 - 0
src/sidebar.ts

@@ -0,0 +1,16 @@
+// Copyright (c) Jupyter Development Team.
+// Distributed under the terms of the Modified BSD License.
+
+import { Widget } from '@phosphor/widgets';
+
+import { Debugger } from './debugger';
+
+export class DebuggerSidebar extends Widget {
+  constructor(model: Debugger.Model | null) {
+    super();
+    this.model = model;
+    this.addClass('jp-DebuggerSidebar');
+  }
+
+  public model: Debugger.Model | null = null;
+}

+ 18 - 13
src/tokens.ts

@@ -1,42 +1,47 @@
 // Copyright (c) Jupyter Development Team.
 // Distributed under the terms of the Modified BSD License.
 
-import { IClientSession } from '@jupyterlab/apputils';
+import {
+  IClientSession,
+  IWidgetTracker,
+  MainAreaWidget
+} from '@jupyterlab/apputils';
 
 import { CodeEditor } from '@jupyterlab/codeeditor';
 
 import { Token } from '@phosphor/coreutils';
 
-import { IDisposable } from '@phosphor/disposable';
+import { IObservableDisposable } from '@phosphor/disposable';
+
+import { Debugger } from './debugger';
 
 /**
- * A visual debugger.
+ * An interface describing an application's visual debugger.
  */
-export interface IDebugger {
-  /**
-   * The active debugger session.
-   */
-  session: IDebugger.ISession | null;
-}
+export interface IDebugger
+  extends IWidgetTracker<MainAreaWidget<Debugger>> {}
 
 /**
- * A visual debugger.
+ * A namespace for visual debugger types.
  */
 export namespace IDebugger {
   /**
    * A visual debugger session.
    */
-  export interface ISession extends IDisposable {
+  export interface ISession extends IObservableDisposable {
     /**
      * The API client session to connect to a debugger.
      */
     client: IClientSession;
 
     /**
-     * The code editor to connect to a debugger.
+     * The code editors in a debugger session.
      */
-    editor: CodeEditor.IEditor;
+    editors: CodeEditor.IEditor[];
   }
 }
 
+/**
+ * A token for a tracker for an application's visual debugger instances.
+ */
 export const IDebugger = new Token<IDebugger>('@jupyterlab/debugger');

+ 1 - 1
style/index.css

@@ -3,7 +3,7 @@
 | Distributed under the terms of the Modified BSD License.
 |----------------------------------------------------------------------------*/
 
-.jp-Debugger {
+.jp-DebuggerSidebar {
   background: var(--jp-layout-color1);
   top: 0;
   bottom: 0;

+ 205 - 225
yarn.lock

@@ -25,50 +25,50 @@
   dependencies:
     regenerator-runtime "^0.13.2"
 
-"@blueprintjs/core@^3.17.0", "@blueprintjs/core@^3.9.0":
-  version "3.17.1"
-  resolved "https://registry.npmjs.org/@blueprintjs/core/-/core-3.17.1.tgz#c6ea0df795e046848a16b3d9242225fef34091ee"
-  integrity sha512-VROTlhBaNaRN9kfscTQwZqRvGZmZYGfPkzcP8w50+wF/XMiK0xNEF4mRNQKXLNIduIZta5uPagZgIh68UG5dTg==
+"@blueprintjs/core@^3.18.0", "@blueprintjs/core@^3.9.0":
+  version "3.18.0"
+  resolved "https://registry.npmjs.org/@blueprintjs/core/-/core-3.18.0.tgz#8835ead10460e6535076465865d2ad7600ae1a07"
+  integrity sha512-dr3A6uhpAAWmf5muY6PFQp5EgEzinRLZa/TGQMA05q1P2xrOn/LYlsqJWJBUJ3j9tmh1RP8VPeu1HmosQb3J7w==
   dependencies:
-    "@blueprintjs/icons" "^3.8.0"
+    "@blueprintjs/icons" "^3.10.0"
     "@types/dom4" "^2.0.1"
     classnames "^2.2"
-    dom4 "^2.0.1"
-    normalize.css "^8.0.0"
-    popper.js "^1.14.1"
-    react-popper "^1.0.0"
-    react-transition-group "^2.2.1"
-    resize-observer-polyfill "^1.5.0"
-    tslib "^1.9.0"
-
-"@blueprintjs/icons@^3.3.0", "@blueprintjs/icons@^3.8.0":
-  version "3.9.1"
-  resolved "https://registry.npmjs.org/@blueprintjs/icons/-/icons-3.9.1.tgz#064d43314313f0feb4b1dd7e0904ddc17c8652d1"
-  integrity sha512-2EU9Xot0lkztDp8xVnBi5/71jgG1Rmsfz0LycBX/T16H0qGO7i+XEbZbpJjSvmr/UzhTpxQ/Yh5XGBc2U2zG4w==
+    dom4 "^2.1.5"
+    normalize.css "^8.0.1"
+    popper.js "^1.15.0"
+    react-popper "^1.3.3"
+    react-transition-group "^2.9.0"
+    resize-observer-polyfill "^1.5.1"
+    tslib "~1.9.0"
+
+"@blueprintjs/icons@^3.10.0", "@blueprintjs/icons@^3.3.0":
+  version "3.10.0"
+  resolved "https://registry.npmjs.org/@blueprintjs/icons/-/icons-3.10.0.tgz#45cdb3ca62110e74bcf9e741237a6b4e2cf2c3a4"
+  integrity sha512-lyAUpkr3qEStPcJpMnxRKuVAPvaRNSce1ySPbkE58zPmD4WBya2gNrWex41xoqRYM0GsiBSwH9CnpY8t6fZKUA==
   dependencies:
     classnames "^2.2"
-    tslib "^1.9.0"
+    tslib "~1.9.0"
 
 "@blueprintjs/select@^3.3.0":
-  version "3.9.0"
-  resolved "https://registry.npmjs.org/@blueprintjs/select/-/select-3.9.0.tgz#728fd9cea8ff1cb3226db99b3b3a1851da3e766a"
-  integrity sha512-TmInLtGFc3My78KTmf9JUw5gawxdO7oxn3bEQDQbWPuvb/1K0u0et+dTVlwGTk9GiNopQ2NtoCj+GQ75miF9QA==
+  version "3.10.0"
+  resolved "https://registry.npmjs.org/@blueprintjs/select/-/select-3.10.0.tgz#e5711a25416e62d236afb8a3062af45b3b4206ef"
+  integrity sha512-Akm/L5tndrOUuf05od9IJ0WSQgHdbJ4/i2RRoLLH5ZiI8s1OZiCbKJYDSCbCOTviCdZSuL0qkJsBcYhOI/Czeg==
   dependencies:
-    "@blueprintjs/core" "^3.17.0"
+    "@blueprintjs/core" "^3.18.0"
     classnames "^2.2"
-    tslib "^1.9.0"
+    tslib "~1.9.0"
 
 "@jupyterlab/application@^1.0.0":
-  version "1.0.1"
-  resolved "https://registry.npmjs.org/@jupyterlab/application/-/application-1.0.1.tgz#aac172235f30dec79c1047dda83b87718d3689ae"
-  integrity sha512-rcEIrcjWMukeM23GZ9WJYnS1+JPYCClyfM07qhyIbDIdm7afQs6oIFegeeuo/6Or/AJ+lYMpVAW9vTpLLQluKQ==
+  version "1.0.2"
+  resolved "https://registry.npmjs.org/@jupyterlab/application/-/application-1.0.2.tgz#bdda0d710baa3348c1fe28ce273b9afafb11b29e"
+  integrity sha512-B0cpY7eLN4e6t6n1ktejfUYb4c1wsizSEhORrLvQ/EiKBG5t++I87SKwxOFyZE2e6QVZoUDkGDM+n4xTX6tFRg==
   dependencies:
-    "@jupyterlab/apputils" "^1.0.1"
+    "@jupyterlab/apputils" "^1.0.2"
     "@jupyterlab/coreutils" "^3.0.0"
-    "@jupyterlab/docregistry" "^1.0.1"
-    "@jupyterlab/rendermime" "^1.0.1"
+    "@jupyterlab/docregistry" "^1.0.2"
+    "@jupyterlab/rendermime" "^1.0.2"
     "@jupyterlab/rendermime-interfaces" "^1.3.0"
-    "@jupyterlab/services" "^4.0.1"
+    "@jupyterlab/services" "^4.0.2"
     "@phosphor/algorithm" "^1.1.3"
     "@phosphor/application" "^1.6.3"
     "@phosphor/commands" "^1.6.3"
@@ -80,13 +80,13 @@
     "@phosphor/widgets" "^1.8.0"
     font-awesome "~4.7.0"
 
-"@jupyterlab/apputils@^1.0.0", "@jupyterlab/apputils@^1.0.1":
-  version "1.0.1"
-  resolved "https://registry.npmjs.org/@jupyterlab/apputils/-/apputils-1.0.1.tgz#66bf45b40953155869c24d849bda36098ab6b9c5"
-  integrity sha512-crY5PjndVrspFdo/k8JchaC+OU7aOYIXmYhcYGLD7uwt/G6CpZgHSEA/4YuoxulmL0mG9bu0GD19ARSROxISkQ==
+"@jupyterlab/apputils@^1.0.0", "@jupyterlab/apputils@^1.0.2":
+  version "1.0.2"
+  resolved "https://registry.npmjs.org/@jupyterlab/apputils/-/apputils-1.0.2.tgz#6c3483d0803ab780f924e70d98b7a8599c135fdb"
+  integrity sha512-3n/Dqau0s4v6+MjWLRuoZQrr/BdhEgmEj9Kfkw562b/KuXo+JtsLE3FVzvi7gMK2duPHqv4B56QP8sl1Z9Hyaw==
   dependencies:
     "@jupyterlab/coreutils" "^3.0.0"
-    "@jupyterlab/services" "^4.0.1"
+    "@jupyterlab/services" "^4.0.2"
     "@jupyterlab/ui-components" "^1.0.0"
     "@phosphor/algorithm" "^1.1.3"
     "@phosphor/commands" "^1.6.3"
@@ -103,32 +103,32 @@
     react-dom "~16.8.4"
     sanitize-html "~1.20.1"
 
-"@jupyterlab/attachments@^1.0.1":
-  version "1.0.1"
-  resolved "https://registry.npmjs.org/@jupyterlab/attachments/-/attachments-1.0.1.tgz#31551d8d05abae93831a665a551af558e6af8556"
-  integrity sha512-h4QKtw+1AwfGpxUdhQEpZ+8D1e+wI4mrjHeiAOVEdMm9tffuPIWaQDCD+e5YSZI0/Ip/tkbe9BpFpiAxIXPp2w==
+"@jupyterlab/attachments@^1.0.2":
+  version "1.0.2"
+  resolved "https://registry.npmjs.org/@jupyterlab/attachments/-/attachments-1.0.2.tgz#0c6d46043c861e76e9a94c1ecb9045eb452bf3f5"
+  integrity sha512-M3fDgoaKFUUSM7B3OFCq+iXes4lel4fQpaVxePsYxZbisr1ajMW7mwtM9V1fSY6pujiik6rmbFFJAyhEz/CBZg==
   dependencies:
     "@jupyterlab/coreutils" "^3.0.0"
     "@jupyterlab/observables" "^2.2.0"
-    "@jupyterlab/rendermime" "^1.0.1"
+    "@jupyterlab/rendermime" "^1.0.2"
     "@jupyterlab/rendermime-interfaces" "^1.3.0"
     "@phosphor/disposable" "^1.2.0"
     "@phosphor/signaling" "^1.2.3"
 
-"@jupyterlab/cells@^1.0.1":
-  version "1.0.1"
-  resolved "https://registry.npmjs.org/@jupyterlab/cells/-/cells-1.0.1.tgz#f149998d9dea4005cda695caf7380a3b8be9a258"
-  integrity sha512-oFBa02G2VbY584v/m8lCck8UTa+Wz/q3MuNQ18YSD+QJMdBmKHkeC/oEpmLJgXEq4Fdd7StRis5YKhN97ans0g==
+"@jupyterlab/cells@^1.0.2":
+  version "1.0.2"
+  resolved "https://registry.npmjs.org/@jupyterlab/cells/-/cells-1.0.2.tgz#188ec23c84e0ea799463e73ab7bea758bbd6cff2"
+  integrity sha512-KTdYSWnyoRIaTY9FUb2kmtO08kjqTzdUnq9eJMHlJlBMi5sClyZTNU10LpiQo0stEiLsIk1OGuXutNtykVwqoA==
   dependencies:
-    "@jupyterlab/apputils" "^1.0.1"
-    "@jupyterlab/attachments" "^1.0.1"
+    "@jupyterlab/apputils" "^1.0.2"
+    "@jupyterlab/attachments" "^1.0.2"
     "@jupyterlab/codeeditor" "^1.0.0"
-    "@jupyterlab/codemirror" "^1.0.1"
+    "@jupyterlab/codemirror" "^1.0.2"
     "@jupyterlab/coreutils" "^3.0.0"
     "@jupyterlab/observables" "^2.2.0"
-    "@jupyterlab/outputarea" "^1.0.1"
-    "@jupyterlab/rendermime" "^1.0.1"
-    "@jupyterlab/services" "^4.0.1"
+    "@jupyterlab/outputarea" "^1.0.2"
+    "@jupyterlab/rendermime" "^1.0.2"
+    "@jupyterlab/services" "^4.0.2"
     "@phosphor/algorithm" "^1.1.3"
     "@phosphor/coreutils" "^1.3.1"
     "@phosphor/messaging" "^1.2.3"
@@ -151,16 +151,16 @@
     "@phosphor/signaling" "^1.2.3"
     "@phosphor/widgets" "^1.8.0"
 
-"@jupyterlab/codemirror@^1.0.1":
-  version "1.0.1"
-  resolved "https://registry.npmjs.org/@jupyterlab/codemirror/-/codemirror-1.0.1.tgz#c3b38905428bc7a47198657daf63e0a507e73ba8"
-  integrity sha512-v/ncOhVA9EgDRCIT0Ry5Ze1l8VsEtC+5ewKY2Oz1cUkvfwoEFcppFPQuUxHR8K7Ib9IsbVtM6L21dG4O1XGZrg==
+"@jupyterlab/codemirror@^1.0.2":
+  version "1.0.2"
+  resolved "https://registry.npmjs.org/@jupyterlab/codemirror/-/codemirror-1.0.2.tgz#a72d23b881e9ee4a507ded17e23320d4fd05942b"
+  integrity sha512-Hkmu7GVb4ke+DRAJpKQac78JjoizoblLicYAr5j1wa5ASxP4EiR+FNdQV61heD2U7ES0rSA9HmlHVFMQgldzCA==
   dependencies:
-    "@jupyterlab/apputils" "^1.0.1"
+    "@jupyterlab/apputils" "^1.0.2"
     "@jupyterlab/codeeditor" "^1.0.0"
     "@jupyterlab/coreutils" "^3.0.0"
     "@jupyterlab/observables" "^2.2.0"
-    "@jupyterlab/statusbar" "^1.0.1"
+    "@jupyterlab/statusbar" "^1.0.2"
     "@phosphor/algorithm" "^1.1.3"
     "@phosphor/commands" "^1.6.3"
     "@phosphor/coreutils" "^1.3.1"
@@ -170,18 +170,18 @@
     codemirror "~5.47.0"
     react "~16.8.4"
 
-"@jupyterlab/console@^1.0.0":
-  version "1.0.1"
-  resolved "https://registry.npmjs.org/@jupyterlab/console/-/console-1.0.1.tgz#7856934fc8a2ca52ec58a95491fc7022029c81ba"
-  integrity sha512-mLvcWuiOIBS8wP6smUj4PTMpe5Q+vhGEEZJlvd5lqFL7uBoLPH7q0ks7YKcELrbrAxg5LKsvpDHRi20iJxAMlA==
+"@jupyterlab/console@^1.0.2":
+  version "1.0.2"
+  resolved "https://registry.npmjs.org/@jupyterlab/console/-/console-1.0.2.tgz#a8b6d09e85ddc84481c24ea80e5adcfd75d689ff"
+  integrity sha512-YcArxobyD6YBkI17GtvYFVb17gRxXRWTtL9Vqg5FOHIWZH+Cahb0VmWLA6iNE2t0ekiV/k1ubjNk8TYZ4pPOlA==
   dependencies:
-    "@jupyterlab/apputils" "^1.0.1"
-    "@jupyterlab/cells" "^1.0.1"
+    "@jupyterlab/apputils" "^1.0.2"
+    "@jupyterlab/cells" "^1.0.2"
     "@jupyterlab/codeeditor" "^1.0.0"
     "@jupyterlab/coreutils" "^3.0.0"
     "@jupyterlab/observables" "^2.2.0"
-    "@jupyterlab/rendermime" "^1.0.1"
-    "@jupyterlab/services" "^4.0.1"
+    "@jupyterlab/rendermime" "^1.0.2"
+    "@jupyterlab/services" "^4.0.2"
     "@phosphor/algorithm" "^1.1.3"
     "@phosphor/coreutils" "^1.3.1"
     "@phosphor/disposable" "^1.2.0"
@@ -207,19 +207,19 @@
     path-posix "~1.0.0"
     url-parse "~1.4.3"
 
-"@jupyterlab/docregistry@^1.0.1":
-  version "1.0.1"
-  resolved "https://registry.npmjs.org/@jupyterlab/docregistry/-/docregistry-1.0.1.tgz#28ca14e7c43c161384d5582e011b0a70522bb8eb"
-  integrity sha512-2BXJl2SBGSXcPN0uLEAZJs2ZdGzXTjB6/NFO2UUjRf4Ixcj6OqqX+S4ys37Yag3/5csUabcrM+/vazRFqza5xQ==
+"@jupyterlab/docregistry@^1.0.2":
+  version "1.0.2"
+  resolved "https://registry.npmjs.org/@jupyterlab/docregistry/-/docregistry-1.0.2.tgz#fbaeaf16dbae2740a7059a8adf056cbb362c8832"
+  integrity sha512-d6Z2IOe+48NheTpve2pAI6PfKN8VDx/NChhGE5V0YdQTHyNFea8GMRF9wHyP1o5NPuj3fx00gP73O6gfAwzqoA==
   dependencies:
-    "@jupyterlab/apputils" "^1.0.1"
+    "@jupyterlab/apputils" "^1.0.2"
     "@jupyterlab/codeeditor" "^1.0.0"
-    "@jupyterlab/codemirror" "^1.0.1"
+    "@jupyterlab/codemirror" "^1.0.2"
     "@jupyterlab/coreutils" "^3.0.0"
     "@jupyterlab/observables" "^2.2.0"
-    "@jupyterlab/rendermime" "^1.0.1"
+    "@jupyterlab/rendermime" "^1.0.2"
     "@jupyterlab/rendermime-interfaces" "^1.3.0"
-    "@jupyterlab/services" "^4.0.1"
+    "@jupyterlab/services" "^4.0.2"
     "@phosphor/algorithm" "^1.1.3"
     "@phosphor/coreutils" "^1.3.1"
     "@phosphor/disposable" "^1.2.0"
@@ -227,12 +227,26 @@
     "@phosphor/signaling" "^1.2.3"
     "@phosphor/widgets" "^1.8.0"
 
+"@jupyterlab/fileeditor@^1.0.2":
+  version "1.0.2"
+  resolved "https://registry.npmjs.org/@jupyterlab/fileeditor/-/fileeditor-1.0.2.tgz#e0c67241efa2e2dee4866a75fdaf4eb280eb8405"
+  integrity sha512-6E+hQtepS61ePH9kDZS8UvGSjcXcVCOdNVbcTMb0M0fAKqjaeIe84H27TkZ9WzIawO+G8FfuuD/DYHRUz5OEgQ==
+  dependencies:
+    "@jupyterlab/apputils" "^1.0.2"
+    "@jupyterlab/codeeditor" "^1.0.0"
+    "@jupyterlab/docregistry" "^1.0.2"
+    "@jupyterlab/statusbar" "^1.0.2"
+    "@phosphor/coreutils" "^1.3.1"
+    "@phosphor/messaging" "^1.2.3"
+    "@phosphor/widgets" "^1.8.0"
+    react "~16.8.4"
+
 "@jupyterlab/launcher@^1.0.0":
-  version "1.0.1"
-  resolved "https://registry.npmjs.org/@jupyterlab/launcher/-/launcher-1.0.1.tgz#d75e6457e1abd329d111437bde1cec56fcc9338f"
-  integrity sha512-GarY6YGFYY0oyeaJZv8KYM7SYrrd2BcqRmgm36+q3uXqu8qbGegSp4N/sNanWVjaCSnXUG3ab0Kb1gcDi5AAZQ==
+  version "1.0.2"
+  resolved "https://registry.npmjs.org/@jupyterlab/launcher/-/launcher-1.0.2.tgz#80ca71bac5edb322fadc2d9ac0f648fb92c62dbd"
+  integrity sha512-mQxCkNrPrdjX4/ySzhf0t7FZck3I7VC1Y9mIQyjNTq6COYZWxPxh4oPhedrQHvPf6rMYEEqxE3VqUnxsyOlZRQ==
   dependencies:
-    "@jupyterlab/apputils" "^1.0.1"
+    "@jupyterlab/apputils" "^1.0.2"
     "@phosphor/algorithm" "^1.1.3"
     "@phosphor/commands" "^1.6.3"
     "@phosphor/coreutils" "^1.3.1"
@@ -242,19 +256,19 @@
     react "~16.8.4"
 
 "@jupyterlab/notebook@^1.0.0":
-  version "1.0.1"
-  resolved "https://registry.npmjs.org/@jupyterlab/notebook/-/notebook-1.0.1.tgz#0b7d9b2c728bcc12897c30c4259d19121b84fa4b"
-  integrity sha512-36xsJjggzhL7BYQLFEwJJg9y3nj39K85Edj9GmzWquspfoI6RnjTrcvVZsvpKE8+0yFlzb27RdMCgCek4/o7Bg==
+  version "1.0.2"
+  resolved "https://registry.npmjs.org/@jupyterlab/notebook/-/notebook-1.0.2.tgz#5f48bbac20f1c4de4f23d0961e72bd5f0ea6ac6b"
+  integrity sha512-s5hfNRUEuLoPsI5//8DSjJ4/cKKStn0/2i2WegQsX6SSYdj4yqxjwMdveGxK0ROcteVcmok3ECEg6rNDxkFiVw==
   dependencies:
-    "@jupyterlab/apputils" "^1.0.1"
-    "@jupyterlab/cells" "^1.0.1"
+    "@jupyterlab/apputils" "^1.0.2"
+    "@jupyterlab/cells" "^1.0.2"
     "@jupyterlab/codeeditor" "^1.0.0"
     "@jupyterlab/coreutils" "^3.0.0"
-    "@jupyterlab/docregistry" "^1.0.1"
+    "@jupyterlab/docregistry" "^1.0.2"
     "@jupyterlab/observables" "^2.2.0"
-    "@jupyterlab/rendermime" "^1.0.1"
-    "@jupyterlab/services" "^4.0.1"
-    "@jupyterlab/statusbar" "^1.0.1"
+    "@jupyterlab/rendermime" "^1.0.2"
+    "@jupyterlab/services" "^4.0.2"
+    "@jupyterlab/statusbar" "^1.0.2"
     "@jupyterlab/ui-components" "^1.0.0"
     "@phosphor/algorithm" "^1.1.3"
     "@phosphor/coreutils" "^1.3.1"
@@ -278,21 +292,22 @@
     "@phosphor/messaging" "^1.2.3"
     "@phosphor/signaling" "^1.2.3"
 
-"@jupyterlab/outputarea@^1.0.1":
-  version "1.0.1"
-  resolved "https://registry.npmjs.org/@jupyterlab/outputarea/-/outputarea-1.0.1.tgz#1a9d5c53642d6bca1b224125b69b4e8cbcb2d788"
-  integrity sha512-6ZZXujp/E62DLfKhGj+gnN3k0OmaK4i+1SrY1sAUuevPRVgDflB37SE4slZiOXAT5wJE8WaedC+NhfJmZTbK8Q==
+"@jupyterlab/outputarea@^1.0.2":
+  version "1.0.2"
+  resolved "https://registry.npmjs.org/@jupyterlab/outputarea/-/outputarea-1.0.2.tgz#8489c88670e0bcbf3ac1680206407c4f005aedad"
+  integrity sha512-W2LD/emLByNIJ7P1s1u6Xd+Pbq8MviipXAaeZEPF3/diQaCcKjCPZdiY56kXNCFxYupAZahIOA0QzMTLs23Zqg==
   dependencies:
-    "@jupyterlab/apputils" "^1.0.1"
+    "@jupyterlab/apputils" "^1.0.2"
     "@jupyterlab/coreutils" "^3.0.0"
     "@jupyterlab/observables" "^2.2.0"
-    "@jupyterlab/rendermime" "^1.0.1"
+    "@jupyterlab/rendermime" "^1.0.2"
     "@jupyterlab/rendermime-interfaces" "^1.3.0"
-    "@jupyterlab/services" "^4.0.1"
+    "@jupyterlab/services" "^4.0.2"
     "@phosphor/algorithm" "^1.1.3"
     "@phosphor/coreutils" "^1.3.1"
     "@phosphor/disposable" "^1.2.0"
     "@phosphor/messaging" "^1.2.3"
+    "@phosphor/properties" "^1.1.3"
     "@phosphor/signaling" "^1.2.3"
     "@phosphor/widgets" "^1.8.0"
 
@@ -304,17 +319,17 @@
     "@phosphor/coreutils" "^1.3.1"
     "@phosphor/widgets" "^1.8.0"
 
-"@jupyterlab/rendermime@^1.0.1":
-  version "1.0.1"
-  resolved "https://registry.npmjs.org/@jupyterlab/rendermime/-/rendermime-1.0.1.tgz#f5126b1a59c7daefb0b689ba7cd2f1192f7b7e8d"
-  integrity sha512-/ZwhIZ5nbv5AqMxZj6wTpZGfdqcBkVeHcQGAKvqD9MjICw+tlziE9M6kvzlkWZ3B8aW1kLas1fXDJTtQ0HCgbQ==
+"@jupyterlab/rendermime@^1.0.2":
+  version "1.0.2"
+  resolved "https://registry.npmjs.org/@jupyterlab/rendermime/-/rendermime-1.0.2.tgz#3290ac71c716beb1a6de346a7f25d5712870a58f"
+  integrity sha512-J2AyV15j0YL+5NYzRF/I9kencD6FnK1weX25nTIYYEd7XTac3FUAHRAzCDJC0/SFRwdNjNAywoAeswrN4si9LA==
   dependencies:
-    "@jupyterlab/apputils" "^1.0.1"
-    "@jupyterlab/codemirror" "^1.0.1"
+    "@jupyterlab/apputils" "^1.0.2"
+    "@jupyterlab/codemirror" "^1.0.2"
     "@jupyterlab/coreutils" "^3.0.0"
     "@jupyterlab/observables" "^2.2.0"
     "@jupyterlab/rendermime-interfaces" "^1.3.0"
-    "@jupyterlab/services" "^4.0.1"
+    "@jupyterlab/services" "^4.0.2"
     "@phosphor/algorithm" "^1.1.3"
     "@phosphor/coreutils" "^1.3.1"
     "@phosphor/messaging" "^1.2.3"
@@ -323,10 +338,10 @@
     lodash.escape "^4.0.1"
     marked "0.6.2"
 
-"@jupyterlab/services@^4.0.1":
-  version "4.0.1"
-  resolved "https://registry.npmjs.org/@jupyterlab/services/-/services-4.0.1.tgz#08a8b5c92ae45c095f84975c4bf99ee2407c3d16"
-  integrity sha512-gsErfZra65U3xh2jQu652/8mAb/LwAAYHVVybthTgZfh+ffWES04P80RDfq3nYBGIp8swXo/LFMKJEUGjaczyg==
+"@jupyterlab/services@^4.0.2":
+  version "4.0.2"
+  resolved "https://registry.npmjs.org/@jupyterlab/services/-/services-4.0.2.tgz#88561f5ef6099bf8462efc1402541738a8b11f23"
+  integrity sha512-LnmOZuarzT6cN0jW4N1WZ91h9yE5+ArVtRtRZzZQ6pv4ydsuWGjcMVMMvmLLwC+FshKud6kTAB57f3JSkaoECA==
   dependencies:
     "@jupyterlab/coreutils" "^3.0.0"
     "@jupyterlab/observables" "^2.2.0"
@@ -337,15 +352,15 @@
     node-fetch "^2.6.0"
     ws "^7.0.0"
 
-"@jupyterlab/statusbar@^1.0.1":
-  version "1.0.1"
-  resolved "https://registry.npmjs.org/@jupyterlab/statusbar/-/statusbar-1.0.1.tgz#ac147e1e9cd6a16ee2d9e04aa5c43e2eb1b56872"
-  integrity sha512-cmE38ejzCaFDS5ikpHN8Ucu9YjYyXSX6omFlz9Xn3Z+ERTCBhhZ4cXYh+mKmyXPy6z5cJmHBGw9X5w7zxKEn0w==
+"@jupyterlab/statusbar@^1.0.2":
+  version "1.0.2"
+  resolved "https://registry.npmjs.org/@jupyterlab/statusbar/-/statusbar-1.0.2.tgz#3dd796afa62b6ea3ec0d053c6e7dd709d079bc3a"
+  integrity sha512-edbmu+EwiK7gL2RY7GTNiejOgLEHyBxbZSU841qbdjf6iVrtVGSvvurzHwh/+3AIhQrgbzhB7SkXiCbMFCZz6g==
   dependencies:
-    "@jupyterlab/apputils" "^1.0.1"
+    "@jupyterlab/apputils" "^1.0.2"
     "@jupyterlab/codeeditor" "^1.0.0"
     "@jupyterlab/coreutils" "^3.0.0"
-    "@jupyterlab/services" "^4.0.1"
+    "@jupyterlab/services" "^4.0.2"
     "@phosphor/algorithm" "^1.1.3"
     "@phosphor/coreutils" "^1.3.1"
     "@phosphor/disposable" "^1.2.0"
@@ -478,59 +493,11 @@
   resolved "https://registry.npmjs.org/@types/dom4/-/dom4-2.0.1.tgz#506d5781b9bcab81bd9a878b198aec7dee2a6033"
   integrity sha512-kSkVAvWmMZiCYtvqjqQEwOmvKwcH+V4uiv3qPQ8pAh1Xl39xggGEo8gHUqV4waYGHezdFw0rKBR8Jt0CrQSDZA==
 
-"@types/events@*":
-  version "3.0.0"
-  resolved "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7"
-  integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==
-
-"@types/fs-extra@^5.0.3":
-  version "5.1.0"
-  resolved "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.1.0.tgz#2a325ef97901504a3828718c390d34b8426a10a1"
-  integrity sha512-AInn5+UBFIK9FK5xc9yP5e3TQSPNNgjHByqYcj9g5elVBnDQcQL7PlO1CIRy2gWlbwK7UPYqi7vRvFA44dCmYQ==
-  dependencies:
-    "@types/node" "*"
-
-"@types/glob@*":
-  version "7.1.1"
-  resolved "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575"
-  integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==
-  dependencies:
-    "@types/events" "*"
-    "@types/minimatch" "*"
-    "@types/node" "*"
-
-"@types/handlebars@^4.0.38":
-  version "4.1.0"
-  resolved "https://registry.npmjs.org/@types/handlebars/-/handlebars-4.1.0.tgz#3fcce9bf88f85fe73dc932240ab3fb682c624850"
-  integrity sha512-gq9YweFKNNB1uFK71eRqsd4niVkXrxHugqWFQkeLRJvGjnxsLr16bYtcsG4tOFwmYi0Bax+wCkbf1reUfdl4kA==
-  dependencies:
-    handlebars "*"
-
-"@types/highlight.js@^9.12.3":
-  version "9.12.3"
-  resolved "https://registry.npmjs.org/@types/highlight.js/-/highlight.js-9.12.3.tgz#b672cfaac25cbbc634a0fd92c515f66faa18dbca"
-  integrity sha512-pGF/zvYOACZ/gLGWdQH8zSwteQS1epp68yRcVLJMgUck/MjEn/FBYmPub9pXT8C1e4a8YZfHo1CKyV8q1vKUnQ==
-
-"@types/lodash@^4.14.110":
-  version "4.14.136"
-  resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.136.tgz#413e85089046b865d960c9ff1d400e04c31ab60f"
-  integrity sha512-0GJhzBdvsW2RUccNHOBkabI8HZVdOXmXbXhuKlDEd5Vv12P7oAVGfomGp3Ne21o5D/qu1WmthlNKFaoZJJeErA==
-
-"@types/marked@^0.4.0":
-  version "0.4.2"
-  resolved "https://registry.npmjs.org/@types/marked/-/marked-0.4.2.tgz#64a89e53ea37f61cc0f3ee1732c555c2dbf6452f"
-  integrity sha512-cDB930/7MbzaGF6U3IwSQp6XBru8xWajF5PV2YZZeV8DyiliTuld11afVztGI9+yJZ29il5E+NpGA6ooV/Cjkg==
-
-"@types/minimatch@*", "@types/minimatch@3.0.3":
+"@types/minimatch@3.0.3":
   version "3.0.3"
   resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
   integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
 
-"@types/node@*":
-  version "12.6.8"
-  resolved "https://registry.npmjs.org/@types/node/-/node-12.6.8.tgz#e469b4bf9d1c9832aee4907ba8a051494357c12c"
-  integrity sha512-aX+gFgA5GHcDi89KG5keey2zf0WfZk/HAQotEamsK2kbey+8yGKcson0hbK8E+v0NArlCJQCqMP161YhV6ZXLg==
-
 "@types/prop-types@*":
   version "15.7.1"
   resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.1.tgz#f1a11e7babb0c3cad68100be381d1e064c68f1f6"
@@ -544,14 +511,6 @@
     "@types/prop-types" "*"
     csstype "^2.2.0"
 
-"@types/shelljs@^0.8.0":
-  version "0.8.5"
-  resolved "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.8.5.tgz#1e507b2f6d1f893269bd3e851ec24419ef9beeea"
-  integrity sha512-bZgjwIWu9gHCjirKJoOlLzGi5N0QgZ5t7EXEuoqyWCHTuSddURXo3FOBYDyRPNOWzZ6NbkLvZnVkn483Y/tvcQ==
-  dependencies:
-    "@types/glob" "*"
-    "@types/node" "*"
-
 ajv@^6.5.5:
   version "6.10.2"
   resolved "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52"
@@ -591,6 +550,13 @@ async-limiter@^1.0.0:
   resolved "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
   integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==
 
+backbone@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.npmjs.org/backbone/-/backbone-1.4.0.tgz#54db4de9df7c3811c3f032f34749a4cd27f3bd12"
+  integrity sha512-RLmDrRXkVdouTg38jcgHhyQ/2zjg7a8E6sz2zxfz21Hh17xDJYUHBZimVIt5fUyS8vbfpeSmTL3gUjTEvUV3qQ==
+  dependencies:
+    underscore ">=1.8.3"
+
 balanced-match@^1.0.0:
   version "1.0.0"
   resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
@@ -688,7 +654,7 @@ dom-serializer@0:
     domelementtype "^1.3.0"
     entities "^1.1.1"
 
-dom4@^2.0.1:
+dom4@^2.1.5:
   version "2.1.5"
   resolved "https://registry.npmjs.org/dom4/-/dom4-2.1.5.tgz#f98a94eb67b340f0fa5b42b0ee9c38cda035428e"
   integrity sha512-gJbnVGq5zaBUY0lUh0LUEVGYrtN75Ks8ZwpwOYvnVFrKy/qzXK4R/1WuLIFExWj/tBxbRAkTzZUGJHXmqsBNjQ==
@@ -744,9 +710,9 @@ esprima@^4.0.0:
   integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
 
 esutils@^2.0.2:
-  version "2.0.2"
-  resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
-  integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=
+  version "2.0.3"
+  resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+  integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
 
 fast-deep-equal@^2.0.1:
   version "2.0.1"
@@ -786,12 +752,12 @@ free-style@2.6.1:
   resolved "https://registry.npmjs.org/free-style/-/free-style-2.6.1.tgz#6af512568291195854842cbbaacd95578a6a9a8b"
   integrity sha512-uaVA8e57tvhrFKAl6x32SGIrGFBoeTAFtfHDzWxjPhiXQiUxOI6EEdEReRkjNO2H9XcdMJXXEnMHw8Q7iMYLbw==
 
-fs-extra@^7.0.0:
-  version "7.0.1"
-  resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
-  integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
+fs-extra@^8.1.0:
+  version "8.1.0"
+  resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
+  integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
   dependencies:
-    graceful-fs "^4.1.2"
+    graceful-fs "^4.2.0"
     jsonfile "^4.0.0"
     universalify "^0.1.0"
 
@@ -812,7 +778,7 @@ glob@^7.0.0, glob@^7.1.1, glob@^7.1.3:
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
-graceful-fs@^4.1.2, graceful-fs@^4.1.6:
+graceful-fs@^4.1.6, graceful-fs@^4.2.0:
   version "4.2.0"
   resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz#8d8fdc73977cb04104721cb53666c1ca64cd328b"
   integrity sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==
@@ -822,7 +788,7 @@ gud@^1.0.0:
   resolved "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0"
   integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==
 
-handlebars@*, handlebars@^4.0.6:
+handlebars@^4.1.2:
   version "4.1.2"
   resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67"
   integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==
@@ -838,10 +804,10 @@ has-flag@^3.0.0:
   resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
   integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
 
-highlight.js@^9.13.1:
-  version "9.15.8"
-  resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-9.15.8.tgz#f344fda123f36f1a65490e932cf90569e4999971"
-  integrity sha512-RrapkKQWwE+wKdF73VsOa2RQdIoO3mxwJ4P8mhbI6KYJUraUHRKM5w5zQQKXNk0xNL4UVRdulV9SBJcmzJNzVA==
+highlight.js@^9.15.8:
+  version "9.15.9"
+  resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-9.15.9.tgz#865257da1dbb4a58c4552d46c4b3854f77f0e6d5"
+  integrity sha512-M0zZvfLr5p0keDMCAhNBp03XJbKBxUx5AfyfufMdFMEP4N/Xj6dh0IqC75ys7BAzceR34NgcvXjupRVaHBPPVQ==
 
 htmlparser2@^3.10.0:
   version "3.10.1"
@@ -898,6 +864,11 @@ jest-docblock@^21.0.0:
   resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414"
   integrity sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw==
 
+jquery@^3.4.1:
+  version "3.4.1"
+  resolved "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2"
+  integrity sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==
+
 "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
   version "4.0.0"
   resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@@ -965,7 +936,7 @@ lodash.mergewith@^4.6.1:
   resolved "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55"
   integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==
 
-lodash@^4.17.10:
+lodash@^4.17.15:
   version "4.17.15"
   resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
   integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
@@ -977,15 +948,20 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0:
   dependencies:
     js-tokens "^3.0.0 || ^4.0.0"
 
+lunr@^2.3.6:
+  version "2.3.6"
+  resolved "https://registry.npmjs.org/lunr/-/lunr-2.3.6.tgz#f278beee7ffd56ad86e6e478ce02ab2b98c78dd5"
+  integrity sha512-swStvEyDqQ85MGpABCMBclZcLI/pBIlu8FFDtmX197+oEgKloJ67QnB+Tidh0340HmLMs39c4GrkPY3cmkXp6Q==
+
 marked@0.6.2:
   version "0.6.2"
   resolved "https://registry.npmjs.org/marked/-/marked-0.6.2.tgz#c574be8b545a8b48641456ca1dbe0e37b6dccc1a"
   integrity sha512-LqxwVH3P/rqKX4EKGz7+c2G9r98WeM/SW34ybhgNGhUQNKtf1GmmSkJ6cDGJ/t6tiyae49qRkpyTw2B9HOrgUA==
 
-marked@^0.4.0:
-  version "0.4.0"
-  resolved "https://registry.npmjs.org/marked/-/marked-0.4.0.tgz#9ad2c2a7a1791f10a852e0112f77b571dce10c66"
-  integrity sha512-tMsdNBgOsrUophCAFQl0XPe6Zqk/uy9gnue+jIIKhykO51hxyu6uNx7zBPy0+y/WKYVZZMspV9YeXLNdKk+iYw==
+marked@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e"
+  integrity sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==
 
 minimatch@^3.0.0, minimatch@^3.0.4:
   version "3.0.4"
@@ -1039,7 +1015,7 @@ node-fetch@^2.6.0:
   resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd"
   integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==
 
-normalize.css@^8.0.0:
+normalize.css@^8.0.1:
   version "8.0.1"
   resolved "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz#9b98a208738b9cc2634caacbc42d131c97487bf3"
   integrity sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==
@@ -1084,7 +1060,7 @@ path-posix@~1.0.0:
   resolved "https://registry.npmjs.org/path-posix/-/path-posix-1.0.0.tgz#06b26113f56beab042545a23bfa88003ccac260f"
   integrity sha1-BrJhE/Vr6rBCVFojv6iAA8ysJg8=
 
-popper.js@^1.14.1, popper.js@^1.14.4:
+popper.js@^1.14.4, popper.js@^1.15.0:
   version "1.15.0"
   resolved "https://registry.npmjs.org/popper.js/-/popper.js-1.15.0.tgz#5560b99bbad7647e9faa475c6b8056621f5a4ff2"
   integrity sha512-w010cY1oCUmI+9KwwlWki+r5jxKfTFDVoadl7MSrIujHU5MJ5OR6HTDj6Xo8aoR/QsA56x8jKjA59qGH4ELtrA==
@@ -1103,7 +1079,7 @@ prettier@^1.18.2:
   resolved "https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea"
   integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==
 
-progress@^2.0.0:
+progress@^2.0.3:
   version "2.0.3"
   resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
   integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
@@ -1154,7 +1130,7 @@ react-lifecycles-compat@^3.0.4:
   resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
   integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==
 
-react-popper@^1.0.0:
+react-popper@^1.3.3:
   version "1.3.3"
   resolved "https://registry.npmjs.org/react-popper/-/react-popper-1.3.3.tgz#2c6cef7515a991256b4f0536cd4bdcb58a7b6af6"
   integrity sha512-ynMZBPkXONPc5K4P5yFWgZx5JGAUIP3pGGLNs58cfAPgK67olx7fmLp+AdpZ0+GoQ+ieFDa/z4cdV6u7sioH6w==
@@ -1166,7 +1142,7 @@ react-popper@^1.0.0:
     typed-styles "^0.0.7"
     warning "^4.0.2"
 
-react-transition-group@^2.2.1:
+react-transition-group@^2.9.0:
   version "2.9.0"
   resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d"
   integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==
@@ -1212,7 +1188,7 @@ requires-port@^1.0.0:
   resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
   integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
 
-resize-observer-polyfill@^1.5.0:
+resize-observer-polyfill@^1.5.1:
   version "1.5.1"
   resolved "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
   integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==
@@ -1275,7 +1251,7 @@ setimmediate@^1.0.5:
   resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
   integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
 
-shelljs@^0.8.2:
+shelljs@^0.8.3:
   version "0.8.3"
   resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz#a7f3319520ebf09ee81275b2368adb286659b097"
   integrity sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==
@@ -1323,11 +1299,16 @@ supports-color@^6.1.0:
   dependencies:
     has-flag "^3.0.0"
 
-tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0:
+tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1:
   version "1.10.0"
   resolved "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
   integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
 
+tslib@~1.9.0:
+  version "1.9.3"
+  resolved "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
+  integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==
+
 tslint-plugin-prettier@^2.0.1:
   version "2.0.1"
   resolved "https://registry.npmjs.org/tslint-plugin-prettier/-/tslint-plugin-prettier-2.0.1.tgz#95b6a3b766622ffc44375825d7760225c50c3680"
@@ -1368,40 +1349,34 @@ typed-styles@^0.0.7:
   resolved "https://registry.npmjs.org/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9"
   integrity sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==
 
-typedoc-default-themes@^0.5.0:
-  version "0.5.0"
-  resolved "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.5.0.tgz#6dc2433e78ed8bea8e887a3acde2f31785bd6227"
-  integrity sha1-bcJDPnjti+qOiHo6zeLzF4W9Yic=
-
-typedoc@^0.14.2:
-  version "0.14.2"
-  resolved "https://registry.npmjs.org/typedoc/-/typedoc-0.14.2.tgz#769f457f4f9e4bdb8b5f3b177c86b6a31d8c3dc3"
-  integrity sha512-aEbgJXV8/KqaVhcedT7xG6d2r+mOvB5ep3eIz1KuB5sc4fDYXcepEEMdU7XSqLFO5hVPu0nllHi1QxX2h/QlpQ==
-  dependencies:
-    "@types/fs-extra" "^5.0.3"
-    "@types/handlebars" "^4.0.38"
-    "@types/highlight.js" "^9.12.3"
-    "@types/lodash" "^4.14.110"
-    "@types/marked" "^0.4.0"
+typedoc-default-themes@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.6.0.tgz#7e73bf54dd9e11550dd0fb576d5176b758f8f8b5"
+  integrity sha512-MdTROOojxod78CEv22rIA69o7crMPLnVZPefuDLt/WepXqJwgiSu8Xxq+H36x0Jj3YGc7lOglI2vPJ2GhoOybw==
+  dependencies:
+    backbone "^1.4.0"
+    jquery "^3.4.1"
+    lunr "^2.3.6"
+    underscore "^1.9.1"
+
+typedoc@^0.15.0:
+  version "0.15.0"
+  resolved "https://registry.npmjs.org/typedoc/-/typedoc-0.15.0.tgz#21eaf4db41cf2797bad027a74f2a75cd08ae0c2d"
+  integrity sha512-NOtfq5Tis4EFt+J2ozhVq9RCeUnfEYMFKoU6nCXCXUULJz1UQynOM+yH3TkfZCPLzigbqB0tQYGVlktUWweKlw==
+  dependencies:
     "@types/minimatch" "3.0.3"
-    "@types/shelljs" "^0.8.0"
-    fs-extra "^7.0.0"
-    handlebars "^4.0.6"
-    highlight.js "^9.13.1"
-    lodash "^4.17.10"
-    marked "^0.4.0"
+    fs-extra "^8.1.0"
+    handlebars "^4.1.2"
+    highlight.js "^9.15.8"
+    lodash "^4.17.15"
+    marked "^0.7.0"
     minimatch "^3.0.0"
-    progress "^2.0.0"
-    shelljs "^0.8.2"
-    typedoc-default-themes "^0.5.0"
-    typescript "3.2.x"
-
-typescript@3.2.x:
-  version "3.2.4"
-  resolved "https://registry.npmjs.org/typescript/-/typescript-3.2.4.tgz#c585cb952912263d915b462726ce244ba510ef3d"
-  integrity sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==
+    progress "^2.0.3"
+    shelljs "^0.8.3"
+    typedoc-default-themes "^0.6.0"
+    typescript "3.5.x"
 
-typescript@~3.5.1:
+typescript@3.5.x, typescript@~3.5.1:
   version "3.5.3"
   resolved "https://registry.npmjs.org/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977"
   integrity sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==
@@ -1427,6 +1402,11 @@ uglify-js@^3.1.4:
     commander "~2.20.0"
     source-map "~0.6.1"
 
+underscore@>=1.8.3, underscore@^1.9.1:
+  version "1.9.1"
+  resolved "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961"
+  integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==
+
 universalify@^0.1.0:
   version "0.1.2"
   resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"