diff --git a/.travis.yml b/.travis.yml index 18723eb929..a549577e89 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,12 +1,12 @@ dist: trusty language: node_js -node_js: "8" +node_js: "10" sudo: required matrix: fast_finish: true include: - - node_js: "8" + - node_js: "10" language: node_js env: TEST=WASM services: docker @@ -40,7 +40,8 @@ env: install: - if [ "$TEST" = "CPP_OSX" ]; then brew install yarn; fi - - if [ "$TEST" = "PYTHON"]; then curl -sL https://deb.nodesource.com/setup_8.x | bash - && apt-get install npm; fi + - if [ "$TEST" = "PYTHON" ]; then nvm install 10.13.0 && nvm use 10.13.0; fi + - node --version - yarn script: diff --git a/examples/phosphor/package.json b/examples/phosphor/package.json new file mode 100644 index 0000000000..2d8b013cf1 --- /dev/null +++ b/examples/phosphor/package.json @@ -0,0 +1,32 @@ +{ + "name": "phosphor", + "private": true, + "version": "0.3.9", + "description": "An example app built using `@finos/perspective-phosphor`.", + "scripts": { + "start": "webpack-dev-server --open", + "webpack": "webpack --colour" + }, + "keywords": [], + "license": "Apache-2.0", + "dependencies": { + "@finos/perspective": "^0.3.9", + "@finos/perspective-viewer": "^0.3.9", + "@finos/perspective-viewer-d3fc": "^0.3.9", + "@finos/perspective-viewer-hypergrid": "^0.3.9", + "@finos/perspective-phosphor": "^0.3.9" + }, + "devDependencies": { + "@finos/perspective-webpack-plugin": "^0.3.8", + "css-loader": "^0.28.7", + "file-loader": "^4.2.0", + "html-webpack-plugin": "^3.2.0", + "http-server": "^0.11.1", + "less-loader": "^4.0.5", + "npm-run-all": "^4.1.3", + "rimraf": "^2.5.2", + "style-loader": "^0.18.2", + "webpack-cli": "^3.3.7", + "webpack-dev-server": "^3.8.0" + } +} diff --git a/examples/phosphor/src/index.js b/examples/phosphor/src/index.js new file mode 100644 index 0000000000..e907f78242 --- /dev/null +++ b/examples/phosphor/src/index.js @@ -0,0 +1,62 @@ +/****************************************************************************** + * + * Copyright (c) 2018, the Perspective Authors. + * + * This file is part of the Perspective library, distributed under the terms of + * the Apache License 2.0. The full license can be found in the LICENSE file. + * + */ + +import perspective from "@finos/perspective"; +import {PerspectiveWorkspace, PerspectiveWidget} from "@finos/perspective-phosphor"; +import {Widget} from "@phosphor/widgets"; +import "@finos/perspective-phosphor/src/theme/vaporwave/index.less"; + +import "@finos/perspective-viewer-hypergrid"; +import "@finos/perspective-viewer-d3fc"; + +import "./style/index.less"; + +const worker = perspective.shared_worker(); +const req = fetch("./superstore.arrow"); + +window.addEventListener("load", async () => { + const resp = await req; + const buffer = await resp.arrayBuffer(); + const table = worker.table(buffer); + + const workspace = new PerspectiveWorkspace(); + + const widget1 = new PerspectiveWidget("One", { + "row-pivots": ["Sub-Category"], + columns: ["Profit", "Sales"] + }); + + const widget2 = new PerspectiveWidget("Two", { + plugin: "d3_x_bar", + "row-pivots": ["Region"], + columns: ["Region"] + }); + + const widget3 = new PerspectiveWidget("Three"); + const widget4 = new PerspectiveWidget("Four"); + + workspace.addViewer(widget1); + workspace.addViewer(widget2, {mode: "split-bottom", ref: widget1}); + workspace.addViewer(widget3, {mode: "split-right", ref: widget1}); + workspace.addViewer(widget4, {mode: "split-right", ref: widget2}); + + Widget.attach(workspace, document.body); + + widget1.load(table); + widget2.load(table); + widget3.load(table); + widget4.load(table); + + window.onresize = () => { + workspace.update(); + }; + + window.workspace = workspace; + +}); diff --git a/examples/phosphor/src/style/index.less b/examples/phosphor/src/style/index.less new file mode 100644 index 0000000000..43d5c4f39b --- /dev/null +++ b/examples/phosphor/src/style/index.less @@ -0,0 +1,41 @@ +/****************************************************************************** + * + * Copyright (c) 2018, the Perspective Authors. + * + * This file is part of the Perspective library, distributed under the terms of + * the Apache License 2.0. The full license can be found in the LICENSE file. + * + */ + +body { + display: flex; + flex-direction: column; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + margin: 0; + padding: 0; + overflow: hidden; +} + +#menuBar { + flex: 0 0 auto; +} + + +#main { + flex: 1 1 auto; +} + + +#palette { + min-width: 300px; + border-right: 1px solid #DDDDDD; +} + + +#dock { + padding: 4px; +} \ No newline at end of file diff --git a/examples/phosphor/webpack.config.js b/examples/phosphor/webpack.config.js new file mode 100644 index 0000000000..748e4c2e5f --- /dev/null +++ b/examples/phosphor/webpack.config.js @@ -0,0 +1,46 @@ +/****************************************************************************** + * + * Copyright (c) 2017, the Perspective Authors. + * + * This file is part of the Perspective library, distributed under the terms of + * the Apache License 2.0. The full license can be found in the LICENSE file. + * + */ + +const PerspectivePlugin = require("@finos/perspective-webpack-plugin"); +const HtmlWebPackPlugin = require("html-webpack-plugin"); +const path = require("path"); + +module.exports = { + mode: process.env.NODE_ENV || "development", + entry: "./src/index.js", + output: { + filename: "index.js" + }, + plugins: [ + new HtmlWebPackPlugin({ + title: "Phosphor Example" + }), + new PerspectivePlugin({}) + ], + module: { + rules: [ + { + test: /\.less$/, + use: [{loader: "style-loader"}, {loader: "css-loader"}, {loader: "less-loader"}] + }, + { + test: /\.(png|jpe?g|gif)$/i, + use: [ + { + loader: "file-loader" + } + ] + } + ] + }, + devServer: { + contentBase: [path.join(__dirname, "dist"), path.join(__dirname, "../simple")] + }, + devtool: "source-map" +}; diff --git a/package.json b/package.json index 83aaf55ed4..76a5e1d5e0 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,8 @@ "@babel/plugin-transform-runtime": "^7.1.0", "@babel/polyfill": "^7.0.0", "@babel/preset-env": "^7.1.5", + "@typescript-eslint/eslint-plugin": "^2.4.0", + "@typescript-eslint/parser": "^2.4.0", "arraybuffer-loader": "^1.0.2", "babel-eslint": "^8.2.3", "babel-jest": "^24.5.0", @@ -30,7 +32,7 @@ "cpx": "^1.5.0", "css-loader": "^0.28.7", "dotenv": "^8.1.0", - "eslint": "^4.19.1", + "eslint": "^5.16.0", "eslint-config-prettier": "^3.0.1", "eslint-plugin-prettier": "^2.6.2", "file-loader": "^2.0.0", @@ -58,8 +60,9 @@ "source-map-explorer": "^2.0.1", "style-loader": "^0.18.2", "term-img": "^4.1.0", - "ts-loader": "^6.0.4", - "typescript": "~2.9.2", + "ts-loader": "^6.2.0", + "ts-jest": "^24.1.0", + "typescript": "^3.6.0", "webpack": "^4.31.0", "webpack-cli": "^3.3.2" }, diff --git a/packages/perspective-jupyterlab/package.json b/packages/perspective-jupyterlab/package.json index badfbdfb0a..662faa8d62 100644 --- a/packages/perspective-jupyterlab/package.json +++ b/packages/perspective-jupyterlab/package.json @@ -44,8 +44,8 @@ "isomorphic-fetch": "^2.2.1", "jest-transform-css": "^2.0.0", "source-map-support": "^0.5.9", - "ts-jest": "^23.10.4", - "typescript": "^3.2.4" + "ts-jest": "^24.1.0", + "typescript": "^3.6.0" }, "jupyterlab": { "extension": "dist/index.js" diff --git a/packages/perspective-jupyterlab/src/ts/.eslintrc.json b/packages/perspective-jupyterlab/src/ts/.eslintrc.json new file mode 100644 index 0000000000..f7c8ddd618 --- /dev/null +++ b/packages/perspective-jupyterlab/src/ts/.eslintrc.json @@ -0,0 +1,38 @@ +{ + "parser": "@typescript-eslint/parser", + "extends": [ + "plugin:@typescript-eslint/recommended" + ], + "plugins": [ + "prettier", + "@typescript-eslint/eslint-plugin" + ], + "env": { + "browser": true, + "commonjs": true, + "es6": true, + "node": true, + "jasmine": true, + "jest": true + }, + "parserOptions": { + "ecmaVersion": 2017, + "ecmaFeatures": {}, + "sourceType": "module", + "experimentalObjectRestSpread": true + }, + "rules": { + "prettier/prettier": ["error", { + "printWidth": 200, + "tabWidth": 4, + "bracketSpacing": false + }], + "no-const-assign": "error", + "no-this-before-super": "error", + "no-undef": "error", + "no-unreachable": "error", + "no-unused-vars": "error", + "constructor-super": "error", + "valid-typeof": "error" + } +} \ No newline at end of file diff --git a/packages/perspective-jupyterlab/src/ts/arraybuffer.d.ts b/packages/perspective-jupyterlab/src/ts/arraybuffer.d.ts index 362fe3c328..4db3994ade 100644 --- a/packages/perspective-jupyterlab/src/ts/arraybuffer.d.ts +++ b/packages/perspective-jupyterlab/src/ts/arraybuffer.d.ts @@ -8,5 +8,5 @@ */ declare module "@finos/perspective/dist/esm/api/client"; -declare module '@finos/perspective/dist/umd/psp.async.wasm'; -declare module '!!file-worker-loader?inline=true!*'; \ No newline at end of file +declare module "@finos/perspective/dist/umd/psp.async.wasm"; +declare module "!!file-worker-loader?inline=true!*"; diff --git a/packages/perspective-jupyterlab/src/ts/client.ts b/packages/perspective-jupyterlab/src/ts/client.ts index b2b4202407..0ca50b902d 100644 --- a/packages/perspective-jupyterlab/src/ts/client.ts +++ b/packages/perspective-jupyterlab/src/ts/client.ts @@ -7,32 +7,32 @@ * */ -import { DOMWidgetView } from "@jupyter-widgets/base"; -import { Client } from "@finos/perspective/dist/esm/api/client"; +import {DOMWidgetView} from "@jupyter-widgets/base"; +import {Client} from "@finos/perspective/dist/esm/api/client"; /** * The schema for a message passed to and from `PerspectiveJupyterClient`. */ export interface PerspectiveJupyterMessage { - id : number; - type : string; - data : string; + id: number; + type: string; + data: string; } /** * `PerspectiveJupyterClient` acts as a message bus between the frontend and backend, * passing messages from `perspective-viewer` (method calls, `to_format()` calls, etc.) to * the `PerspectiveManager` on the python side of the plugin. - * + * * This client implements the `Client` class as defined in `@finos/perspective/api`. */ export class PerspectiveJupyterClient extends Client { - view : DOMWidgetView; + view: DOMWidgetView; /** * Create a new instance of the client. - * - * @param view {DOMWidgetView} the plugin view that can send messages to the Python backend. + * + * @param view {DOMWidgetView} the plugin view that can send messages to the Python backend. */ constructor(view: DOMWidgetView) { super(); @@ -41,12 +41,12 @@ export class PerspectiveJupyterClient extends Client { /** * Given a message, pass it to the `PerspectiveManager` instance on the ipywidget. - * + * * The sent message conforms to the `PerspectiveJupyterMessage` interface. * * @param msg {any} the message to pass to the `PerspectiveManager`. */ - send(msg: any) : void { + send(msg: any): void { const serialized = JSON.stringify(msg); this.view.send({ id: msg.id, @@ -54,5 +54,4 @@ export class PerspectiveJupyterClient extends Client { data: serialized }); } - -} \ No newline at end of file +} diff --git a/packages/perspective-jupyterlab/src/ts/index.ts b/packages/perspective-jupyterlab/src/ts/index.ts index cdaf5a781c..be4b9e935d 100644 --- a/packages/perspective-jupyterlab/src/ts/index.ts +++ b/packages/perspective-jupyterlab/src/ts/index.ts @@ -19,3 +19,4 @@ import "!!style-loader!css-loader!less-loader!../less/index.less"; import "@finos/perspective-viewer-hypergrid"; import "@finos/perspective-viewer-highcharts"; + diff --git a/packages/perspective-jupyterlab/src/ts/model.ts b/packages/perspective-jupyterlab/src/ts/model.ts index 8b2180ae90..60ddfea869 100644 --- a/packages/perspective-jupyterlab/src/ts/model.ts +++ b/packages/perspective-jupyterlab/src/ts/model.ts @@ -7,14 +7,13 @@ * */ -import {DOMWidgetModel, ISerializers} from '@jupyter-widgets/base'; -import {PERSPECTIVE_VERSION} from './version'; +import {DOMWidgetModel, ISerializers} from "@jupyter-widgets/base"; +import {PERSPECTIVE_VERSION} from "./version"; /** * TODO: document */ -export -class PerspectiveModel extends DOMWidgetModel { +export class PerspectiveModel extends DOMWidgetModel { defaults() { return { ...super.defaults(), @@ -24,8 +23,8 @@ class PerspectiveModel extends DOMWidgetModel { _view_name: PerspectiveModel.view_name, _view_module: PerspectiveModel.view_module, _view_module_version: PerspectiveModel.view_module_version, - - plugin: 'hypergrid', + + plugin: "hypergrid", columns: [], row_pivots: [], column_pivots: [], @@ -33,19 +32,19 @@ class PerspectiveModel extends DOMWidgetModel { sort: [], filters: [], plugin_config: {}, - dark: false, + dark: false }; } static serializers: ISerializers = { - ...DOMWidgetModel.serializers, + ...DOMWidgetModel.serializers // Add any extra serializers here - } + }; - static model_name = 'PerspectiveModel'; - static model_module = '@finos/perspective-jupyterlab'; + static model_name = "PerspectiveModel"; + static model_module = "@finos/perspective-jupyterlab"; static model_module_version = PERSPECTIVE_VERSION; - static view_name = 'PerspectiveView'; - static view_module = '@finos/perspective-jupyterlab'; + static view_name = "PerspectiveView"; + static view_module = "@finos/perspective-jupyterlab"; static view_module_version = PERSPECTIVE_VERSION; -} \ No newline at end of file +} diff --git a/packages/perspective-jupyterlab/src/ts/plugin.ts b/packages/perspective-jupyterlab/src/ts/plugin.ts index 8fa9b69e0e..c74773f238 100644 --- a/packages/perspective-jupyterlab/src/ts/plugin.ts +++ b/packages/perspective-jupyterlab/src/ts/plugin.ts @@ -7,40 +7,36 @@ * */ -import { Application, IPlugin } from '@phosphor/application'; +import {Application, IPlugin} from "@phosphor/application"; -import { Widget } from '@phosphor/widgets'; +import {Widget} from "@phosphor/widgets"; -import { IJupyterWidgetRegistry } from '@jupyter-widgets/base'; +import {IJupyterWidgetRegistry} from "@jupyter-widgets/base"; -import { PerspectiveModel } from "./model"; +import {PerspectiveModel} from "./model"; -import { PerspectiveView } from './view'; - -import { - PERSPECTIVE_VERSION -} from './version'; +import {PerspectiveView} from "./view"; +import {PERSPECTIVE_VERSION} from "./version"; /** * PerspectiveJupyterPlugin Defines the Jupyterlab plugin, and registers `PerspectiveModel` and `PerspectiveView` * to be called on initialization. */ -export - const PerspectiveJupyterPlugin: IPlugin, void> = { - id: '@finos/perspective-jupyterlab', - requires: [IJupyterWidgetRegistry], - activate: (app: Application, registry: IJupyterWidgetRegistry): void => { - registry.registerWidget({ - name: '@finos/perspective-jupyterlab', - version: PERSPECTIVE_VERSION, - exports: { - PerspectiveModel: PerspectiveModel, - PerspectiveView: PerspectiveView - } - }); - }, - autoStart: true - }; +export const PerspectiveJupyterPlugin: IPlugin, void> = { + id: "@finos/perspective-jupyterlab", + requires: [IJupyterWidgetRegistry], + activate: (app: Application, registry: IJupyterWidgetRegistry): void => { + registry.registerWidget({ + name: "@finos/perspective-jupyterlab", + version: PERSPECTIVE_VERSION, + exports: { + PerspectiveModel: PerspectiveModel, + PerspectiveView: PerspectiveView + } + }); + }, + autoStart: true +}; export default PerspectiveJupyterPlugin; diff --git a/packages/perspective-jupyterlab/src/ts/version.ts b/packages/perspective-jupyterlab/src/ts/version.ts index 59918a0d78..8724a9955e 100644 --- a/packages/perspective-jupyterlab/src/ts/version.ts +++ b/packages/perspective-jupyterlab/src/ts/version.ts @@ -6,7 +6,6 @@ * the Apache License 2.0. The full license can be found in the LICENSE file. * */ -var pkg_json = require("../../package.json"); +let pkg_json = require("../../package.json"); -export -const PERSPECTIVE_VERSION = pkg_json.version; +export const PERSPECTIVE_VERSION = pkg_json.version; diff --git a/packages/perspective-jupyterlab/src/ts/view.ts b/packages/perspective-jupyterlab/src/ts/view.ts index 23276cf17b..1e517eb4a8 100644 --- a/packages/perspective-jupyterlab/src/ts/view.ts +++ b/packages/perspective-jupyterlab/src/ts/view.ts @@ -6,36 +6,34 @@ * the Apache License 2.0. The full license can be found in the LICENSE file. * */ -import { isEqual } from "underscore"; -import { DOMWidgetView } from "@jupyter-widgets/base"; -import { PerspectiveWidget } from '@finos/perspective-phosphor'; -import { PerspectiveJupyterWidget } from "./widget"; -import { PerspectiveJupyterClient, PerspectiveJupyterMessage } from "./client"; +import {isEqual} from "underscore"; +import {DOMWidgetView} from "@jupyter-widgets/base"; +import {PerspectiveWidget} from "@finos/perspective-phosphor"; +import {PerspectiveJupyterWidget} from "./widget"; +import {PerspectiveJupyterClient, PerspectiveJupyterMessage} from "./client"; /** * `PerspectiveView` defines the plugin's DOM and how the plugin interacts with the DOM. */ -export -class PerspectiveView extends DOMWidgetView { +export class PerspectiveView extends DOMWidgetView { pWidget: PerspectiveWidget; client: PerspectiveJupyterClient; _createElement(tagName: string) { - this.pWidget = new PerspectiveJupyterWidget(undefined, - { - plugin: this.model.get('plugin'), - columns: this.model.get('columns'), - row_pivots: this.model.get('row_pivots'), - column_pivots: this.model.get('column_pivots'), - aggregates: this.model.get('aggregates'), - sort: this.model.get('sort'), - filters: this.model.get('filters'), - plugin_config: this.model.get('plugin_config'), - computed_columns: [], - dark: this.model.get('dark'), - editable: this.model.get("editable"), - bindto: this.el, - view: this, + this.pWidget = new PerspectiveJupyterWidget(undefined, { + plugin: this.model.get("plugin"), + columns: this.model.get("columns"), + row_pivots: this.model.get("row_pivots"), + column_pivots: this.model.get("column_pivots"), + aggregates: this.model.get("aggregates"), + sort: this.model.get("sort"), + filters: this.model.get("filters"), + plugin_config: this.model.get("plugin_config"), + computed_columns: [], + dark: this.model.get("dark"), + editable: this.model.get("editable"), + bindto: this.el, + view: this }); this.client = new PerspectiveJupyterClient(this); @@ -46,28 +44,27 @@ class PerspectiveView extends DOMWidgetView { _setElement(el: HTMLElement) { if (this.el || el !== this.pWidget.node) { // Do not allow the view to be reassigned to a different element. - throw new Error('Cannot reset the DOM element.'); + throw new Error("Cannot reset the DOM element."); } this.el = this.pWidget.node; - } - + } /** * When state changes on the viewer DOM, apply it to the widget state. * - * @param mutations + * @param mutations */ _synchronize_state(mutations: any) { - for (let mutation of mutations) { + for (const mutation of mutations) { const name = mutation.attributeName.replace(/-/g, "_"); let new_value = this.pWidget.viewer.getAttribute(mutation.attributeName); - let current_value = this.model.get(name); + const current_value = this.model.get(name); - if (typeof(new_value) === "undefined") { + if (typeof new_value === "undefined") { continue; } - if (new_value && typeof(new_value) === "string" && name !== "plugin") { + if (new_value && typeof new_value === "string" && name !== "plugin") { new_value = JSON.parse(new_value); } @@ -86,47 +83,47 @@ class PerspectiveView extends DOMWidgetView { render() { super.render(); - this.model.on('msg:custom', this._handle_message, this); - this.model.on('change:plugin', this.plugin_changed, this); - this.model.on('change:columns', this.columns_changed, this); - this.model.on('change:row_pivots', this.row_pivots_changed, this); - this.model.on('change:column_pivots', this.column_pivots_changed, this); - this.model.on('change:aggregates', this.aggregates_changed, this); - this.model.on('change:sort', this.sort_changed, this); - this.model.on('change:filters', this.filters_changed, this); - this.model.on('change:plugin_config', this.plugin_config_changed, this); - this.model.on('change:dark', this.dark_changed, this); - this.model.on('change:editable', this.editable_changed, this); + this.model.on("msg:custom", this._handle_message, this); + this.model.on("change:plugin", this.plugin_changed, this); + this.model.on("change:columns", this.columns_changed, this); + this.model.on("change:row_pivots", this.row_pivots_changed, this); + this.model.on("change:column_pivots", this.column_pivots_changed, this); + this.model.on("change:aggregates", this.aggregates_changed, this); + this.model.on("change:sort", this.sort_changed, this); + this.model.on("change:filters", this.filters_changed, this); + this.model.on("change:plugin_config", this.plugin_config_changed, this); + this.model.on("change:dark", this.dark_changed, this); + this.model.on("change:editable", this.editable_changed, this); // Watch the viewer DOM so that widget state is always synchronized with DOM attributes. const observer = new MutationObserver(this._synchronize_state.bind(this)); observer.observe(this.pWidget.viewer, { - attributes: true, - attributeFilter: ["plugin", "columns", "row-pivots", "column-pivots", "aggregates", "sort", "filters"], - subtree: false + attributes: true, + attributeFilter: ["plugin", "columns", "row-pivots", "column-pivots", "aggregates", "sort", "filters"], + subtree: false }); /** * Request a table from the manager. If a table has been loaded, proxy it and kick off subsequent operations. - * + * * If a table hasn't been loaded, the viewer won't get a response back and simply waits until it receives a table name. */ this.client.send({ id: -2, cmd: "table" - }) + }); } /** * Handle messages from the Python Perspective instance. - * + * * Messages should conform to the `PerspectiveJupyterMessage` interface. - * + * * @param msg {PerspectiveJupyterMessage} */ _handle_message(msg: PerspectiveJupyterMessage) { // Make a deep copy of each message - widget views share the same comm, so mutations on `msg` affect subsequent message handlers. - let message = JSON.parse(JSON.stringify(msg)) + const message = JSON.parse(JSON.stringify(msg)); if (message.type === "table") { const new_table = this.client.open_table(message.data); this.pWidget.load(new_table); @@ -141,7 +138,7 @@ class PerspectiveView extends DOMWidgetView { delete message.type; if (typeof message.data === "string") { message.data = JSON.parse(message.data); - } + } this.client._handle(message); } } @@ -149,43 +146,43 @@ class PerspectiveView extends DOMWidgetView { /** * When traitlets are updated in python, update the corresponding value on the front-end viewer. */ - plugin_changed(){ - this.pWidget.plugin = this.model.get('plugin'); + plugin_changed() { + this.pWidget.plugin = this.model.get("plugin"); } - columns_changed(){ - this.pWidget.columns = this.model.get('columns'); + columns_changed() { + this.pWidget.columns = this.model.get("columns"); } - row_pivots_changed(){ - this.pWidget.row_pivots = this.model.get('row_pivots'); + row_pivots_changed() { + this.pWidget.row_pivots = this.model.get("row_pivots"); } - column_pivots_changed(){ - this.pWidget.column_pivots = this.model.get('column_pivots'); + column_pivots_changed() { + this.pWidget.column_pivots = this.model.get("column_pivots"); } - aggregates_changed(){ - this.pWidget.aggregates = this.model.get('aggregates'); + aggregates_changed() { + this.pWidget.aggregates = this.model.get("aggregates"); } - sort_changed(){ - this.pWidget.sort = this.model.get('sort'); + sort_changed() { + this.pWidget.sort = this.model.get("sort"); } - filters_changed(){ - this.pWidget.filters = this.model.get('filters'); + filters_changed() { + this.pWidget.filters = this.model.get("filters"); } - plugin_config_changed(){ - this.pWidget.plugin_config = this.model.get('plugin_config'); + plugin_config_changed() { + this.pWidget.plugin_config = this.model.get("plugin_config"); } - dark_changed(){ - this.pWidget.dark = this.model.get('dark'); + dark_changed() { + this.pWidget.dark = this.model.get("dark"); } editable_changed() { this.pWidget.editable = this.model.get("editable"); } -} \ No newline at end of file +} diff --git a/packages/perspective-jupyterlab/src/ts/widget.ts b/packages/perspective-jupyterlab/src/ts/widget.ts index a30a3e317d..0f280a5be7 100644 --- a/packages/perspective-jupyterlab/src/ts/widget.ts +++ b/packages/perspective-jupyterlab/src/ts/widget.ts @@ -6,11 +6,11 @@ * the Apache License 2.0. The full license can be found in the LICENSE file. * */ -import {Message} from '@phosphor/messaging'; -import { DOMWidgetView } from '@jupyter-widgets/base'; +import {Message} from "@phosphor/messaging"; +import {DOMWidgetView} from "@jupyter-widgets/base"; -import { PerspectiveViewerOptions } from "@finos/perspective-viewer"; -import { PerspectiveWidget, PerspectiveWidgetOptions } from '@finos/perspective-phosphor'; +import {PerspectiveViewerOptions} from "@finos/perspective-viewer"; +import {PerspectiveWidget, PerspectiveWidgetOptions} from "@finos/perspective-phosphor"; import perspective from "@finos/perspective"; @@ -20,20 +20,19 @@ import * as worker from "!!file-worker-loader?inline=true!@finos/perspective/dis if (perspective) { perspective.override({wasm, worker}); } else { - console.warn('Perspective was undefined in jlab - wasm load errors may occur'); + console.warn("Perspective was undefined in jlab - wasm load errors may occur"); } export type PerspectiveJupyterWidgetOptions = { view: DOMWidgetView; -} +}; /** * PerspectiveJupyterWidget is the ipywidgets front-end for the Perspective Jupyterlab plugin. */ -export -class PerspectiveJupyterWidget extends PerspectiveWidget { - constructor(name: string = 'Perspective', options: PerspectiveViewerOptions & PerspectiveJupyterWidgetOptions & PerspectiveWidgetOptions) { - let view = options.view; +export class PerspectiveJupyterWidget extends PerspectiveWidget { + constructor(name = "Perspective", options: PerspectiveViewerOptions & PerspectiveJupyterWidgetOptions & PerspectiveWidgetOptions) { + const view = options.view; delete options.view; super(name, options); this._view = view; @@ -70,4 +69,4 @@ class PerspectiveJupyterWidget extends PerspectiveWidget { } private _view: DOMWidgetView; -} \ No newline at end of file +} diff --git a/packages/perspective-phosphor/.eslintrc.json b/packages/perspective-phosphor/.eslintrc.json new file mode 100644 index 0000000000..f7c8ddd618 --- /dev/null +++ b/packages/perspective-phosphor/.eslintrc.json @@ -0,0 +1,38 @@ +{ + "parser": "@typescript-eslint/parser", + "extends": [ + "plugin:@typescript-eslint/recommended" + ], + "plugins": [ + "prettier", + "@typescript-eslint/eslint-plugin" + ], + "env": { + "browser": true, + "commonjs": true, + "es6": true, + "node": true, + "jasmine": true, + "jest": true + }, + "parserOptions": { + "ecmaVersion": 2017, + "ecmaFeatures": {}, + "sourceType": "module", + "experimentalObjectRestSpread": true + }, + "rules": { + "prettier/prettier": ["error", { + "printWidth": 200, + "tabWidth": 4, + "bracketSpacing": false + }], + "no-const-assign": "error", + "no-this-before-super": "error", + "no-undef": "error", + "no-unreachable": "error", + "no-unused-vars": "error", + "constructor-super": "error", + "valid-typeof": "error" + } +} \ No newline at end of file diff --git a/packages/perspective-phosphor/__mocks__/@finos/perspective-viewer.js b/packages/perspective-phosphor/__mocks__/@finos/perspective-viewer.js new file mode 100644 index 0000000000..3ff27f5cbe --- /dev/null +++ b/packages/perspective-phosphor/__mocks__/@finos/perspective-viewer.js @@ -0,0 +1,14 @@ +class MockPerspectiveViewer extends HTMLElement { + restore(config) { + this.config = {...config}; + } + save() { + return this.config; + } + load(table) { + this.table = table; + } + restyleElement(){} +} + +window.customElements.define("perspective-viewer", MockPerspectiveViewer); diff --git a/packages/perspective-phosphor/config/tsconfig.json b/packages/perspective-phosphor/config/tsconfig.json new file mode 100644 index 0000000000..463f5e4c55 --- /dev/null +++ b/packages/perspective-phosphor/config/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "declaration": true, + "noImplicitAny": true, + "noEmitOnError": true, + "noUnusedLocals": true, + "module": "es6", + "moduleResolution": "node", + "resolveJsonModule": true, + "target": "es2016", + "outDir": "dist/esm", + "sourceMap": true, + "inlineSourceMap": false, + "rootDir": "../src/ts", + "lib": [ + "es2016", + "es2015.promise", + "dom" + ], + "types": [ + "@finos/perspective-viewer", + ] + }, + "include": [ + "../src/ts/*" + ], + "exclude": [ + "node_modules", + "**/*.spec.ts" + ] +} \ No newline at end of file diff --git a/packages/perspective-phosphor/tsconfig.json b/packages/perspective-phosphor/config/tsconfig.test.json similarity index 64% rename from packages/perspective-phosphor/tsconfig.json rename to packages/perspective-phosphor/config/tsconfig.test.json index 125408990d..c17bc2e6fc 100644 --- a/packages/perspective-phosphor/tsconfig.json +++ b/packages/perspective-phosphor/config/tsconfig.test.json @@ -4,23 +4,27 @@ "noImplicitAny": true, "noEmitOnError": true, "noUnusedLocals": true, - "module": "commonjs", + "module": "es6", "moduleResolution": "node", "resolveJsonModule": true, "target": "es2016", - "outDir": "dist/cjs", "sourceMap": true, "inlineSourceMap": false, + "rootDir": "../", "lib": [ "es2016", - "ES2015.Promise", - "DOM" + "es2015.promise", + "dom" ], "types": [ - "@finos/perspective-viewer" + "@finos/perspective-viewer", + "jest" ] }, "include": [ - "src/ts/*" + "../test/ts/*" + ], + "exclude": [ + "node_modules", ] } \ No newline at end of file diff --git a/packages/perspective-phosphor/src/config/cjs.config.js b/packages/perspective-phosphor/config/webpack.config.js similarity index 71% rename from packages/perspective-phosphor/src/config/cjs.config.js rename to packages/perspective-phosphor/config/webpack.config.js index 4b456effb7..0848bc4095 100644 --- a/packages/perspective-phosphor/src/config/cjs.config.js +++ b/packages/perspective-phosphor/config/webpack.config.js @@ -12,8 +12,8 @@ const webpack = require("webpack"); module.exports = { mode: process.env.PSP_NO_MINIFY || process.env.PSP_DEBUG ? "development" : process.env.NODE_ENV || "production", - entry: "./src/ts/index.ts", - devtool: "cheap-eval-source-map", + entry: path.join(__dirname, "../dist/esm/index.js"), + devtool: "source-map", resolve: { extensions: [".ts", ".js", ".json"] }, @@ -23,15 +23,15 @@ module.exports = { module: { rules: [ { - test: /\.css$/, - use: [{loader: "css-loader"}] + test: /\.less$/, + use: [{loader: "css-loader"}, {loader: "less-loader"}] }, - {test: /\.ts?$/, loader: "ts-loader"} + {test: /\.ts?$/, loader: "ts-loader", options: {configFile: "config/tsconfig.json"}} ] }, output: { filename: "index.js", - libraryTarget: "umd", - path: path.resolve(__dirname, "../../dist/cjs") + libraryTarget: "commonjs", + path: path.resolve(__dirname, "dist/cjs") } }; diff --git a/packages/perspective-phosphor/config/webpack.theme.config.js b/packages/perspective-phosphor/config/webpack.theme.config.js new file mode 100644 index 0000000000..a7c81fa9af --- /dev/null +++ b/packages/perspective-phosphor/config/webpack.theme.config.js @@ -0,0 +1,34 @@ +const MiniCssExtractPlugin = require("mini-css-extract-plugin"); +const path = require("path"); +const FixStyleOnlyEntriesPlugin = require("webpack-fix-style-only-entries"); + +module.exports = { + mode: "production", + entry: { + material: path.join(__dirname, "../src/theme/material/index.less"), + vaporwave: path.join(__dirname, "../src/theme/vaporwave/index.less") + }, + plugins: [ + new MiniCssExtractPlugin({ + filename: "[name].css", + chunkFilename: "[id].css" + }), + new FixStyleOnlyEntriesPlugin() + ], + + output: { + path: path.resolve(__dirname, "dist/themes/") + }, + module: { + rules: [ + { + test: /\.css$/, + use: [MiniCssExtractPlugin.loader, "css-loader"] + }, + { + test: /\.less$/, + use: [MiniCssExtractPlugin.loader, "css-loader", "less-loader"] + } + ] + } +}; diff --git a/packages/perspective-phosphor/package.json b/packages/perspective-phosphor/package.json index ed62dfc660..0d381a7188 100644 --- a/packages/perspective-phosphor/package.json +++ b/packages/perspective-phosphor/package.json @@ -7,8 +7,8 @@ "src/css/*.css", "babel.config.js" ], - "main": "dist/cjs/index.js", - "types": "dist/cjs/index.d.ts", + "main": "dist/esm/index.js", + "types": "dist/esm/index.d.ts", "license": "Apache-2.0", "publishConfig": { "access": "public" @@ -17,30 +17,43 @@ "bench": "npm-run-all bench:build bench:run", "bench:build": "echo \"No Benchmarks\"", "bench:run": "echo \"No Benchmarks\"", - "test": "npm-run-all test:run", - "test:run": "echo done", - "build": "webpack --color --config src/config/cjs.config.js", - "clean": "rimraf dist" + "build": "npm-run-all build:esm build:cjs build:styles", + "build:esm": "tsc --p ./config --outDir dist/esm", + "build:cjs": "webpack --color --config config/webpack.config.js", + "build:styles": "webpack --color --config config/webpack.theme.config.js", + "clean": "rimraf dist", + "test": "jest --silent --color 2>&1" }, "dependencies": { "@finos/perspective": "^0.3.9", "@finos/perspective-viewer": "^0.3.9", - "@finos/perspective-viewer-d3fc": "^0.3.9", - "@finos/perspective-viewer-highcharts": "^0.3.9", - "@finos/perspective-viewer-hypergrid": "^0.3.9", "@phosphor/application": "^1.5.0", - "@phosphor/widgets": "^1.6.0" + "@phosphor/default-theme": "0.1.0", + "@phosphor/widgets": "^1.6.0", + "lodash.uniqby": "^4.7.0" }, "devDependencies": { "@finos/perspective-webpack-plugin": "^0.3.8", - "@types/jest": "^23.3.9", + "@types/jest": "^24.0.19", + "@types/lodash.uniqby": "^4.7.6", + "document-register-element": "^1.14.3", "file-loader": "^0.11.1", "identity-obj-proxy": "^3.0.0", "isomorphic-fetch": "^2.2.1", "jest-transform-css": "^2.0.0", + "mini-css-extract-plugin": "^0.8.0", + "mutationobserver-shim": "^0.3.3", "rimraf": "^2.5.2", "source-map-support": "^0.5.9", - "ts-jest": "^23.10.4", - "typescript": "^3.2.4" + "typescript": "^3.6.0", + "webpack-fix-style-only-entries": "^0.4.0" + }, + "jest": { + "transform": { + ".js$": "@finos/perspective-test/src/js/transform.js" + }, + "setupFiles": [ + "./test/setup-jest.js" + ] } } diff --git a/packages/perspective-phosphor/src/less/index.less b/packages/perspective-phosphor/src/less/index.less deleted file mode 100644 index 9a130746b6..0000000000 --- a/packages/perspective-phosphor/src/less/index.less +++ /dev/null @@ -1,22 +0,0 @@ -/****************************************************************************** - * - * Copyright (c) 2018, the Perspective Authors. - * - * This file is part of the Perspective library, distributed under the terms of - * the Apache License 2.0. The full license can be found in the LICENSE file. - * - */ -@import (less) "../../../perspective-viewer/src/less/column_labels.less"; -@import (less) "../../../perspective-viewer/src/less/computed_column.less"; -@import (less) "../../../perspective-viewer/src/less/default.less"; -@import (less) "../../../perspective-viewer/src/less/row.less"; -@import (less) "../../../perspective-viewer/src/less/variables.less"; -@import (less) "../../../perspective-viewer/src/less/viewer.less"; -@import (less) "../../../perspective-viewer/src/themes/material.less"; - -div.PSPContainer { -} - -div.PSPContainer-dark { - @import (less) "../../../perspective-viewer/src/themes/material.dark.less"; -} diff --git a/packages/perspective-phosphor/src/less/widget.less b/packages/perspective-phosphor/src/less/widget.less new file mode 100644 index 0000000000..5cb9c3fa91 --- /dev/null +++ b/packages/perspective-phosphor/src/less/widget.less @@ -0,0 +1,17 @@ +/****************************************************************************** + * + * Copyright (c) 2018, the Perspective Authors. + * + * This file is part of the Perspective library, distributed under the terms of + * the Apache License 2.0. The full license can be found in the LICENSE file. + * + */ + + + div.PSPContainer { + @import (less) "../../../perspective-viewer/src/themes/material.less"; +} + +div.PSPContainer-dark { + @import (less) "../../../perspective-viewer/src/themes/material.dark.less"; +} diff --git a/packages/perspective-phosphor/src/theme/default/index.less b/packages/perspective-phosphor/src/theme/default/index.less new file mode 100644 index 0000000000..21bb0604a0 --- /dev/null +++ b/packages/perspective-phosphor/src/theme/default/index.less @@ -0,0 +1,8 @@ +@import '~@phosphor/default-theme/style/index.css'; +@import "./tabbar.less"; + +perspective-viewer { + width: 100%; + height: 100%; +} + diff --git a/packages/perspective-phosphor/src/theme/default/tabbar.less b/packages/perspective-phosphor/src/theme/default/tabbar.less new file mode 100644 index 0000000000..3bc02ba945 --- /dev/null +++ b/packages/perspective-phosphor/src/theme/default/tabbar.less @@ -0,0 +1,24 @@ +.p-TabBar-tab.p-mod-maximize > .p-TabBar-tabMaximizeIcon { + display: none; +} + + +.bottom .p-TabBar-tab > .p-TabBar-tabMaximizeIcon { + display: none; +} + +.p-TabBar-tab.p-mod-current.p-mod-maximize > .p-TabBar-tabMaximizeIcon { + display: block; +} + +.p-TabBar-tab.p-mod-maximize > .p-TabBar-tabMaximizeIcon:before { + content: "\01F5D6"; +} + +.p-TabBar-tab.p-mod-minimize > .p-TabBar-tabMaximizeIcon:before { + content: "\0023BD"; +} + +.p-TabBar-tab.p-mod-closable > .p-TabBar-tabCloseIcon:before { + content: "\2715"; +} \ No newline at end of file diff --git a/packages/perspective-phosphor/src/theme/material/dockpanel.less b/packages/perspective-phosphor/src/theme/material/dockpanel.less new file mode 100644 index 0000000000..399e2d4ab1 --- /dev/null +++ b/packages/perspective-phosphor/src/theme/material/dockpanel.less @@ -0,0 +1,39 @@ +.p-DockPanel { + overflow: visible !important; + border-width: 24px 24px 20px 24px; + border-style: solid; + border-color: #eee; + background-color: #eee +} + + +.p-DockPanel-handle { + background-color: none; +} + +.p-DockPanel-overlay { + background: rgba(75, 75, 75, 0.2); + border: 1px dashed #666; + transition-property: top, left, right, bottom; + transition-duration: 50ms; + transition-timing-function: ease; + margin: 0px 5px 10px 5px; +} + +.p-DockPanel { + perspective-viewer { + flex: 1; + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + position: absolute; + top: 0; + left: 4px; + right: 4px; + bottom: 8px; + overflow: visible !important; + --plugin--border: 1px solid #eaeaea;; + --plugin--box-shadow: 0px 2px 3px rgba(0,0,0,0.2); + } +} \ No newline at end of file diff --git a/packages/perspective-phosphor/src/theme/material/index.less b/packages/perspective-phosphor/src/theme/material/index.less new file mode 100644 index 0000000000..1c53e85913 --- /dev/null +++ b/packages/perspective-phosphor/src/theme/material/index.less @@ -0,0 +1,2 @@ +@import "./material-phosphor.less"; +@import "~@finos/perspective-viewer/dist/themes/material.less"; diff --git a/packages/perspective-phosphor/src/theme/material/material-phosphor.less b/packages/perspective-phosphor/src/theme/material/material-phosphor.less new file mode 100644 index 0000000000..86b1c89fe2 --- /dev/null +++ b/packages/perspective-phosphor/src/theme/material/material-phosphor.less @@ -0,0 +1,7 @@ +@import "~@phosphor/widgets/style/index.css"; +@import "./tabbar.less"; +@import "./dockpanel.less"; +@import "./menu.less"; +@import "./widget.less"; +@import "../../less/widget.less"; +@import "./workspace.less"; \ No newline at end of file diff --git a/packages/perspective-phosphor/src/theme/material/menu.less b/packages/perspective-phosphor/src/theme/material/menu.less new file mode 100644 index 0000000000..96b6fc68e2 --- /dev/null +++ b/packages/perspective-phosphor/src/theme/material/menu.less @@ -0,0 +1,149 @@ +@import "~@phosphor/widgets/style/menu.css"; + +.p-Menu { + padding: 12px; + background: white; + color: #666; + border: 1px solid #ccc; + border-left-width: 0px; + border-top-width: 0px; + border-right-width: 1px; + font: 12px Helvetica, Arial, sans-serif; + box-shadow: -1px 1px 3px rgba(0, 0, 0, 0.1); +} + +.p-Menu-item.p-mod-active { + background: #e5e5e5; +} + +.p-Menu-item.p-mod-disabled { + color: rgba(0, 0, 0, 0.25); +} + +.p-Menu-itemIcon { + width: 21px; + padding: 4px 2px; +} + +.p-Menu-itemLabel { + padding: 4px 2px 4px 2px; +} + +.p-Menu-itemMnemonic { + text-decoration: underline; +} + +.p-Menu-itemShortcut { + padding: 4px 0px; +} + +.p-Menu-itemSubmenuIcon { + width: 16px; + padding: 4px 0px; +} + +.p-Menu-item[data-type="separator"] > div { + padding: 0; + height: 9px; +} + +.p-Menu-item[data-type="separator"] > div::after { + content: ""; + display: block; + position: relative; + top: 4px; + border-top: 1px solid #dddddd; +} + +.p-Menu-itemIcon::before, +.p-Menu-itemSubmenuIcon::before { + font-family: "Material Icons"; +} + +.p-Menu-item.p-mod-toggled > .p-Menu-itemIcon::before { + content: "\E5CA"; +} + +.p-Menu-item[data-type="submenu"] > .p-Menu-itemSubmenuIcon::before { + content: "\E315"; +} + +.p-MenuBar { + padding-left: 5px; + font: 14px "Open Sans"; +} + +.p-MenuBar-menu { + transform: translateY(-1px); +} + +.p-MenuBar-item { + padding: 10px 32px; + border-left: 1px solid transparent; + border-right: 1px solid transparent; + color: #737373 !important; +} + +.p-MenuBar-item.p-mod-active { + background: #e5e5e5; +} + +.p-MenuBar.p-mod-active .p-MenuBar-item.p-mod-active { + z-index: 10001; + background: white; + border-left: 1px solid #c0c0c0; + border-right: 1px solid #c0c0c0; + box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); +} + + +.p-MenuItem-export:before { + content: "\E2C4"; + font-family: "Material Icons"; +} + +.p-MenuItem-preview:before { + content: "\E8B8"; + font-family: "Material Icons"; +} + +.p-MenuItem-duplicate:before { + content: "call_split"; + font-family: "Material Icons"; +} + +.p-MenuItem-config:before { + content: "more_vert"; + font-family: "Material Icons"; +} + +.p-MenuItem-copy:before { + content: "file_copy"; + font-family: "Material Icons"; +} + + +.p-MenuItem-link:before { + content: "link"; + font-family: "Material Icons"; +} + +.p-MenuItem-linkOff:before { + content: "link_off"; + font-family: "Material Icons"; +} + +.p-MenuItem-new:before { + content: "\E89E"; + font-family: "Material Icons"; +} + +.p-MenuItem-reset:before { + content: "\E863"; + font-family: "Material Icons"; +} + +.p-MenuItem-master:before { + content: "cast"; + font-family: "Material Icons"; +} diff --git a/packages/perspective-phosphor/src/theme/material/tabbar.less b/packages/perspective-phosphor/src/theme/material/tabbar.less new file mode 100644 index 0000000000..f01059fe03 --- /dev/null +++ b/packages/perspective-phosphor/src/theme/material/tabbar.less @@ -0,0 +1,362 @@ +@import "~@finos/perspective-viewer/src/less/variables.less"; + +.p-TabBar-tab.p-mod-closable > .p-TabBar-tabCloseIcon:before { + content: "\E14C"; + font-family: "Material Icons"; +} + +.p-TabBar-tab.p-mod-maximize > .p-TabBar-tabMaximizeIcon { + display: none; +} + + +.bottom .p-TabBar-tab > .p-TabBar-tabMaximizeIcon { + display: none; +} + +.p-TabBar-tab.p-mod-current.p-mod-maximize > .p-TabBar-tabMaximizeIcon { + display: block; +} + +.p-TabBar-tab.p-mod-maximize > .p-TabBar-tabMaximizeIcon:before { + content: "\e5d0"; + font-family: "Material Icons"; +} + +.p-TabBar-tab.p-mod-minimize > .p-TabBar-tabMaximizeIcon:before { + content: "\e5d1"; + font-family: "Material Icons"; +} + +.p-TabBar-tab > .p-TabBar-tabConfigIcon { + opacity: 0; + pointer-events: none; +} + +.p-TabBar-tab.p-mod-current > .p-TabBar-tabConfigIcon { + opacity: 1; + pointer-events: all; +} + +.p-TabBar-tab > .p-TabBar-tabConfigIcon:before { + content: "expand_more"; + font-family: "Material Icons"; +} + +.p-mod-current { + .p-TabBar-tabConfigIcon, .p-TabBar-tabMaximizeIcon, .p-TabBar-tabCloseIcon { + color: #999; + } +} + +.p-BoxPanel { + margin: 24px 20px 16px 20px; + overflow: visible !important; +} + + +.p-TabBar, +.p-TabBar-tab { + position: relative; + + overflow: visible !important; +} + +.p-TabBar-tabLabel:empty::after { + content: "[untitled]"; + color: #aaa; +} + +.p-mod-current .p-TabBar-tabLabel:empty::after { + color: #ddd; +} + +.p-TabBar-tabLabel:empty::after { + content: "[untitled]"; +} + + +.divider { + left: 24px; + bottom: 0; + position: absolute; + // background: #ccc; + right: 24px; + display: none; + transition: background-color 0.2s ease-out, width 0.2s ease-out; + + height: 1px; + background-color: #eaeaea; + margin-bottom: 0px; +} + +.p-TabBar-tab.p-mod-hidden { + display: flex !important; + opacity: 0.5; +} + +.p-TabBar-tab.p-mod-hidden .divider { + display: none; +} + +.p-TabBar-tab.p-mod-current .divider { + display: block; +} + +.p-TabBar-tabLabel input { + height: 18px; + padding-right: 20px; +} + +.p-TabBar { + min-height: 36px !important; +} + + +@border-color: 1px solid #eaeaea; +@night-border-color: 1px solid #ddd; + + +.pfm-button-base { + background: white !important; +} + +.pfm-button-base:active { + background: #016bc6 !important; +} + +.p-TabBar-content { + padding: 0px 5px; + overflow: hidden; + margin: 0px 0px -1px 0px; + border-bottom: 0px solid #fff !important; +} + +.p-TabBar-tab.p-mod-current { + .shadow { + margin: -1px; + box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.2); + position: absolute; + width: calc(~"100% + 2px"); + height: 200%; + pointer-events: none; + left: 0px; + } + + &.settings_open .shadow { + box-shadow: none; + } +} + +.p-TabBar-tab { + border-color: #eaeaea; +} + +.p-TabBar-tab.p-mod-current.settings_open > .p-TabBar-tabConfigIcon:before { + content: "expand_less"; +} + + .p-TabBar-content > .p-TabBar-tab, + .p-TabBar-content > .p-TabBar-tab.p-mod-current.settings_open { + background-color: #eee; +} + + .condensed .p-TabBar-content { + + & > .p-TabBar-tab .p-TabBar-tabConfigIcon { + display: none; + } + + & > .p-TabBar-tab.p-mod-current .p-TabBar-tabConfigIcon { + display: block; + } + + & > .p-TabBar-tab.p-mod-current.settings_open { + .p-TabBar-tabLabel { + margin-left: 0px; + } + } +} + + + .p-TabBar-content > .p-TabBar-tab.p-mod-current.settings_open { + border-width: 1px !important; + border-color: transparent; + .p-TabBar-tabLabel { + margin-left: 100px; + margin-right: 24px; + } + .p-TabBar-tabToolbar { + display: flex; + } + .divider { + height: 1px; + background-color: @blue800; + margin-bottom: 0px; + left: 18px; + right: 18px; + } + &:last-child:first-child .divider { + background: none; + transition: none; + } +} + + .p-TabBar-content > .p-TabBar-tab { + .p-TabBar-tabLinkIcon:before { + display: none; + } +} + + .p-TabBar-content > .p-TabBar-tab.settings_open.p-mod-current { + .p-TabBar-tabLinkIcon:before { + display: block; + } +} + +.p-TabBar-tab.p-mod-maximize > .p-TabBar-tabMaximizeIcon + +.p-TabBar.linked { + display: inline +} + +.p-TabBar.linked > .p-TabBar-content > .p-TabBar-tab { + .p-TabBar-tabLinkIcon:before { + display: block; + content: "link"; + font-family: "Material Icons"; + transition: color 0.2s; + &:hover { + color: @blue800; + } + } + .p-TabBar-tabLinkIcon { + color: #999; + } +} + + .p-TabBar-content > .p-TabBar-tab.p-mod-current.perspective_updating { + .p-TabBar-tabConfigIcon { + display: none; + } + + + .p-TabBar-tabLoadingIcon { + display: block; + } +} + +.p-TabBar-content > .p-TabBar-tab.p-mod-current.settings_open { + background-color: transparent !important; +} + + .p-TabBar-content > .p-TabBar-tab { + max-width: 100000px !important; + flex: 0 1 100000px !important; + background: none; + color: #737373; + padding-top: 1px !important; + border-style: solid; + border-width: 1px; + border-color: transparent; + height: 36px !important; + max-height: 36px !important; + transform: none !important; + transition: color 0.2s ease-out; +} + + .p-TabBar-content > .p-TabBar-tab { + color: #ccc; +} + +.p-TabBar-content > .p-TabBar-tab { + color: #666; +} + +.p-TabBar-content > .p-TabBar-tab:hover { + color: #ccc; +} + + .p-TabBar-content > .p-TabBar-tab.p-mod-current { + color: #666; +} + + .p-TabBar-content > .p-TabBar-tab:hover { + color: #666; + transition: none; +} + + .p-TabBar-tab.p-mod-current .p-TabBar-tabLabel { + white-space: nowrap !important; +} + + .p-TabBar-tabLabel { + font-family: "Open Sans"; + font-weight: 400; + font-size: 12px; + line-height: 34px; + text-align: center; + white-space: normal !important; + word-break: break-all; +} + + +.p-TabBar-tabCloseIcon, +.p-TabBar-tabConfigIcon { + cursor: pointer !important; + line-height: 34px !important; + padding-right: 17px !important; + padding-left: 4px; +} + +.p-TabBar-tabConfigIcon { + padding-left: 16px; +} + +.p-TabBar-tabLoadingIcon { + padding-left: 11px; + padding-right: 12px; +} + +.p-TabBar-tabLinkIcon, +.p-TabBar-tabMaximizeIcon { + cursor: pointer !important; + line-height: 34px !important; + padding-right: 5px; +} + +.bottom .p-TabBar-tab { + flex-basis: 10000px !important; + max-width: 10000px !important; +} + + .p-TabBar-content > .p-TabBar-tab.p-mod-current { + background-color: white; + color: #666 !important; + border-right: @border-color; + border-left: @border-color; + border-top: @border-color; + height: 38px !important; + max-height: 38px !important; +} + +.bottom .p-TabBar-tab.p-mod-current { + border: none; +} + +::-webkit-scrollbar-thumb { + background-color: #ccc; +} + +.p-TabBar-tab.p-mod-drag-image { + display: none; +} + +.p-DockPanel.context-menu-open > .p-TabBar.context-focus{ + opacity: 1 +} + +.p-DockPanel.context-menu-open > .p-TabBar{ + opacity: 0.2 +} + diff --git a/packages/perspective-phosphor/src/theme/material/widget.less b/packages/perspective-phosphor/src/theme/material/widget.less new file mode 100644 index 0000000000..c3214bd190 --- /dev/null +++ b/packages/perspective-phosphor/src/theme/material/widget.less @@ -0,0 +1,36 @@ + +.p-Widget.PSPContainer { + background-color: none; + border: @border-color; + border-width: 1px; + border-top-width: 0px; + padding-left: 4px; + padding-right: 4px; + padding-bottom: 4px; +} + +.p-Widget.PSPContainer { + border: none; +} + + +@border-color: 1px solid #eaeaea; +@night-border-color: 1px solid #ddd; + +.p-Widget.PSPContainer { + border: @border-color; + border-width: 0px !important; +} + +.night .p-Widget.PSPContainer { + border: @night-border-color !important; + border-width: 0px !important; +} + +.p-DockPanel.context-menu-open > .p-Widget.PSPContainer{ + opacity: 0.2 +} + +.p-DockPanel.context-menu-open > .p-Widget.PSPContainer.context-focus{ + opacity: 1 +} \ No newline at end of file diff --git a/packages/perspective-phosphor/src/theme/material/workspace.less b/packages/perspective-phosphor/src/theme/material/workspace.less new file mode 100644 index 0000000000..c08ebec190 --- /dev/null +++ b/packages/perspective-phosphor/src/theme/material/workspace.less @@ -0,0 +1,14 @@ +.p-SplitPanel{ + height: 100%; + width: 100%; +} + +.p-SplitPanel.p-Master{ + background: #2e3136; + perspective-viewer{ + padding-top: 5px; + display: flex; + width: 100%; + height: 100%; + } +} \ No newline at end of file diff --git a/packages/perspective-phosphor/src/theme/vaporwave/index.less b/packages/perspective-phosphor/src/theme/vaporwave/index.less new file mode 100644 index 0000000000..9d362efc3f --- /dev/null +++ b/packages/perspective-phosphor/src/theme/vaporwave/index.less @@ -0,0 +1,55 @@ +@import "../material/material-phosphor.less"; + +.p-DockPanel { + background-color: #150442; + border-color: #150442; +} + +.p-TabBar-content > .p-TabBar-tab.p-mod-current { + border: none; + color: #cfd8dc !important; + background: none; +} + +.p-SplitPanel-handle:after { + background-color: #0e0611; +} + + +div.PSPContainer perspective-viewer[settings] { + --settings-button--content: "" !important; +} + +div.PSPContainer, div.PSPContainer-dark { + @import "~@finos/perspective-viewer/dist/themes/vaporwave.less"; +} + +div.PSPContainer { + perspective-viewer { + padding: 0px; + --hypergrid-header--background: #150442; + --hypergrid--background: #150442; + --plugin--background: #150442; + --plugin--border: 0px solid #150442; + --plugin--box-shadow: none; + --hypergrid--padding: 0px; + + --settings-button--content: ""; + } +} + +div.PSPContainer-dark { + perspective-viewer { + padding: 0px; + --plugin--border: 0px solid #0e0611; + --hypergrid-header--background: #0e0611; + --hypergrid--background: #0e0611; + --plugin--background: #0e0611; + --plugin--border: 0px solid #0e0611; + --plugin--box-shadow: none; + --settings-button--content: ""; + --integer--hypergrid--background: #0e0611; + --hypergrid-tree-header--background: #0e0611; + background-color: #0e0611; + } +} diff --git a/packages/perspective-phosphor/src/ts/arraybuffer.d.ts b/packages/perspective-phosphor/src/ts/arraybuffer.d.ts index 761f201b09..8c866bab8a 100644 --- a/packages/perspective-phosphor/src/ts/arraybuffer.d.ts +++ b/packages/perspective-phosphor/src/ts/arraybuffer.d.ts @@ -7,5 +7,5 @@ * */ -declare module 'arraybuffer-loader!*'; -declare module 'file-worker-loader?inline=true!*'; +declare module "arraybuffer-loader!*"; +declare module "file-worker-loader?inline=true!*"; diff --git a/packages/perspective-phosphor/src/ts/contextmenu.ts b/packages/perspective-phosphor/src/ts/contextmenu.ts new file mode 100644 index 0000000000..b74f6b201a --- /dev/null +++ b/packages/perspective-phosphor/src/ts/contextmenu.ts @@ -0,0 +1,44 @@ +/****************************************************************************** + * + * Copyright (c) 2018, the Perspective Authors. + * + * This file is part of the Perspective library, distributed under the terms of + * the Apache License 2.0. The full license can be found in the LICENSE file. + * + */ + +import {CommandRegistry} from "@phosphor/commands"; +import {PerspectiveDockPanel} from "./dockpanel"; + +export const createCommands = (dock: PerspectiveDockPanel): CommandRegistry => { + const commands = new CommandRegistry(); + commands.addCommand("perspective:duplicate", { + execute: ({widget}) => dock.duplicate(widget as any), + iconClass: "p-MenuItem-duplicate", + label: "Duplicate", + mnemonic: 0 + }); + + commands.addCommand("perspective:export", { + execute: (args: any) => args.widget.viewer.download(), + iconClass: "p-MenuItem-export", + label: "Export CSV", + mnemonic: 0 + }); + + commands.addCommand("perspective:copy", { + execute: (args: any) => args.widget.viewer.copy(), + iconClass: "p-MenuItem-copy", + label: "Copy To Clipboard", + mnemonic: 0 + }); + + commands.addCommand("perspective:reset", { + execute: (args: any) => args.widget.viewer.reset(), + iconClass: "p-MenuItem-reset", + label: "Reset", + mnemonic: 0 + }); + + return commands; +}; diff --git a/packages/perspective-phosphor/src/ts/dockpanel.ts b/packages/perspective-phosphor/src/ts/dockpanel.ts new file mode 100644 index 0000000000..d4c52cac7b --- /dev/null +++ b/packages/perspective-phosphor/src/ts/dockpanel.ts @@ -0,0 +1,207 @@ +/****************************************************************************** + * + * Copyright (c) 2018, the Perspective Authors. + * + * This file is part of the Perspective library, distributed under the terms of + * the Apache License 2.0. The full license can be found in the LICENSE file. + * + */ + +import {find} from "@phosphor/algorithm"; +import {DockPanel, TabBar, Widget, DockLayout} from "@phosphor/widgets"; +import {Menu} from "@phosphor/widgets"; +import {createCommands} from "./contextmenu"; +import {PerspectiveTabBar, TabMaximizeArgs} from "./tabbar"; +import {PerspectiveTabBarRenderer} from "./tabbarrenderer"; +import {PerspectiveWidget, PerspectiveWidgetOptions} from "./widget"; +import {mapWidgets} from "./utils"; +import {Signal} from "@phosphor/signaling"; +import {CommandRegistry} from "@phosphor/commands"; + +export interface SerializableITabAreaConfig extends Omit { + widgets: PerspectiveWidgetOptions[]; +} + +export interface SerializableISplitAreaConfig extends Omit { + widgets: PerspectiveWidgetOptions[]; +} + +export type SerilizableAreaConfig = SerializableITabAreaConfig | SerializableISplitAreaConfig; + +export interface SerilizableILayoutConfig { + main: SerilizableAreaConfig | null; +} + +class PerspectiveDockPanelRenderer extends DockPanel.Renderer { + public dock: PerspectiveDockPanel; + + public createTabBar(): TabBar { + const tabbar = new PerspectiveTabBar({renderer: new PerspectiveTabBarRenderer(this.dock.maximized)}); + tabbar.addClass("p-DockPanel-tabBar"); + tabbar.tabMaximizeRequested.connect(this.dock.onTabMaximizeRequested, this); + tabbar.toggleConfigRequested.connect(this.dock.onToggleConfigRequested, this); + return tabbar; + } +} + +export interface PerspectiveDockPanelOptions extends DockPanel.IOptions { + enableContextMenu: boolean; +} + +export interface ContextMenuArgs { + widget: PerspectiveWidget; + event: MouseEvent; +} +// tslint:disable-next-line: max-classes-per-file +export class PerspectiveDockPanel extends DockPanel { + public id = "main"; + + public maximized: boolean; + + public commands: CommandRegistry; + private minimizedLayout: DockPanel.ILayoutConfig; + private enableContextMenu = true; + private _onContextMenu: Signal; + + private listeners: WeakMap; + + constructor(name: string, options: PerspectiveDockPanelOptions = {enableContextMenu: true}) { + super({renderer: new PerspectiveDockPanelRenderer(), spacing: 14, ...options}); + + // Need a cleaner way to do this + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (this as any)._renderer.dock = this; + this.commands = createCommands(this); + this.addTabbarEventListeners(); + this.listeners = new WeakMap(); + this.enableContextMenu = options.enableContextMenu; + this._onContextMenu = new Signal(this); + if (this.enableContextMenu) { + this._onContextMenu.connect(this.showMenu); + } + } + + public duplicate(widget: PerspectiveWidget): void { + const newWidget = new PerspectiveWidget(widget.name); + newWidget.title.closable = true; + newWidget.restore(widget.save()).then(() => { + this.addWidget(newWidget, {mode: "split-right", ref: widget}); + newWidget.load(widget.table); + }); + } + + public addWidget(widget: PerspectiveWidget, options: DockPanel.IAddOptions = {}): void { + this.addWidgetEventListeners(widget); + super.addWidget(widget, options); + } + + public deserialize(layout: SerilizableILayoutConfig): void { + const newLayout = mapWidgets((config: PerspectiveWidgetOptions) => this.createWidget(config.title, config), layout); + this.restoreLayout(newLayout); + } + + public serialize(): SerilizableILayoutConfig { + const layout = this.saveLayout(); + return mapWidgets((widget: PerspectiveWidget) => widget.save(), layout); + } + + public onToggleConfigRequested = (sender: PerspectiveTabBar, args: TabMaximizeArgs): void => { + (args.title.owner as PerspectiveWidget).toggleConfig(); + }; + /** + * Handle the `tabMaximizeRequested` signal from a tab bar. + */ + // rethink maximize + public onTabMaximizeRequested = (sender: PerspectiveTabBar, args: TabMaximizeArgs): void => { + this.maximized = !this.maximized; + if (this.maximized) { + this.minimizedLayout = this.saveLayout(); + + this.restoreLayout({ + main: { + currentIndex: 0, + type: "tab-area", + widgets: [args.title.owner] + } + }); + } else { + this.restoreLayout(this.minimizedLayout); + this.minimizedLayout = null; + } + }; + + protected findTabbar(widget: PerspectiveWidget): PerspectiveTabBar { + return find(this.tabBars(), bar => bar.titles[0].owner === widget) as PerspectiveTabBar; + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private createMenu(widget: any): Menu { + const contextMenu = new Menu({commands: this.commands}); + contextMenu.addItem({command: "perspective:duplicate", args: {widget}}); + + // could move these 3 to perspective widget + contextMenu.addItem({command: "perspective:export", args: {widget}}); + contextMenu.addItem({command: "perspective:copy", args: {widget}}); + contextMenu.addItem({command: "perspective:reset", args: {widget}}); + return contextMenu; + } + + private showMenu(sender: PerspectiveDockPanel, args: ContextMenuArgs): void { + // create menu in add widget instead?? + const {event, widget} = args; + const menu = this.createMenu(widget); + const tabbar = this.findTabbar(widget); + + widget.node.classList.add("context-focus"); + tabbar.node.classList.add("context-focus"); + this.node.classList.add("context-menu-open"); + + menu.aboutToClose.connect(() => { + widget.node.classList.remove("context-focus"); + tabbar.node.classList.remove("context-focus"); + this.node.classList.remove("context-menu-open"); + }); + + menu.open(event.clientX, event.clientY); + event.preventDefault(); + event.stopPropagation(); + } + + get onContextMenu(): Signal { + return this._onContextMenu; + } + + private addTabbarEventListeners(): void { + this.node.addEventListener("contextmenu", event => { + const tabBar = find(this.tabBars(), bar => { + return bar.node.contains(event.target as Node); + }); + const widget = tabBar.titles[0].owner as PerspectiveWidget; + this._onContextMenu.emit({widget, event}); + event.preventDefault(); + }); + } + + private addWidgetEventListeners(widget: PerspectiveWidget): void { + if (this.listeners.has(widget)) { + this.listeners.get(widget)(); + } + const settings = (event: CustomEvent): void => { + widget.title.className = event.detail && "settings_open"; + }; + const contextMenu = (event: MouseEvent): void => this.onContextMenu.emit({widget, event}); + widget.viewer.addEventListener("contextmenu", contextMenu); + widget.viewer.addEventListener("perspective-toggle-settings", settings); + + this.listeners.set(widget, () => { + widget.viewer.removeEventListener("contextmenu", contextMenu); + widget.viewer.removeEventListener("perspective-toggle-settings", settings); + }); + } + + public createWidget = (title: string, config: PerspectiveWidgetOptions): PerspectiveWidget => { + const widget = new PerspectiveWidget(title, config); + this.addWidgetEventListeners(widget); + return widget; + }; +} diff --git a/packages/perspective-phosphor/src/ts/index.ts b/packages/perspective-phosphor/src/ts/index.ts index f41fd7bb4a..47b5ca18ca 100644 --- a/packages/perspective-phosphor/src/ts/index.ts +++ b/packages/perspective-phosphor/src/ts/index.ts @@ -6,9 +6,7 @@ * the Apache License 2.0. The full license can be found in the LICENSE file. * */ -export * from './widget'; -export * from './utils'; - -/* css */ -import '!!style-loader!css-loader!less-loader!../less/index.less'; - +export * from "./widget"; +export * from "./utils"; +export * from "./dockpanel"; +export * from "./workspace"; diff --git a/packages/perspective-phosphor/src/ts/tabbar.ts b/packages/perspective-phosphor/src/ts/tabbar.ts new file mode 100644 index 0000000000..ca24087250 --- /dev/null +++ b/packages/perspective-phosphor/src/ts/tabbar.ts @@ -0,0 +1,92 @@ +/****************************************************************************** + * + * Copyright (c) 2018, the Perspective Authors. + * + * This file is part of the Perspective library, distributed under the terms of + * the Apache License 2.0. The full license can be found in the LICENSE file. + * + */ + +import {ArrayExt} from "@phosphor/algorithm"; +import {ElementExt} from "@phosphor/domutils"; +import {Message} from "@phosphor/messaging"; +import {Signal} from "@phosphor/signaling"; +import {TabBar, Widget, Title} from "@phosphor/widgets"; +import {TabBarActions} from "./tabbarrenderer"; + +export interface TabMaximizeArgs { + title: Title; +} +export class PerspectiveTabBar extends TabBar { + private __content_node__: HTMLUListElement; + private _tabMaximizeRequested: Signal; + private _toggleConfigRequested: Signal; + + constructor(options: TabBar.IOptions = {}) { + super(options); + this._tabMaximizeRequested = new Signal(this); + this._toggleConfigRequested = new Signal(this); + this.__content_node__; + } + + public get tabMaximizeRequested(): Signal { + return this._tabMaximizeRequested; + } + + public get toggleConfigRequested(): Signal { + return this._toggleConfigRequested; + } + + public onUpdateRequest(msg: Message): void { + // NOT INERT! This is a phosphor bug fix. + // phosphor/virtualdom keeps a weakmap on contentNode which is later + // reset - this causes the diff to double some elements. Memoizing + // prevent collection from the weakmap. + // eslint-disable-next-line @typescript-eslint/camelcase + this.__content_node__ = this.contentNode; + super.onUpdateRequest(msg); + } + + public handleEvent(event: MouseEvent): void { + switch (event.type) { + case "mousedown": + const action: string = (event.target as HTMLElement).id; + if ([TabBarActions.Maximize as string, TabBarActions.Config].indexOf(action) === -1) { + break; + } + const tabs = this.contentNode.children; + + // Find the index of the released tab. + const index = ArrayExt.findFirstIndex(tabs, tab => { + return ElementExt.hitTest(tab, event.clientX, event.clientY); + }); + + if (index < 0) { + break; + } + + const title = this.titles[index]; + if (action === TabBarActions.Maximize) { + this._tabMaximizeRequested && this._tabMaximizeRequested.emit({title}); + } else { + this._toggleConfigRequested.emit({title}); + } + break; + } + super.handleEvent(event); + } + + public onResize(msg: Widget.ResizeMessage): void { + super.onResize(msg); + this.checkCondensed(msg); + } + + public checkCondensed(msg: Widget.ResizeMessage): void { + const approxWidth = (msg ? msg.width : this.node.offsetWidth) / this.contentNode.children.length; + if (approxWidth < 400) { + this.node.classList.add("condensed"); + } else { + this.node.classList.remove("condensed"); + } + } +} diff --git a/packages/perspective-phosphor/src/ts/tabbarrenderer.ts b/packages/perspective-phosphor/src/ts/tabbarrenderer.ts new file mode 100644 index 0000000000..78fcea261e --- /dev/null +++ b/packages/perspective-phosphor/src/ts/tabbarrenderer.ts @@ -0,0 +1,66 @@ +/****************************************************************************** + * + * Copyright (c) 2018, the Perspective Authors. + * + * This file is part of the Perspective library, distributed under the terms of + * the Apache License 2.0. The full license can be found in the LICENSE file. + * + */ + +import {h, VirtualElement} from "@phosphor/virtualdom"; +import {TabBar} from "@phosphor/widgets"; + +export enum TabBarActions { + Maximize = "maximize", + Config = "config" +} + +export class PerspectiveTabBarRenderer extends TabBar.Renderer { + private maximized = false; + + constructor(maximized: boolean) { + super(); + this.maximized = maximized; + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + public renderTab(data: TabBar.IRenderData): VirtualElement { + const title = data.title.caption; + const key = this.createTabKey(data); + const style = this.createTabStyle(data); + let className = this.createTabClass(data); + const dataset = this.createTabDataset(data); + + // move these to tabbar as well + if (!this.maximized) { + className += ` p-mod-maximize`; + } else { + className += ` p-mod-minimize`; + } + + return h.li( + {key, className, title, style, dataset}, + this.renderConfigIcon(), + this.renderLoadingIcon(), + this.renderLabel(data), + h.div({className: "p-TabBar-tabLinkIcon"}), + this.renderMaximizeIcon(), + this.renderCloseIcon(data), + h.div({className: "divider"}), + h.div({className: "shadow"}) + ); + } + + public renderMaximizeIcon(): VirtualElement { + const name = "p-TabBar-tabMaximizeIcon"; + return h.div({className: name, id: TabBarActions.Maximize}); + } + + public renderConfigIcon(): VirtualElement { + return h.div({className: "p-TabBar-tabConfigIcon", id: TabBarActions.Config}); + } + + public renderLoadingIcon(): VirtualElement { + return h.div({className: "p-TabBar-tabLoadingIcon"}, h.div({className: "p-TabBar-tabLoadingAnimation"})); + } +} diff --git a/packages/perspective-phosphor/src/ts/utils.ts b/packages/perspective-phosphor/src/ts/utils.ts index ac04dc26a5..4bcb939b8f 100644 --- a/packages/perspective-phosphor/src/ts/utils.ts +++ b/packages/perspective-phosphor/src/ts/utils.ts @@ -1,3 +1,6 @@ +import {PerspectiveWidget, PerspectiveWidgetOptions} from "./widget"; +import {DockLayout} from "@phosphor/widgets"; + /****************************************************************************** * * Copyright (c) 2018, the Perspective Authors. @@ -8,14 +11,24 @@ */ /* defines */ -export -const MIME_TYPE = 'application/psp+json'; +export const MIME_TYPE = "application/psp+json"; + +export const PSP_CLASS = "PSPViewer"; + +export const PSP_CONTAINER_CLASS = "PSPContainer"; -export -const PSP_CLASS = 'PSPViewer'; +export const PSP_CONTAINER_CLASS_DARK = "PSPContainer-dark"; -export -const PSP_CONTAINER_CLASS = 'PSPContainer'; +type WidgetMapFuction = (widget: PerspectiveWidget | PerspectiveWidgetOptions) => PerspectiveWidget | PerspectiveWidgetOptions | void | Promise; -export -const PSP_CONTAINER_CLASS_DARK = 'PSPContainer-dark'; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const mapWidgets = (widgetFunc: WidgetMapFuction, layout: any): any => { + if (layout.main) { + layout.main = mapWidgets(widgetFunc, layout.main); + } else if (layout.children) { + layout.children = layout.children.map((x: DockLayout.ITabAreaConfig | DockLayout.ISplitAreaConfig) => mapWidgets(widgetFunc, x)); + } else if (layout.widgets) { + layout.widgets = layout.widgets.map((x: PerspectiveWidget | PerspectiveWidgetOptions) => widgetFunc(x) || x); + } + return layout; +}; diff --git a/packages/perspective-phosphor/src/ts/widget.ts b/packages/perspective-phosphor/src/ts/widget.ts index 648cc5db88..1dea060bbb 100644 --- a/packages/perspective-phosphor/src/ts/widget.ts +++ b/packages/perspective-phosphor/src/ts/widget.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/camelcase */ /****************************************************************************** * * Copyright (c) 2018, the Perspective Authors. @@ -8,24 +9,27 @@ */ import "@finos/perspective-viewer"; -import "@finos/perspective-viewer-hypergrid"; -import "@finos/perspective-viewer-d3fc"; -import "@finos/perspective-viewer-highcharts"; -import { Message } from '@phosphor/messaging'; -import { Widget } from '@phosphor/widgets'; -import { MIME_TYPE, PSP_CLASS, PSP_CONTAINER_CLASS, PSP_CONTAINER_CLASS_DARK } from './utils'; -import { Table } from '@finos/perspective'; +import {Table, TableData} from "@finos/perspective"; +import {Message} from "@phosphor/messaging"; +import {Widget} from "@phosphor/widgets"; +import {MIME_TYPE, PSP_CLASS, PSP_CONTAINER_CLASS, PSP_CONTAINER_CLASS_DARK} from "./utils"; -import { PerspectiveViewer, PerspectiveViewerOptions } from '@finos/perspective-viewer'; +import {PerspectiveViewer, PerspectiveViewerOptions} from "@finos/perspective-viewer"; let _increment = 0; -export type PerspectiveWidgetOptions = { +export interface PerspectiveWidgetOptions extends PerspectiveViewerOptions { dark?: boolean; + title?: string; bindto?: HTMLElement; -} + plugin_config?: PerspectiveViewerOptions; + // these shouldn't exist, PerspectiveViewerOptions should be sufficient e.g. ["row-pivots"] + column_pivots?: string[]; + row_pivots?: string[]; + computed_columns?: {[column_name: string]: string}[]; +} /** * Class for perspective phosphor widget. @@ -33,12 +37,10 @@ export type PerspectiveWidgetOptions = { * @class PerspectiveWidget (name) * TODO: document */ -export - class PerspectiveWidget extends Widget { - constructor(name: string = 'Perspective', - options: PerspectiveViewerOptions & PerspectiveWidgetOptions = {}) { - super({ node: options.bindto || document.createElement('div') }); - this._viewer = Private.createNode(this.node as HTMLDivElement); +export class PerspectiveWidget extends Widget { + constructor(name = "Perspective", options: PerspectiveWidgetOptions = {}) { + super({node: options.bindto || document.createElement("div")}); + this._viewer = PerspectiveWidget.createNode(this.node as HTMLDivElement); this.title.label = name; this.title.caption = `${name}`; @@ -50,21 +52,21 @@ export /** * Apply user-provided options to the widget. - * + * * @param options */ - _set_attributes(options: PerspectiveViewerOptions & PerspectiveWidgetOptions) { - let plugin: string = options.plugin || "hypergrid"; - let columns: Array = options.columns || []; - let row_pivots: Array = options.row_pivots || []; - let column_pivots: Array = options.column_pivots || []; - let aggregates: { [column_name: string]: string } = options.aggregates || {}; - let sort: Array> = options.sort || []; - let filters: Array> = options.filters || []; - let computed_columns: { [colname: string]: string }[] = options.computed_columns || []; - let plugin_config: any = options.plugin_config || {}; - let dark: boolean = options.dark || false; - let editable: boolean = options.editable || false; + _set_attributes(options: PerspectiveWidgetOptions): void { + const plugin: string = options.plugin || "hypergrid"; + const columns: Array = options.columns || []; + const row_pivots: Array = options.row_pivots || options["row-pivots"] || []; + const column_pivots: Array = options.column_pivots || options["column-pivots"] || []; + const aggregates: {[column_name: string]: string} = options.aggregates || {}; + const sort: Array> = options.sort || []; + const filters: Array> = options.filters || []; + const computed_columns: {[colname: string]: string}[] = options.computed_columns || options["computed-columns"] || []; + const plugin_config: PerspectiveViewerOptions = options.plugin_config || {}; + const dark: boolean = options.dark || false; + const editable: boolean = options.editable || false; this.dark = dark; this.editable = editable; @@ -81,29 +83,13 @@ export // do computed last this.computed_columns = computed_columns; this.filters = filters; - + this._displayed = false; } /**********************/ /* Phosphor Overrides */ /**********************/ - /** - * Phospor: Called when phosphor widget is destroyed - * - */ - dispose(): void { - super.dispose(); - } - - /** - * Phosphor: onAfterAttach to dom - * - */ - onAfterAttach(msg: Message): void { - super.onAfterAttach(msg); - } - /** * Phosphor: after visible @@ -131,22 +117,34 @@ export } notifyResize(): void { - if(this.isAttached && !this.displayed){ + if (this.isAttached && !this.displayed) { this._displayed = true; - } else if (this.isAttached){ + } else if (this.isAttached) { this.viewer.notifyResize(); } } + save(): PerspectiveViewerOptions { + return this.viewer.save(); + } + + restore(config: PerspectiveViewerOptions): Promise { + return this.viewer.restore(config); + } + /** * Load either a `perspective.table` into the viewer. * * @param table a `perspective.table` object. */ - load(table : Table) : void { + load(table: TableData | Table): void { this.viewer.load(table); } - + + get table(): Table { + return this.viewer.table; + } + /****************************************************************************** * * Getters @@ -164,93 +162,95 @@ export /** * Returns the name of the widget. - * + * * @returns {string} the widget name - "Perspective" if not set by the user. */ get name(): string { return this.title.label; } - + /** - * The name of the plugin which visualizes the data in `PerspectiveViewer`. - * - * Defaults to "hypergrid" if not set by the user. + * The name of the plugin which visualizes the data in `PerspectiveViewer`. + * */ - get plugin() { + get plugin(): string { return this.viewer.getAttribute("plugin"); } set plugin(plugin: string) { - this.viewer.setAttribute('plugin', plugin); + this.viewer.setAttribute("plugin", plugin); } /** * The column names that are displayed in the viewer's grid/visualizations. - * - * If a column in the dataset is not in this array, it is not shown but can be used for aggregates, sort, and filter. + * + * If a column in the dataset is not in this array, it is not shown but can + * be used for aggregates, sort, and filter. */ - get columns() { + get columns(): string[] { return JSON.parse(this.viewer.getAttribute("columns")); } - set columns(columns: Array) { + set columns(columns: string[]) { if (columns.length > 0) { - this.viewer.setAttribute('columns', JSON.stringify(columns)); + this.viewer.setAttribute("columns", JSON.stringify(columns)); } else { - this.viewer.removeAttribute('columns'); + this.viewer.removeAttribute("columns"); } } - get row_pivots() { + get row_pivots(): string[] { return JSON.parse(this.viewer.getAttribute("row-pivots")); } - set row_pivots(row_pivots: Array) { - this.viewer.setAttribute('row-pivots', JSON.stringify(row_pivots)); + set row_pivots(row_pivots: string[]) { + this.viewer.setAttribute("row-pivots", JSON.stringify(row_pivots)); } - get column_pivots() { + get column_pivots(): string[] { return JSON.parse(this.viewer.getAttribute("column-pivots")); } - set column_pivots(column_pivots: Array) { - this.viewer.setAttribute('column-pivots', JSON.stringify(column_pivots)); + set column_pivots(column_pivots: string[]) { + this.viewer.setAttribute("column-pivots", JSON.stringify(column_pivots)); } - get aggregates() { + get aggregates(): {[column_name: string]: string} { return JSON.parse(this.viewer.getAttribute("aggregates")); } - set aggregates(aggregates: { [colname: string]: string }) { - this.viewer.setAttribute('aggregates', JSON.stringify(aggregates)); + set aggregates(aggregates: {[colname: string]: string}) { + this.viewer.setAttribute("aggregates", JSON.stringify(aggregates)); } - get sort() { + get sort(): string[][] { return JSON.parse(this.viewer.getAttribute("sort")); } - set sort(sort: Array>) { - this.viewer.setAttribute('sort', JSON.stringify(sort)); + set sort(sort: string[][]) { + this.viewer.setAttribute("sort", JSON.stringify(sort)); } - get computed_columns() { + get computed_columns(): {[column_name: string]: string}[] { return JSON.parse(this.viewer.getAttribute("computed-columns")); } - set computed_columns(computed_columns: { [colname: string]: string }[]) { + set computed_columns(computed_columns: {[column_name: string]: string}[]) { if (computed_columns.length > 0) { - this.viewer.setAttribute('computed-columns', JSON.stringify(computed_columns)); + this.viewer.setAttribute("computed-columns", JSON.stringify(computed_columns)); } else { - this.viewer.removeAttribute('computed-columns'); + this.viewer.removeAttribute("computed-columns"); } } - get filters() { + get filters(): string[][] { return JSON.parse(this.viewer.getAttribute("filters")); } - set filters(filters: Array>) { + set filters(filters: string[][]) { if (filters.length > 0) { - this.viewer.setAttribute('filters', JSON.stringify(filters)); + this.viewer.setAttribute("filters", JSON.stringify(filters)); } else { - this.viewer.removeAttribute('filters'); + this.viewer.removeAttribute("filters"); } } - get plugin_config() { return this._plugin_config; } - set plugin_config(plugin_config: any) { + get plugin_config(): PerspectiveViewerOptions { + return this._plugin_config; + } + set plugin_config(plugin_config: PerspectiveViewerOptions) { this._plugin_config = plugin_config; if (this._plugin_config) { this.viewer.restore(this._plugin_config); @@ -260,9 +260,11 @@ export /** * Enable or disable dark mode by re-rendering the viewer. */ - get dark() { return this._dark; } + get dark(): boolean { + return this._dark; + } set dark(dark: boolean) { - this._dark = dark + this._dark = dark; if (this._dark) { this.node.classList.add(PSP_CONTAINER_CLASS_DARK); this.node.classList.remove(PSP_CONTAINER_CLASS); @@ -270,12 +272,14 @@ export this.node.classList.add(PSP_CONTAINER_CLASS); this.node.classList.remove(PSP_CONTAINER_CLASS_DARK); } - if (this._displayed){ + if (this._displayed) { this.viewer.restyleElement(); } } - get editable() { return this._editable } + get editable(): boolean { + return this._editable; + } set editable(editable: boolean) { this._editable = editable; if (this._editable) { @@ -285,25 +289,20 @@ export } } - get displayed(){ return this._displayed; } - - private _viewer: PerspectiveViewer; - private _plugin_config: any; - private _dark: boolean; - private _editable: boolean; - private _displayed: boolean; -} - + toggleConfig() { + this._viewer.toggleConfig(); + } -namespace Private { - export let _loaded = false; + get displayed(): boolean { + return this._displayed; + } - export function createNode(node: HTMLDivElement): PerspectiveViewer { - node.classList.add('p-Widget'); + static createNode(node: HTMLDivElement): PerspectiveViewer { + node.classList.add("p-Widget"); node.classList.add(PSP_CONTAINER_CLASS); - let viewer = (document.createElement('perspective-viewer') as any) as PerspectiveViewer; + const viewer = document.createElement("perspective-viewer") as PerspectiveViewer; viewer.classList.add(PSP_CLASS); - viewer.setAttribute('type', MIME_TYPE); + viewer.setAttribute("type", MIME_TYPE); while (node.lastChild) { node.removeChild(node.lastChild); @@ -312,24 +311,24 @@ namespace Private { node.appendChild(viewer); // allow perspective's event handlers to do their work - viewer.addEventListener('contextmenu', stop, false); - - function stop(event: MouseEvent) { - event.stopPropagation(); - } + viewer.addEventListener("contextmenu", event => event.stopPropagation(), false); - let div = document.createElement('div'); - div.style.setProperty('display', 'flex'); - div.style.setProperty('flex-direction', 'row'); + const div = document.createElement("div"); + div.style.setProperty("display", "flex"); + div.style.setProperty("flex-direction", "row"); node.appendChild(div); - if (!viewer.notifyResize) { - console.warn('Warning: not bound to real element'); + console.warn("Warning: not bound to real element"); } else { viewer.notifyResize = viewer.notifyResize.bind(viewer); } - return viewer; } -} \ No newline at end of file + + private _viewer: PerspectiveViewer; + private _plugin_config: PerspectiveViewerOptions; + private _dark: boolean; + private _editable: boolean; + private _displayed: boolean; +} diff --git a/packages/perspective-phosphor/src/ts/workspace.ts b/packages/perspective-phosphor/src/ts/workspace.ts new file mode 100644 index 0000000000..45c587ae87 --- /dev/null +++ b/packages/perspective-phosphor/src/ts/workspace.ts @@ -0,0 +1,128 @@ +import {SplitPanel, DockLayout} from "@phosphor/widgets"; +import {PerspectiveDockPanel, ContextMenuArgs} from "./dockpanel"; +import {PerspectiveWidget} from "./widget"; +import {mapWidgets} from "./utils"; +import {uniqBy} from "lodash"; +import {Menu} from "@phosphor/widgets"; +import {createCommands} from "./contextmenu"; +import {CommandRegistry} from "@phosphor/commands"; +import PerspectiveViewer from "@finos/perspective-viewer"; + +export interface PerspectiveWorkspaceOptions { + node?: HTMLElement; +} + +export class PerspectiveWorkspace extends SplitPanel { + private dockpanel: PerspectiveDockPanel; + private masterpanel: SplitPanel; + private commands: CommandRegistry; + + constructor({}: PerspectiveWorkspaceOptions = {}) { + super({orientation: "horizontal"}); + this.dockpanel = new PerspectiveDockPanel("main", {enableContextMenu: false}); + this.masterpanel = new SplitPanel({orientation: "vertical"}); + this.masterpanel.addClass("p-Master"); + this.addWidget(this.dockpanel); + this.commands = this.createCommands(); + this.dockpanel.onContextMenu.connect(this.showContextMenu.bind(this)); + } + + addViewer(widget: PerspectiveWidget, options: DockLayout.IAddOptions): void { + this.dockpanel.addWidget(widget, options); + } + + private createContextMenu(widget: any): Menu { + const contextMenu = new Menu({commands: this.commands}); + + if (widget.parent === this.dockpanel) { + contextMenu.addItem({command: "perspective:duplicate", args: {widget}}); + } + contextMenu.addItem({command: "workspace:master", args: {widget}}); + + contextMenu.addItem({command: "perspective:export", args: {widget}}); + contextMenu.addItem({command: "perspective:copy", args: {widget}}); + contextMenu.addItem({command: "perspective:reset", args: {widget}}); + return contextMenu; + } + + private showContextMenu(sender: PerspectiveDockPanel, args: ContextMenuArgs): void { + const {widget, event} = args; + const menu = this.createContextMenu(widget); + menu.open(event.clientX, event.clientY); + event.preventDefault(); + event.stopPropagation(); + } + + private filterWidget(candidates: Set, filters: string[][]): void { + mapWidgets(async (widget: PerspectiveWidget): Promise => { + const config = widget.save(); + const availableColumns = Object.keys(await (widget.table as any).schema()); + const currentFilters = config.filters || []; + const columnAvailable = (filter: string[]): boolean => filter[0] && availableColumns.includes(filter[0]); + const validFilters = filters.filter(columnAvailable); + + validFilters.push(...currentFilters.filter(x => !candidates.has(x[0]))); + const newFilters = uniqBy(validFilters, (item: string[]) => item[0]); + widget.restore({filters: newFilters}); + }, this.dockpanel.saveLayout()); + } + + private onPerspectiveClick = (event: CustomEvent): void => { + const config = (event.target as PerspectiveViewer).save(); + const candidates = new Set([...(config["row-pivots"] || []), ...(config["column-pivots"] || []), ...(config.filters || []).map(x => x[0])]); + const filters = [...event.detail.config.filters]; + this.filterWidget(candidates, filters); + }; + + private makeMaster(widget: PerspectiveWidget): void { + widget.close(); + widget.dark = true; + + if (this.masterpanel.widgets.length === 0) { + this.dockpanel.close(); + this.addWidget(this.masterpanel); + this.addWidget(this.dockpanel); + this.setRelativeSizes([1, 3]); + } + + this.masterpanel.addWidget(widget); + widget.viewer.restyleElement(); + + widget.node.addEventListener("perspective-click", this.onPerspectiveClick); + } + + private makeDetail(widget: PerspectiveWidget): void { + widget.close(); + widget.dark = false; + + this.dockpanel.addWidget(widget, {mode: "split-right"}); + + if (this.masterpanel.widgets.length === 0) { + this.dockpanel.close(); + this.masterpanel.close(); + this.addWidget(this.dockpanel); + } + + widget.viewer.restyleElement(); + widget.node.removeEventListener("perspective-click", this.onPerspectiveClick); + } + + private toggleMasterDetail(widget: PerspectiveWidget): void { + if (widget.parent === this.dockpanel) { + this.makeMaster(widget); + } else { + this.makeDetail(widget); + } + } + + private createCommands(): CommandRegistry { + const commands = createCommands(this.dockpanel) as CommandRegistry; + commands.addCommand("workspace:master", { + execute: args => this.toggleMasterDetail((args as any).widget), + iconClass: args => ((args as any).widget.parent === this.dockpanel ? "p-MenuItem-master" : "p-MenuItem-detail"), + label: args => ((args as any).widget.parent === this.dockpanel ? "Master" : "Detail"), + mnemonic: 0 + }); + return commands; + } +} diff --git a/packages/perspective-phosphor/test/js/dockpanel.spec.js b/packages/perspective-phosphor/test/js/dockpanel.spec.js new file mode 100644 index 0000000000..3683a99c30 --- /dev/null +++ b/packages/perspective-phosphor/test/js/dockpanel.spec.js @@ -0,0 +1,43 @@ +import {PerspectiveDockPanel} from "../../dist/esm/dockpanel"; +import {PerspectiveWidget} from "../../dist/esm/widget"; +import {mapWidgets} from "../../dist/esm/utils"; + +describe("dockpanel", () => { + test("serialise returns a correct widget state", () => { + const dockpanel = new PerspectiveDockPanel("name"); + + // eslint-disable-next-line @typescript-eslint/camelcase + const widget = new PerspectiveWidget("One", {plugin_config: {columns: ["A"]}}); + dockpanel.addWidget(widget); + + const expectedConfig = { + main: { + type: "tab-area", + widgets: [{columns: ["A"]}], + currentIndex: 0 + } + }; + expect(dockpanel.serialize()).toStrictEqual(expectedConfig); + }); + + test("deserialise restore correct dockpanel state", () => { + const dockpanel = new PerspectiveDockPanel("name"); + const config = { + main: { + type: "tab-area", + widgets: [{columns: ["A"]}], + currentIndex: 0 + } + }; + + dockpanel.deserialize(config); + + const widgets = []; + mapWidgets(widget => { + widgets.push(widget); + }, dockpanel.saveLayout()); + + expect(widgets.length).toBe(1); + expect(widgets[0].viewer.getAttribute("columns")).toBe(JSON.stringify(["A"])); + }); +}); diff --git a/packages/perspective-phosphor/test/js/workspace.spec.js b/packages/perspective-phosphor/test/js/workspace.spec.js new file mode 100644 index 0000000000..339b4ed184 --- /dev/null +++ b/packages/perspective-phosphor/test/js/workspace.spec.js @@ -0,0 +1,145 @@ +/* eslint-disable @typescript-eslint/camelcase */ +import {PerspectiveWorkspace} from "../../dist/esm/workspace"; +import {toArray} from "@phosphor/algorithm"; +import {PerspectiveWidget} from "../../dist/esm/widget"; + +describe("workspace", () => { + test("addViewer adds widget to underlying dockpanel", () => { + const workspace = new PerspectiveWorkspace(); + const widget = new PerspectiveWidget("One", {plugin_config: {columns: ["A"]}}); + workspace.addViewer(widget); + + const widgets = toArray(workspace.dockpanel.widgets()); + + expect(widgets.length).toBe(1); + expect(widgets[0]).toBe(widget); + }); + + test("makeMaster moves widget from dock to split panel", () => { + const workspace = new PerspectiveWorkspace(); + const widget = new PerspectiveWidget("One", {plugin_config: {columns: ["A"]}}); + workspace.addViewer(widget); + + let widgets = toArray(workspace.dockpanel.widgets()); + expect(widgets.length).toBe(1); + expect(widgets[0]).toBe(widget); + expect(widgets[0].dark).toBeFalsy(); + + workspace.makeMaster(widget); + + widgets = toArray(workspace.dockpanel.widgets()); + expect(widgets.length).toBe(0); + + widgets = workspace.masterpanel.widgets; + expect(widgets.length).toBe(1); + expect(widgets[0]).toBe(widget); + expect(widgets[0].dark).toBeTruthy(); + }); + + test("makeDetail moves widget from split to dock panel", () => { + const workspace = new PerspectiveWorkspace(); + const widget = new PerspectiveWidget("One", {plugin_config: {columns: ["A"]}}); + workspace.addViewer(widget); + + let widgets = toArray(workspace.dockpanel.widgets()); + expect(widgets.length).toBe(1); + expect(widgets[0]).toBe(widget); + + workspace.makeMaster(widget); + + widgets = toArray(workspace.dockpanel.widgets()); + expect(widgets.length).toBe(0); + + widgets = workspace.masterpanel.widgets; + expect(widgets.length).toBe(1); + expect(widgets[0]).toBe(widget); + + workspace.makeDetail(widget); + expect(workspace.masterpanel.widgets.length).toBe(0); + + widgets = toArray(workspace.dockpanel.widgets()); + expect(widgets.length).toBe(1); + expect(widgets[0]).toBe(widget); + expect(widgets[0].dark).toBeFalsy(); + }); + + test("`perspective-click` event handlers are registered on masterpanel widgets", () => { + const workspace = new PerspectiveWorkspace(); + const widget = new PerspectiveWidget("One", {plugin_config: {columns: ["A"]}}); + workspace.addViewer(widget); + + workspace.onPerspectiveClick = jest.fn(); + + widget.node.dispatchEvent(new CustomEvent("perspective-click")); + expect(workspace.onPerspectiveClick).not.toHaveBeenCalled(); + + workspace.makeMaster(widget); + widget.node.dispatchEvent(new CustomEvent("perspective-click")); + expect(workspace.onPerspectiveClick).toHaveBeenCalledTimes(1); + }); + + test("`perspective-click` event handlers are unregistered when widget is moved to detailpanel", () => { + const workspace = new PerspectiveWorkspace(); + const widget = new PerspectiveWidget("One", {plugin_config: {columns: ["A"]}}); + workspace.addViewer(widget); + + workspace.onPerspectiveClick = jest.fn(); + + widget.node.dispatchEvent(new CustomEvent("perspective-click")); + expect(workspace.onPerspectiveClick).not.toHaveBeenCalled(); + + workspace.makeMaster(widget); + widget.node.dispatchEvent(new CustomEvent("perspective-click")); + expect(workspace.onPerspectiveClick).toHaveBeenCalledTimes(1); + + workspace.makeDetail(widget); + widget.node.dispatchEvent(new CustomEvent("perspective-click")); + expect(workspace.onPerspectiveClick).toHaveBeenCalledTimes(1); + }); + + test("`perspective-click` events from master panel filter detail views when columns match", done => { + const workspace = new PerspectiveWorkspace(); + const detailWidget = new PerspectiveWidget("One", {plugin_config: {columns: ["A"]}}); + const masterWidget = new PerspectiveWidget("One", {plugin_config: {columns: ["A", "B"]}}); + + const mockTable = jest.fn(); + mockTable.schema = () => new Promise(resolve => resolve({A: "string"})); + + detailWidget.viewer.table = mockTable; + + workspace.addViewer(detailWidget); + workspace.addViewer(masterWidget); + + workspace.makeMaster(masterWidget); + const config = {filters: [["A", "===", "testValue"]]}; + masterWidget.node.dispatchEvent(new CustomEvent("perspective-click", {detail: {config}})); + + setTimeout(() => { + expect(detailWidget.save().filters).toEqual(config.filters); + done(); + }, 0); + }); + + test("`perspective-click` events from master panel do NOT filter detail views when columns do NOT match", done => { + const workspace = new PerspectiveWorkspace(); + const detailWidget = new PerspectiveWidget("One", {plugin_config: {columns: ["A"]}}); + const masterWidget = new PerspectiveWidget("One", {plugin_config: {columns: ["A", "B"]}}); + + const mockTable = jest.fn(); + mockTable.schema = () => new Promise(resolve => resolve({A: "string"})); + + detailWidget.viewer.table = mockTable; + + workspace.addViewer(detailWidget); + workspace.addViewer(masterWidget); + + workspace.makeMaster(masterWidget); + const config = {filters: [["B", "===", "testValue"]]}; + masterWidget.node.dispatchEvent(new CustomEvent("perspective-click", {detail: {config}})); + + setTimeout(() => { + expect(detailWidget.save().filters).toEqual([]); + done(); + }, 0); + }); +}); diff --git a/packages/perspective-phosphor/test/setup-jest.js b/packages/perspective-phosphor/test/setup-jest.js new file mode 100644 index 0000000000..fdf12d4c94 --- /dev/null +++ b/packages/perspective-phosphor/test/setup-jest.js @@ -0,0 +1,2 @@ +import "mutationobserver-shim"; +import "document-register-element"; diff --git a/packages/perspective-viewer/index.d.ts b/packages/perspective-viewer/index.d.ts index 4e7b29b488..babe4df268 100644 --- a/packages/perspective-viewer/index.d.ts +++ b/packages/perspective-viewer/index.d.ts @@ -9,17 +9,23 @@ declare module '@finos/perspective-viewer' { delete(): Promise; flush(): Promise; toggleConfig(): void; - save(): any; + save(): PerspectiveViewerOptions; + reset(): void; restore(x: any): Promise; restyleElement(): void; + readonly table?: Table; } - export interface PerspectiveViewerOptions extends ViewConfig { + export interface PerspectiveViewerOptions extends Omit { + aggregates?: { [column_name:string]: string}; editable? : boolean; plugin? : string; - plugin_config?: any; - filters? : Array>; - computed_columns? : { [column_name:string]: string}[]; + columns? : string[]; + "computed-columns"? : { [column_name:string]: string}[]; + "row-pivots"? : string[]; + "column-pivots"? : string[]; + filters?: Array>; + sort?: string[][]; } diff --git a/packages/perspective-viewer/src/js/row.js b/packages/perspective-viewer/src/js/row.js index 36a47a090e..152910ba53 100644 --- a/packages/perspective-viewer/src/js/row.js +++ b/packages/perspective-viewer/src/js/row.js @@ -31,7 +31,7 @@ function get_text_width(text, max = 0) { // FIXME get these values form the stylesheet SPAN.innerHTML = text; document.body.appendChild(SPAN); - let width = `${Math.max(max, SPAN.offsetWidth) + 20}px`; + const width = `${Math.max(max, SPAN.offsetWidth) + 20}px`; document.body.removeChild(SPAN); return width; } @@ -41,7 +41,7 @@ function get_text_width(text, max = 0) { @bindTemplate(template, {toString: () => style + "\n" + awesomplete_style}) // eslint-disable-next-line no-unused-vars class Row extends HTMLElement { set name(n) { - let elem = this.shadowRoot.querySelector("#name"); + const elem = this.shadowRoot.querySelector("#name"); elem.innerHTML = this.getAttribute("name"); } @@ -59,16 +59,16 @@ class Row extends HTMLElement { } set type(t) { - let elem = this.shadowRoot.querySelector("#name"); - let type = this.getAttribute("type"); + const elem = this.shadowRoot.querySelector("#name"); + const type = this.getAttribute("type"); if (!type) return; - let type_config = get_type_config(type); + const type_config = get_type_config(type); if (type_config.type) { elem.classList.add(type_config.type); } elem.classList.add(type); - let agg_dropdown = this.shadowRoot.querySelector("#column_aggregate"); - let filter_dropdown = this.shadowRoot.querySelector("#filter_operator"); + const agg_dropdown = this.shadowRoot.querySelector("#column_aggregate"); + const filter_dropdown = this.shadowRoot.querySelector("#filter_operator"); render(this._select_template("TYPE_AGGREGATES", type_config.type || type), agg_dropdown); render(this._select_template("TYPE_FILTERS", type_config.type || type), filter_dropdown); @@ -82,14 +82,14 @@ class Row extends HTMLElement { this.filter = this.getAttribute("filter"); } - let filter_operand = this.shadowRoot.querySelector("#filter_operand"); + const filter_operand = this.shadowRoot.querySelector("#filter_operand"); this._callback = event => this._update_filter(event); filter_operand.addEventListener("keyup", this._callback.bind(this)); } choices(choices) { - let filter_operand = this.shadowRoot.querySelector("#filter_operand"); - let filter_operator = this.shadowRoot.querySelector("#filter_operator"); + const filter_operand = this.shadowRoot.querySelector("#filter_operand"); + const filter_operator = this.shadowRoot.querySelector("#filter_operator"); const selector = new Awesomplete(filter_operand, { label: this.getAttribute("name"), list: choices, @@ -102,7 +102,7 @@ class Row extends HTMLElement { return Awesomplete.ITEM(text, input.match(/[^,]*$/)[0]); }, replace: function(text) { - let before = this.input.value.match(/^.+,\s*|/)[0]; + const before = this.input.value.match(/^.+,\s*|/)[0]; if (filter_operator.value === "in" || filter_operator.value === "not in") { this.input.value = before + text + ", "; } else { @@ -143,10 +143,10 @@ class Row extends HTMLElement { } set aggregate(a) { - let agg_dropdown = this.shadowRoot.querySelector("#column_aggregate"); - let aggregate = this.getAttribute("aggregate"); + const agg_dropdown = this.shadowRoot.querySelector("#column_aggregate"); + const aggregate = this.getAttribute("aggregate"); if (agg_dropdown.value !== aggregate && this.hasAttribute("type")) { - let type = this.getAttribute("type"); + const type = this.getAttribute("type"); agg_dropdown.value = aggregate || get_type_config(type).aggregate; } } @@ -171,10 +171,10 @@ class Row extends HTMLElement { } _update_filter(event) { - let filter_operand = this.shadowRoot.querySelector("#filter_operand"); - let filter_operator = this.shadowRoot.querySelector("#filter_operator"); + const filter_operand = this.shadowRoot.querySelector("#filter_operand"); + const filter_operator = this.shadowRoot.querySelector("#filter_operator"); let val = filter_operand.value; - let type = this.getAttribute("type"); + const type = this.getAttribute("type"); switch (type) { case "float": val = parseFloat(val); @@ -197,7 +197,7 @@ class Row extends HTMLElement { _set_data_transfer(event) { if (this.hasAttribute("filter")) { - let {operator, operand} = JSON.parse(this.getAttribute("filter")); + const {operator, operand} = JSON.parse(this.getAttribute("filter")); event.dataTransfer.setData("text", JSON.stringify([this.getAttribute("name"), operator, operand, this.getAttribute("type"), this.getAttribute("aggregate")])); } else { event.dataTransfer.setData( diff --git a/packages/perspective-viewer/src/themes/material.less b/packages/perspective-viewer/src/themes/material.less index 4c7896b844..89a8996575 100644 --- a/packages/perspective-viewer/src/themes/material.less +++ b/packages/perspective-viewer/src/themes/material.less @@ -86,6 +86,8 @@ perspective-viewer { --hypergrid-scrollbar--width: 8px; --hypergrid-scrollbar--border-radius: 5px; + --hypergrid--background: #fff; + --hypergrid-positive--color: #1078d1; --hypergrid-negative--color: #de3838; diff --git a/packages/perspective-viewer/src/themes/vaporwave.less b/packages/perspective-viewer/src/themes/vaporwave.less index 08adbcccd6..f34ce3aa39 100644 --- a/packages/perspective-viewer/src/themes/vaporwave.less +++ b/packages/perspective-viewer/src/themes/vaporwave.less @@ -49,11 +49,11 @@ perspective-viewer { --float--hypergrid--background: hsl(256, 87%, 14%); --float--hypergrid--color: rgb(60,51,94); --float--hypergrid-positive--color: white; - --float--hypergrid-positive--background: rgb(32, 222, 139); + --float--hypergrid-positive--background: rgb(54, 205, 196); --float--hypergrid-negative--color: white; --float--hypergrid-negative--background: rgb(255, 22, 144); - --float--hypergrid-positive--border-bottom-color: rgb(28, 190, 120); - --float--hypergrid-positive--border-right-color: rgb(28, 190, 120); + --float--hypergrid-positive--border-bottom-color: rgb(36, 146, 139); + --float--hypergrid-positive--border-right-color: rgb(36, 146, 139); --float--hypergrid-negative--border-bottom-color: rgb(219, 18, 122); --float--hypergrid-negative--border-right-color: rgb(219, 18, 122); diff --git a/packages/perspective/index.d.ts b/packages/perspective/index.d.ts index 036a09bb07..270e5ba24d 100644 --- a/packages/perspective/index.d.ts +++ b/packages/perspective/index.d.ts @@ -1,5 +1,3 @@ -import { PerspectiveEvents } from "@finos/perspective"; - declare module '@finos/perspective' { /**** object types ****/ export enum TypeNames { diff --git a/packages/perspective/package.json b/packages/perspective/package.json index 0f364f2852..8a1d0fb75c 100644 --- a/packages/perspective/package.json +++ b/packages/perspective/package.json @@ -65,7 +65,7 @@ "ws": "^6.1.2" }, "optionalDependencies": { - "bufferutil": "~3.0.0" + "bufferutil": "~4.0.1" }, "devDependencies": { "@finos/perspective-webpack-plugin": "^0.3.8" diff --git a/scripts/setup.js b/scripts/setup.js index 4147ece62f..f417c2cc7a 100644 --- a/scripts/setup.js +++ b/scripts/setup.js @@ -101,6 +101,16 @@ async function focus_package() { key: "c", name: "perspective-viewer-highcharts", value: "perspective-viewer-highcharts" + }, + { + key: "o", + name: "perspective-phosphor", + value: "perspective-phosphor" + }, + { + key: "l", + name: "perspective-jupyterlab", + value: "perspective-jupyterlab" } ] } diff --git a/yarn.lock b/yarn.lock index b687f46a8e..0b35379f43 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1322,6 +1322,14 @@ resolved "https://registry.yarnpkg.com/@phosphor/coreutils/-/coreutils-1.3.1.tgz#441e34f42340f7faa742a88b2a181947a88d7226" integrity sha512-9OHCn8LYRcPU/sbHm5v7viCA16Uev3gbdkwqoQqlV+EiauDHl70jmeL7XVDXdigl66Dz0LI11C99XOxp+s3zOA== +"@phosphor/default-theme@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@phosphor/default-theme/-/default-theme-0.1.0.tgz#abc54e0768d3f6e14e3d5cd80735becb489afc02" + integrity sha512-XVjYHQUH4e1JxAnMebtoutx/DRlAjgeh6JRb8jRGEWgFDAEHdvTXJEtARdR1SnNIDMCaho4t3nXHFhtcFh4JKg== + dependencies: + "@phosphor/dragdrop" "^1.3.0" + "@phosphor/widgets" "^1.6.0" + "@phosphor/disposable@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@phosphor/disposable/-/disposable-1.1.2.tgz#a192dd6a2e6c69d5d09d39ecf334dab93778060e" @@ -1516,11 +1524,30 @@ resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-1.0.10.tgz#dcfb0ddfcdfb1ad26aea4351323771e1aea96e84" integrity sha1-3PsN3837GtJq6kNRMjdx4a6pboQ= +"@types/eslint-visitor-keys@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" + integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== + +"@types/events@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== + "@types/flatbuffers@^1.9.0": version "1.9.1" resolved "https://registry.yarnpkg.com/@types/flatbuffers/-/flatbuffers-1.9.1.tgz#1910bebfc15c8f67a287fae07bfc061f94e9d291" integrity sha512-TC3X0Nkj5wgvuY217VkodBtjbD3Yr0JNApDY1GW9IU5Mzm5ie1IJErqe4vRm+wy08IRz3bemaDATrdEw1CJlVQ== +"@types/glob@^7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" + integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== + dependencies: + "@types/events" "*" + "@types/minimatch" "*" + "@types/node" "*" + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" @@ -1541,11 +1568,23 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" +"@types/jest-diff@*": + version "20.0.1" + resolved "https://registry.yarnpkg.com/@types/jest-diff/-/jest-diff-20.0.1.tgz#35cc15b9c4f30a18ef21852e255fdb02f6d59b89" + integrity sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA== + "@types/jest@^23.3.9": version "23.3.14" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.3.14.tgz#37daaf78069e7948520474c87b80092ea912520a" integrity sha512-Q5hTcfdudEL2yOmluA1zaSyPbzWPmJ3XfSWeP3RyoYvS9hnje1ZyagrZOuQ6+1nQC1Gw+7gap3pLNL3xL6UBug== +"@types/jest@^24.0.19": + version "24.0.19" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.19.tgz#f7036058d2a5844fe922609187c0ad8be430aff5" + integrity sha512-YYiqfSjocv7lk5H/T+v5MjATYjaTMsUkbDnjGqSMoO88jWdtJXJV4ST/7DKZcoMHMBvB2SeSfyOzZfkxXHR5xg== + dependencies: + "@types/jest-diff" "*" + "@types/jquery@*": version "3.3.29" resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.3.29.tgz#680a2219ce3c9250483722fccf5570d1e2d08abd" @@ -1553,11 +1592,33 @@ dependencies: "@types/sizzle" "*" +"@types/json-schema@^7.0.3": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" + integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A== + +"@types/lodash.uniqby@^4.7.6": + version "4.7.6" + resolved "https://registry.yarnpkg.com/@types/lodash.uniqby/-/lodash.uniqby-4.7.6.tgz#672827a701403f07904fe37f0721ae92abfa80e8" + integrity sha512-9wBhrm1y6asW50Joj6tsySCNUgzK2tCqL7vtKIej0E9RyeBFdcte7fxUosmFuMoOU0eHqOMK76kCCrK99jxHgg== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": + version "4.14.144" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.144.tgz#12e57fc99064bce45e5ab3c8bc4783feb75eab8e" + integrity sha512-ogI4g9W5qIQQUhXAclq6zhqgqNUr7UlFaqDHbch7WLSLeeM/7d3CRaw7GLajxvyFvhJqw4Rpcz5bhoaYtIx6Tg== + "@types/lodash@^4.14.134": version "4.14.136" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.136.tgz#413e85089046b865d960c9ff1d400e04c31ab60f" integrity sha512-0GJhzBdvsW2RUccNHOBkabI8HZVdOXmXbXhuKlDEd5Vv12P7oAVGfomGp3Ne21o5D/qu1WmthlNKFaoZJJeErA== +"@types/minimatch@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" + integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== + "@types/node@*": version "12.0.2" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.2.tgz#3452a24edf9fea138b48fad4a0a028a683da1e40" @@ -1603,6 +1664,47 @@ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-12.0.12.tgz#45dd1d0638e8c8f153e87d296907659296873916" integrity sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw== +"@typescript-eslint/eslint-plugin@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.4.0.tgz#aaf6b542ff75b78f4191a8bf1c519184817caa24" + integrity sha512-se/YCk7PUoyMwSm/u3Ii9E+BgDUc736uw/lXCDpXEqRgPGsoBTtS8Mntue/vZX8EGyzGplYuePBuVyhZDM9EpQ== + dependencies: + "@typescript-eslint/experimental-utils" "2.4.0" + eslint-utils "^1.4.2" + functional-red-black-tree "^1.0.1" + regexpp "^2.0.1" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.4.0.tgz#dd8f3f466be25c3610a06fed22cfb6e6aa17f6d9" + integrity sha512-2cvhNaJoWavgTtnC7e1jUSPZQ7e4U2X9Yoy5sQmkS7lTESuyuZrlRcaoNuFfYEd6hgrmMU7+QoSp8Ad+kT1nfA== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/typescript-estree" "2.4.0" + eslint-scope "^5.0.0" + +"@typescript-eslint/parser@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.4.0.tgz#fe43ed5fec14af03d3594fce2c3b7ec4c8df0243" + integrity sha512-IouAKi/grJ4MFrwdXIJ1GHAwbPWYgkT3b/x8Q49F378c9nwgxVkO76e0rZeUVpwHMaUuoKG2sUeK0XGkwdlwkw== + dependencies: + "@types/eslint-visitor-keys" "^1.0.0" + "@typescript-eslint/experimental-utils" "2.4.0" + "@typescript-eslint/typescript-estree" "2.4.0" + eslint-visitor-keys "^1.1.0" + +"@typescript-eslint/typescript-estree@2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.4.0.tgz#722c95493e1b7682893edaaaec0e69f36917feef" + integrity sha512-/DzDAtMqF5d9IlXrrvu/Id/uoKjnSxf/3FbtKK679a/T7lbDM8qQuirtGvFy6Uh+x0hALuCMwnMfUf0P24/+Iw== + dependencies: + chokidar "^3.0.2" + glob "^7.1.4" + is-glob "^4.0.1" + lodash.unescape "4.0.1" + semver "^6.3.0" + "@webassemblyjs/ast@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" @@ -1822,12 +1924,10 @@ acorn-globals@^4.1.0: acorn "^6.0.1" acorn-walk "^6.0.1" -acorn-jsx@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" - integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s= - dependencies: - acorn "^3.0.4" +acorn-jsx@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" + integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== acorn-walk@^6.0.1: version "6.1.1" @@ -1839,17 +1939,12 @@ acorn@^2.3.0, acorn@^2.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7" integrity sha1-q259nYhqrKiwhbwzEreaGYQz8Oc= -acorn@^3.0.4: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= - acorn@^4.0.3: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= -acorn@^5.0.0, acorn@^5.5.0, acorn@^5.5.3: +acorn@^5.0.0, acorn@^5.5.3: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== @@ -1859,6 +1954,11 @@ acorn@^6.0.1, acorn@^6.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== +acorn@^6.0.7: + version "6.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.3.0.tgz#0087509119ffa4fc0a0041d1e93a417e68cb856e" + integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA== + acorn@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.2.0.tgz#67f0da2fc339d6cfb5d6fb244fd449f33cd8bbe3" @@ -1884,17 +1984,17 @@ ajv-errors@^1.0.0: resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== -ajv-keywords@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" - integrity sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I= - ajv-keywords@^3.1.0: version "3.4.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz#4b831e7b531415a7cc518cd404e73f6193c6349d" integrity sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw== -ajv@^5.0.0, ajv@^5.2.3, ajv@^5.3.0: +ajv-keywords@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" + integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== + +ajv@^5.0.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= @@ -1914,6 +2014,16 @@ ajv@^6.1.0, ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^6.10.2, ajv@^6.9.1: + version "6.10.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" + integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" @@ -1940,7 +2050,7 @@ ansi-escape-sequences@^4.0.0: dependencies: array-back "^3.0.1" -ansi-escapes@^3.0.0: +ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== @@ -2012,6 +2122,14 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + app-path@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/app-path/-/app-path-3.2.0.tgz#06d426e0c988885264e0aa0a766dfa2723491633" @@ -2268,6 +2386,13 @@ async@^2.1.2, async@^2.4.1, async@^2.5.0: dependencies: lodash "^4.17.11" +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -2327,7 +2452,7 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== -babel-code-frame@6.26.0, babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: +babel-code-frame@6.26.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= @@ -2600,6 +2725,11 @@ binary-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== +binary-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" + integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== + bindings@~1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.1.tgz#21fc7c6d67c18516ec5aaa2815b145ff77b26ea5" @@ -2699,7 +2829,7 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.1: +braces@^3.0.1, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -2882,6 +3012,13 @@ bufferutil@~3.0.0: nan "~2.10.0" prebuild-install "~4.0.0" +bufferutil@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.1.tgz#3a177e8e5819a1243fe16b63a199951a7ad8d4a7" + integrity sha512-xowrxvpxojqkagPcWRQVXZl0YXhRhAtBEIq3VoER1NH5Mw1n1o0ojdspp+GS2J//2gCVyrzQDApQ4unGF+QOoA== + dependencies: + node-gyp-build "~3.7.0" + builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" @@ -2969,18 +3106,6 @@ call-me-maybe@^1.0.1: resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= - dependencies: - callsites "^0.2.0" - -callsites@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= - callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -3104,7 +3229,7 @@ chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2: +chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3180,6 +3305,40 @@ chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.4: optionalDependencies: fsevents "^1.2.7" +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chokidar@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.2.2.tgz#a433973350021e09f2b853a2287781022c0dc935" + integrity sha512-bw3pm7kZ2Wa6+jQWYP/c7bAZy3i4GwiIiMO2EeRjrE48l8vBqC/WvFhSF0xyM8fQiPEGvwMY/5bqDG7sSEOuhg== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.2.0" + optionalDependencies: + fsevents "~2.1.1" + chownr@^1.0.1, chownr@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" @@ -3215,11 +3374,6 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -circular-json@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== - clap@^1.0.9: version "1.2.3" resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" @@ -3623,7 +3777,7 @@ compressible@~2.0.16: dependencies: mime-db ">= 1.40.0 < 2" -compression@^1.5.2: +compression@^1.5.2, compression@^1.7.4: version "1.7.4" resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== @@ -3641,7 +3795,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.4.10, concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^1.5.2, concat-stream@^1.6.0: +concat-stream@^1.4.10, concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^1.5.2: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -3666,7 +3820,7 @@ config-master@^3.1.0: dependencies: walk-back "^2.0.1" -connect-history-api-fallback@^1.3.0: +connect-history-api-fallback@^1.3.0, connect-history-api-fallback@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== @@ -4019,7 +4173,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" -cross-spawn@5.1.0, cross-spawn@^5.0.1, cross-spawn@^5.1.0: +cross-spawn@5.1.0, cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= @@ -4112,6 +4266,16 @@ css-select-base-adapter@^0.1.1: resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== +css-select@^1.1.0, css-select@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + css-select@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.0.2.tgz#ab4386cec9e1f668855564b17c3733b43b2a5ede" @@ -4122,16 +4286,6 @@ css-select@^2.0.0: domutils "^1.7.0" nth-check "^1.0.2" -css-select@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" - integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= - dependencies: - boolbase "~1.0.0" - css-what "2.1" - domutils "1.5.1" - nth-check "~1.0.1" - css-selector-tokenizer@^0.7.0: version "0.7.1" resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz#a177271a8bca5019172f4f891fc6eed9cbf68d5d" @@ -4658,14 +4812,14 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.6, debug@^2.6. dependencies: ms "2.0.0" -debug@^3.1.0, debug@^3.2.5, debug@^3.2.6: +debug@^3.1.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== dependencies: ms "^2.1.1" -debug@^4.1.0, debug@^4.1.1: +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -4790,6 +4944,14 @@ default-gateway@^2.6.0: execa "^0.10.0" ip-regex "^2.1.0" +default-gateway@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + defaults@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" @@ -4843,6 +5005,19 @@ del@^3.0.0: pify "^3.0.0" rimraf "^2.2.8" +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + dependencies: + "@types/glob" "^7.1.1" + globby "^6.1.0" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -4984,13 +5159,20 @@ dns-txt@^2.0.2: dependencies: buffer-indexof "^1.0.0" -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" +document-register-element@^1.14.3: + version "1.14.3" + resolved "https://registry.yarnpkg.com/document-register-element/-/document-register-element-1.14.3.tgz#3335d4578df6a1536a34595b91cca36dd5db61d7" + integrity sha512-SbJTzoQXLTcYxnpdDNRZXu/gwsGSShemXpvj6Pa6ujRwJFpJ41siil4tk4y+cQXnqylS6mc2Rtxp/PkMzfkqyQ== + dependencies: + lightercollective "^0.3.0" + docusaurus@^1.8.0: version "1.10.0" resolved "https://registry.yarnpkg.com/docusaurus/-/docusaurus-1.10.0.tgz#f32f8a3a7f2c3da38e48ccbc7a0fb148311e413d" @@ -5044,6 +5226,13 @@ docusaurus@^1.8.0: tree-node-cli "^1.2.5" truncate-html "^1.0.1" +dom-converter@^0.2: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + dom-serializer@0, dom-serializer@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" @@ -5249,6 +5438,15 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" +enhanced-resolve@4.1.0, enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" + enhanced-resolve@^3.4.0: version "3.4.1" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" @@ -5259,15 +5457,6 @@ enhanced-resolve@^3.4.0: object-assign "^4.0.1" tapable "^0.2.7" -enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" - integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.4.0" - tapable "^1.0.0" - entities@^1.1.1, entities@~1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" @@ -5438,78 +5627,89 @@ eslint-scope@3.7.1: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-scope@^3.7.1: - version "3.7.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535" - integrity sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA== +eslint-scope@^4.0.0, eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-scope@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== +eslint-scope@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" + integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-utils@^1.3.1, eslint-utils@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab" + integrity sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q== + dependencies: + eslint-visitor-keys "^1.0.0" + eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== -eslint@^4.19.1: - version "4.19.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" - integrity sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ== +eslint-visitor-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + +eslint@^5.16.0: + version "5.16.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" + integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== dependencies: - ajv "^5.3.0" - babel-code-frame "^6.22.0" + "@babel/code-frame" "^7.0.0" + ajv "^6.9.1" chalk "^2.1.0" - concat-stream "^1.6.0" - cross-spawn "^5.1.0" - debug "^3.1.0" - doctrine "^2.1.0" - eslint-scope "^3.7.1" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^4.0.3" + eslint-utils "^1.3.1" eslint-visitor-keys "^1.0.0" - espree "^3.5.4" - esquery "^1.0.0" + espree "^5.0.1" + esquery "^1.0.1" esutils "^2.0.2" - file-entry-cache "^2.0.0" + file-entry-cache "^5.0.1" functional-red-black-tree "^1.0.1" glob "^7.1.2" - globals "^11.0.1" - ignore "^3.3.3" + globals "^11.7.0" + ignore "^4.0.6" + import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^3.0.6" - is-resolvable "^1.0.0" - js-yaml "^3.9.1" + inquirer "^6.2.2" + js-yaml "^3.13.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.3.0" - lodash "^4.17.4" - minimatch "^3.0.2" + lodash "^4.17.11" + minimatch "^3.0.4" mkdirp "^0.5.1" natural-compare "^1.4.0" optionator "^0.8.2" path-is-inside "^1.0.2" - pluralize "^7.0.0" progress "^2.0.0" - regexpp "^1.0.1" - require-uncached "^1.0.3" - semver "^5.3.0" + regexpp "^2.0.1" + semver "^5.5.1" strip-ansi "^4.0.0" - strip-json-comments "~2.0.1" - table "4.0.2" - text-table "~0.2.0" + strip-json-comments "^2.0.1" + table "^5.2.3" + text-table "^0.2.0" -espree@^3.5.4: - version "3.5.4" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" - integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A== +espree@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" + integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== dependencies: - acorn "^5.5.0" - acorn-jsx "^3.0.0" + acorn "^6.0.7" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.0" esprima@^2.6.0: version "2.7.3" @@ -5526,7 +5726,7 @@ esprima@^4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.0: +esquery@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== @@ -5568,6 +5768,11 @@ eventemitter3@^3.0.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== +eventemitter3@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" + integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== + events@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" @@ -5726,7 +5931,7 @@ expect@^24.8.0: jest-message-util "^24.8.0" jest-regex-util "^24.3.0" -express@^4.15.3, express@^4.16.2: +express@^4.15.3, express@^4.16.2, express@^4.17.1: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== @@ -5983,13 +6188,12 @@ figures@^3.0.0: dependencies: escape-string-regexp "^1.0.5" -file-entry-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" - integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.1" + flat-cache "^2.0.1" file-loader@^0.11.1: version "0.11.2" @@ -6006,6 +6210,14 @@ file-loader@^2.0.0: loader-utils "^1.0.2" schema-utils "^1.0.0" +file-loader@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-4.2.0.tgz#5fb124d2369d7075d70a9a5abecd12e60a95215e" + integrity sha512-+xZnaK5R8kBJrHK0/6HRlrKNamvVS5rjyuju+rnyxRGuwUJwpAMsVzUl5dz6rK8brkzjV6JpcFNjp6NqV0g1OQ== + dependencies: + loader-utils "^1.2.3" + schema-utils "^2.0.0" + file-set@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/file-set/-/file-set-2.0.1.tgz#db9bc4b70a7e5ba81c9d279c20a37f13369c7850" @@ -6180,6 +6392,16 @@ find-versions@^3.0.0: array-uniq "^2.1.0" semver-regex "^2.0.0" +findup-sync@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" + integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + findup-sync@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" @@ -6190,21 +6412,25 @@ findup-sync@^2.0.0: micromatch "^3.0.4" resolve-dir "^1.0.1" -flat-cache@^1.2.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" - integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg== +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== dependencies: - circular-json "^0.3.1" - graceful-fs "^4.1.2" - rimraf "~2.6.2" - write "^0.2.1" + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" flatbuffers@^1.10.2: version "1.11.0" resolved "https://registry.yarnpkg.com/flatbuffers/-/flatbuffers-1.11.0.tgz#90a47e584dd7851ad7a913f5a0ee99c1d76ce59f" integrity sha512-0PqFKtXI4MjxomI7jO4g5XfLPm/15g2R+5WGCHBGYGh0ihQiypnHlJ6bMmkkrAe0GzZ4d7PDAfCONKIPUxNF+A== +flatted@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" + integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + flatten@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" @@ -6348,6 +6574,11 @@ fsevents@^1.0.0, fsevents@^1.2.7: nan "^2.12.1" node-pre-gyp "^0.12.0" +fsevents@~2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.1.tgz#74c64e21df71721845d0c44fe54b7f56b82995a9" + integrity sha512-4FRPXWETxtigtJW/gxzEDsX1LVbPAM93VleB83kZB+ellqbHMkyt2aJfuzNLRvFPnGi6bcE5SvfxgbXPeKteJw== + function-bind@^1.0.2, function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -6533,6 +6764,13 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" +glob-parent@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + dependencies: + is-glob "^4.0.1" + glob-to-regexp@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" @@ -6574,6 +6812,13 @@ global-modules@1.0.0, global-modules@^1.0.0: is-windows "^1.0.1" resolve-dir "^1.0.0" +global-modules@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + global-prefix@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" @@ -6585,7 +6830,16 @@ global-prefix@^1.0.1: is-windows "^1.0.1" which "^1.2.14" -globals@^11.0.1, globals@^11.1.0: +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0, globals@^11.7.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== @@ -6942,7 +7196,7 @@ html-encoding-sniffer@^1.0.2: dependencies: whatwg-encoding "^1.0.1" -html-entities@^1.2.0: +html-entities@^1.2.0, html-entities@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= @@ -6965,7 +7219,7 @@ html-loader@^0.5.1: loader-utils "^1.1.0" object-assign "^4.1.1" -html-minifier@^3.5.8: +html-minifier@^3.2.3, html-minifier@^3.5.8: version "3.5.21" resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.21.tgz#d0040e054730e354db008463593194015212d20c" integrity sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA== @@ -6978,7 +7232,20 @@ html-minifier@^3.5.8: relateurl "0.2.x" uglify-js "3.4.x" -htmlparser2@^3.9.1: +html-webpack-plugin@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b" + integrity sha1-sBq71yOsqqeze2r0SS69oD2d03s= + dependencies: + html-minifier "^3.2.3" + loader-utils "^0.2.16" + lodash "^4.17.3" + pretty-error "^2.0.2" + tapable "^1.0.0" + toposort "^1.0.0" + util.promisify "1.0.0" + +htmlparser2@^3.3.0, htmlparser2@^3.9.1: version "3.10.1" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== @@ -7026,6 +7293,16 @@ http-parser-js@>=0.4.0: resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.0.tgz#d65edbede84349d0dc30320815a15d39cc3cbbd8" integrity sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w== +http-proxy-middleware@0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== + dependencies: + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" + http-proxy-middleware@~0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz#0987e6bb5a5606e5a69168d8f967a87f15dd8aab" @@ -7045,6 +7322,15 @@ http-proxy@^1.16.2, http-proxy@^1.8.1: follow-redirects "^1.0.0" requires-port "^1.0.0" +http-proxy@^1.17.0: + version "1.18.0" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" + integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + http-server@^0.11.1: version "0.11.1" resolved "https://registry.yarnpkg.com/http-server/-/http-server-0.11.1.tgz#2302a56a6ffef7f9abea0147d838a5e9b6b6a79b" @@ -7116,11 +7402,16 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -ignore@^3.3.3, ignore@^3.3.5: +ignore@^3.3.5: version "3.3.10" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + image-size@~0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" @@ -7180,6 +7471,14 @@ import-cwd@^2.0.0: dependencies: import-from "^2.1.0" +import-fresh@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118" + integrity sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + import-from@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" @@ -7192,7 +7491,7 @@ import-lazy@^3.1.0: resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-3.1.0.tgz#891279202c8a2280fdbd6674dbd8da1a1dfc67cc" integrity sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ== -import-local@^2.0.0: +import-local@2.0.0, import-local@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== @@ -7245,7 +7544,7 @@ inherits@2.0.1: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= -ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: +ini@^1.3.2, ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== @@ -7257,7 +7556,7 @@ inject-stylesheet-template@^1.0.1: dependencies: automat "^1.2.0" -inquirer@3.3.0, inquirer@^3.0.6, inquirer@^3.2.2: +inquirer@3.3.0, inquirer@^3.2.2: version "3.3.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== @@ -7277,6 +7576,25 @@ inquirer@3.3.0, inquirer@^3.0.6, inquirer@^3.2.2: strip-ansi "^4.0.0" through "^2.3.6" +inquirer@^6.2.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.12" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + inquirer@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.0.tgz#9e2b032dde77da1db5db804758b8fea3a970519a" @@ -7304,7 +7622,15 @@ internal-ip@^3.0.1: default-gateway "^2.6.0" ipaddr.js "^1.5.2" -interpret@^1.0.0, interpret@^1.1.0: +internal-ip@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== + dependencies: + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" + +interpret@1.2.0, interpret@^1.0.0, interpret@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== @@ -7349,11 +7675,21 @@ ipaddr.js@1.9.0, ipaddr.js@^1.5.2: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== +ipaddr.js@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + is-absolute-url@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -7385,6 +7721,13 @@ is-binary-path@^1.0.0: dependencies: binary-extensions "^1.0.0" +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -7535,7 +7878,7 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" -is-glob@^4.0.0: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== @@ -7591,6 +7934,11 @@ is-path-cwd@^1.0.0: resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= +is-path-cwd@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + is-path-in-cwd@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" @@ -7598,6 +7946,13 @@ is-path-in-cwd@^1.0.0: dependencies: is-path-inside "^1.0.0" +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== + dependencies: + is-path-inside "^2.1.0" + is-path-inside@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" @@ -7605,6 +7960,13 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== + dependencies: + path-is-inside "^1.0.2" + is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -7649,11 +8011,6 @@ is-regex@^1.0.4: dependencies: has "^1.0.1" -is-resolvable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== - is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" @@ -8244,7 +8601,7 @@ js-tokens@^3.0.0, js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.13.1, js-yaml@^3.8.1, js-yaml@^3.9.0, js-yaml@^3.9.1: +js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.8.1, js-yaml@^3.9.0: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -8493,7 +8850,7 @@ keyv@3.0.0: dependencies: json-buffer "3.0.0" -killable@^1.0.0: +killable@^1.0.0, killable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== @@ -8648,6 +9005,11 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +lightercollective@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/lightercollective/-/lightercollective-0.3.0.tgz#1f07638642ec645d70bdb69ab2777676f35a28f0" + integrity sha512-RFOLSUVvwdK3xA0P8o6G7QGXLIyy1L2qv5caEI7zXN5ciaEjbAriRF182kbsoJ1S1TgvpyGcN485fMky6qxOPw== + list-item@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/list-item/-/list-item-1.1.1.tgz#0c65d00e287cb663ccb3cb3849a77e89ec268a56" @@ -8704,6 +9066,15 @@ loader-runner@^2.3.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== +loader-utils@1.2.3, loader-utils@^1.0.0, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + loader-utils@^0.2.16, loader-utils@~0.2.5: version "0.2.17" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" @@ -8714,15 +9085,6 @@ loader-utils@^0.2.16, loader-utils@~0.2.5: json5 "^0.5.0" object-assign "^4.0.1" -loader-utils@^1.0.0, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" - integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== - dependencies: - big.js "^5.2.2" - emojis-list "^2.0.0" - json5 "^1.0.1" - locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -8784,7 +9146,7 @@ lodash.map@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= -lodash.memoize@^4.1.2: +lodash.memoize@4.x, lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= @@ -8844,17 +9206,27 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "^3.0.0" +lodash.unescape@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" + integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= + lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= +lodash.uniqby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" + integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI= + lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@~4.17.10: version "4.17.13" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.13.tgz#0bdc3a6adc873d2f4e0c4bac285df91b64fc7b93" integrity sha512-vm3/XWXfWtRua0FkUyEHBZy8kCPjErNBT9fJx8Zvs+U6zjqPbTUOpkaoum3O5uiA8sm+yNMHXfYkTUHFoMxFNA== -lodash@^4.17.15: +lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.3: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -8879,6 +9251,11 @@ loglevel@^1.4.1: resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" integrity sha1-4PyVEztu8nbNyIh82vJKpvFW+Po= +loglevel@^1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.4.tgz#f408f4f006db8354d0577dcf6d33485b3cb90d56" + integrity sha512-p0b6mOGKcGa+7nnmKbpzR6qloPbrgLcnio++E+14Vo/XffOGwZtRpUhr8dTH/x2oCMmEoIU0Zwm3ZauhvYD17g== + loglevelnext@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/loglevelnext/-/loglevelnext-1.0.5.tgz#36fc4f5996d6640f539ff203ba819641680d75a2" @@ -9096,7 +9473,7 @@ mem@^4.0.0: mimic-fn "^2.0.0" p-is-promise "^2.0.0" -memory-fs@^0.4.0, memory-fs@~0.4.1: +memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= @@ -9238,6 +9615,11 @@ mime@^2.3.1: resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.3.tgz#229687331e86f68924e6cb59e1cdd937f18275fe" integrity sha512-QgrPRJfE+riq5TPZMcHZOtm8c6K/yYrMbKIoRfapfiGLxS8OTeIfRhUGW5LU7MlRa52KOAGCfUNruqLrIBvWZw== +mime@^2.4.4: + version "2.4.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" + integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== + mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" @@ -9263,6 +9645,16 @@ mini-css-extract-plugin@^0.7.0: schema-utils "^1.0.0" webpack-sources "^1.1.0" +mini-css-extract-plugin@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz#81d41ec4fe58c713a96ad7c723cdb2d0bd4d70e1" + integrity sha512-MNpRGbNA52q6U92i0qbVpQNsgk7LExy41MdAlG84FeytfDOtRIf/mCHdEgG8rpTKOaNKiqUnZdlptF469hxqOw== + dependencies: + loader-utils "^1.1.0" + normalize-url "1.9.1" + schema-utils "^1.0.0" + webpack-sources "^1.1.0" + minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -9437,6 +9829,11 @@ mustache@^2.3.0: resolved "https://registry.yarnpkg.com/mustache/-/mustache-2.3.2.tgz#a6d4d9c3f91d13359ab889a812954f9230a3d0c5" integrity sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ== +mutationobserver-shim@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz#65869630bc89d7bf8c9cd9cb82188cd955aacd2b" + integrity sha512-gciOLNN8Vsf7YzcqRjKzlAJ6y7e+B86u7i3KXes0xfxx/nfLmozlW1Vn+Sc9x3tPIePFgc1AeIFhtRgkqTjzDQ== + mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" @@ -9551,6 +9948,16 @@ node-forge@0.7.5: resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" integrity sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ== +node-forge@0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" + integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ== + +node-gyp-build@~3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.7.0.tgz#daa77a4f547b9aed3e2aac779eaf151afd60ec8d" + integrity sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w== + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -9654,7 +10061,7 @@ normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: dependencies: remove-trailing-separator "^1.0.1" -normalize-path@^3.0.0: +normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== @@ -9904,7 +10311,7 @@ opn@5.2.0: dependencies: is-wsl "^1.1.0" -opn@^5.1.0: +opn@^5.1.0, opn@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== @@ -9973,7 +10380,7 @@ os-locale@^2.0.0: lcid "^1.0.0" mem "^1.1.0" -os-locale@^3.0.0: +os-locale@^3.0.0, os-locale@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== @@ -10105,6 +10512,11 @@ p-map@^1.1.1: resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + p-pipe@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/p-pipe/-/p-pipe-1.2.0.tgz#4b1a11399a11520a67790ee5a0c1d5881d6befe9" @@ -10115,6 +10527,13 @@ p-reduce@^1.0.0: resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= +p-retry@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" + integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== + dependencies: + retry "^0.12.0" + p-timeout@^1.1.1: version "1.2.1" resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" @@ -10182,6 +10601,13 @@ param-case@2.1.x: dependencies: no-case "^2.2.0" +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + parse-asn1@^5.0.0: version "5.1.4" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc" @@ -10347,7 +10773,7 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picomatch@^2.0.5: +picomatch@^2.0.4, picomatch@^2.0.5: version "2.0.7" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== @@ -10407,11 +10833,6 @@ plist@^3.0.1: xmlbuilder "^9.0.7" xmldom "0.1.x" -pluralize@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" - integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== - pn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" @@ -10426,6 +10847,15 @@ portfinder@^1.0.13, portfinder@^1.0.17, portfinder@^1.0.9: debug "^2.2.0" mkdirp "0.5.x" +portfinder@^1.0.24: + version "1.0.25" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca" + integrity sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.1" + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -10809,6 +11239,14 @@ prettier@^1.14.2: resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.17.1.tgz#ed64b4e93e370cb8a25b9ef7fef3e4fd1c0995db" integrity sha512-TzGRNvuUSmPgwivDqkZ9tM/qTGW9hqDKWOE9YHiyQdixlKbv7kvEqsmDPrcHJTKwthU774TQwZXVtaQ/mMsvjg== +pretty-error@^2.0.2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" + integrity sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM= + dependencies: + renderkid "^2.0.1" + utila "~0.4" + pretty-format@^24.8.0: version "24.8.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.8.0.tgz#8dae7044f58db7cb8be245383b565a963e3c27f2" @@ -11049,7 +11487,7 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" -range-parser@^1.0.3, range-parser@~1.2.1: +range-parser@^1.0.3, range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== @@ -11233,6 +11671,13 @@ readdirp@^2.0.0, readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" +readdirp@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" + integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== + dependencies: + picomatch "^2.0.4" + realpath-native@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" @@ -11379,10 +11824,10 @@ regexp-tree@^0.1.6: resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.10.tgz#d837816a039c7af8a8d64d7a7c3cf6a1d93450bc" integrity sha512-K1qVSbcedffwuIslMwpe6vGlj+ZXRnGkvjAtFHfDZZZuEdA/h0dxljAPu9vhUo6Rrx2U2AwJ+nSQ6hK+lrP5MQ== -regexpp@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" - integrity sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw== +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== regexpu-core@^1.0.0: version "1.0.0" @@ -11462,6 +11907,17 @@ remove-trailing-separator@^1.0.1: resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= +renderkid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.3.tgz#380179c2ff5ae1365c522bf2fcfcff01c5b74149" + integrity sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA== + dependencies: + css-select "^1.1.0" + dom-converter "^0.2" + htmlparser2 "^3.3.0" + strip-ansi "^3.0.0" + utila "^0.4.0" + repeat-element@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" @@ -11551,14 +12007,6 @@ require-package-name@^2.0.1: resolved "https://registry.yarnpkg.com/require-package-name/-/require-package-name-2.0.1.tgz#c11e97276b65b8e2923f75dabf5fb2ef0c3841b9" integrity sha1-wR6XJ2tluOKSP3Xav1+y7ww4Qbk= -require-uncached@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" - integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= - dependencies: - caller-path "^0.1.0" - resolve-from "^1.0.0" - requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -11586,16 +12034,16 @@ resolve-dir@^1.0.0, resolve-dir@^1.0.1: expand-tilde "^2.0.0" global-modules "^1.0.0" -resolve-from@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= - resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" integrity sha1-six699nWiBvItuZTM17rywoYh0g= +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" @@ -11641,6 +12089,11 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + right-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" @@ -11648,7 +12101,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@~2.6.2: +rimraf@2.6.3, rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@~2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== @@ -11780,6 +12233,14 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" +schema-utils@^2.0.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.5.0.tgz#8f254f618d402cc80257486213c8970edfd7c22f" + integrity sha512-32ISrwW2scPXHUSusP8qMg5dLUawKkyV+/qIEV9JdXKx+rsM6mi8vZY8khg2M69Qom16rtroWXD3Ybtiws38gQ== + dependencies: + ajv "^6.10.2" + ajv-keywords "^3.4.1" + seek-bzip@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.5.tgz#cfe917cb3d274bcffac792758af53173eb1fabdc" @@ -11797,6 +12258,13 @@ select@^1.1.2: resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= +selfsigned@^1.10.7: + version "1.10.7" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.7.tgz#da5819fd049d5574f28e88a9bcc6dbc6e6f3906b" + integrity sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA== + dependencies: + node-forge "0.9.0" + selfsigned@^1.9.1: version "1.10.4" resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.4.tgz#cdd7eccfca4ed7635d47a08bf2d5d3074092e2cd" @@ -11826,6 +12294,11 @@ semver@^6.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.0.tgz#e95dc415d45ecf03f2f9f83b264a6b11f49c0cca" integrity sha512-kCqEOOHoBcFs/2Ccuk4Xarm/KiWRSLEX9CAZF8xkJ6ZPlIoTZ8V5f7J16vYLJqDbR7KrxTJpR2lqjIEm2Qx9cQ== +semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -11850,7 +12323,7 @@ serialize-javascript@^1.7.0: resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.7.0.tgz#d6e0dfb2a3832a8c94468e6eb1db97e55a192a65" integrity sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA== -serve-index@^1.7.2: +serve-index@^1.7.2, serve-index@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= @@ -12031,11 +12504,13 @@ slash@^2.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== -slice-ansi@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" - integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" is-fullwidth-code-point "^2.0.0" snapdragon-node@^2.0.1: @@ -12092,6 +12567,18 @@ sockjs-client@1.3.0: json3 "^3.3.2" url-parse "^1.4.3" +sockjs-client@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" + integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g== + dependencies: + debug "^3.2.5" + eventsource "^1.0.7" + faye-websocket "~0.11.1" + inherits "^2.0.3" + json3 "^3.3.2" + url-parse "^1.4.3" + sockjs@0.3.19: version "0.3.19" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" @@ -12261,6 +12748,17 @@ spdy@^4.0.0: select-hose "^2.0.0" spdy-transport "^3.0.0" +spdy@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.1.tgz#6f12ed1c5db7ea4f24ebb8b89ba58c87c08257f2" + integrity sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" @@ -12546,7 +13044,7 @@ strip-indent@^2.0.0: resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= -strip-json-comments@~2.0.1: +strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= @@ -12594,6 +13092,13 @@ superscript-number@^1.0.0: resolved "https://registry.yarnpkg.com/superscript-number/-/superscript-number-1.0.0.tgz#763613e214891dadc188995d0c7485c8c0beb6ef" integrity sha1-djYT4hSJHa3BiJldDHSFyMC+tu8= +supports-color@6.1.0, supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -12620,13 +13125,6 @@ supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0, supports-co dependencies: has-flag "^3.0.0" -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - svg-themer@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/svg-themer/-/svg-themer-1.1.2.tgz#71d7d66a11b47ca14762f7ae8db29ed3f6b1db82" @@ -12686,17 +13184,15 @@ table-layout@^0.4.2, table-layout@^0.4.3: typical "^2.6.1" wordwrapjs "^3.0.0" -table@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" - integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA== +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== dependencies: - ajv "^5.2.3" - ajv-keywords "^2.1.0" - chalk "^2.1.0" - lodash "^4.17.4" - slice-ansi "1.0.0" - string-width "^2.1.1" + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" taffydb@2.6.2: version "2.6.2" @@ -12898,7 +13394,7 @@ text-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== -text-table@0.2.0, text-table@^0.2.0, text-table@~0.2.0: +text-table@0.2.0, text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= @@ -13029,6 +13525,11 @@ toml@^2.3.2: resolved "https://registry.yarnpkg.com/toml/-/toml-2.3.6.tgz#25b0866483a9722474895559088b436fd11f861b" integrity sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ== +toposort@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" + integrity sha1-LmhELZ9k7HILjMieZEOsbKqVACk= + tough-cookie@^2.3.3, tough-cookie@^2.3.4: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" @@ -13094,25 +13595,26 @@ truncate-html@^1.0.1: "@types/cheerio" "^0.22.8" cheerio "0.22.0" -ts-jest@^23.10.4: - version "23.10.5" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-23.10.5.tgz#cdb550df4466a30489bf70ba867615799f388dd5" - integrity sha512-MRCs9qnGoyKgFc8adDEntAOP64fWK1vZKnOYU1o2HxaqjdJvGqmkLCPCnVq1/If4zkUmEjKPnCiUisTrlX2p2A== +ts-jest@^24.1.0: + version "24.1.0" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.1.0.tgz#2eaa813271a2987b7e6c3fefbda196301c131734" + integrity sha512-HEGfrIEAZKfu1pkaxB9au17b1d9b56YZSqz5eCVE8mX68+5reOvlM93xGOzzCREIov9mdH7JBG+s0UyNAqr0tQ== dependencies: bs-logger "0.x" buffer-from "1.x" fast-json-stable-stringify "2.x" json5 "2.x" + lodash.memoize "4.x" make-error "1.x" mkdirp "0.x" resolve "1.x" semver "^5.5" yargs-parser "10.x" -ts-loader@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.0.4.tgz#bc331ad91a887a60632d94c9f79448666f2c4b63" - integrity sha512-p2zJYe7OtwR+49kv4gs7v4dMrfYD1IPpOtqiSPCbe8oR+4zEBtdHwzM7A7M91F+suReqgzZrlClk4LRSSp882g== +ts-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-6.2.0.tgz#52d3993ecbc5474c1513242388e1049da0fce880" + integrity sha512-Da8h3fD+HiZ9GvZJydqzk3mTC9nuOKYlJcpuk+Zv6Y1DPaMvBL+56GRzZFypx2cWrZFMsQr869+Ua2slGoLxvQ== dependencies: chalk "^2.3.0" enhanced-resolve "^4.0.0" @@ -13120,7 +13622,7 @@ ts-loader@^6.0.4: micromatch "^4.0.0" semver "^6.0.0" -tslib@^1.9.0: +tslib@^1.8.1, tslib@^1.9.0: version "1.10.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== @@ -13130,6 +13632,13 @@ tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== +tsutils@^3.17.1: + version "3.17.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" + integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== + dependencies: + tslib "^1.8.1" + tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" @@ -13182,15 +13691,10 @@ typescript@=1.0.1: resolved "https://registry.yarnpkg.com/typescript/-/typescript-1.0.1.tgz#e8eacde3084a091d3fe29b60ac5862252662a25a" integrity sha1-6OrN4whKCR0/4ptgrFhiJSZiolo= -typescript@^3.2.4: - version "3.4.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.4.5.tgz#2d2618d10bb566572b8d7aad5180d84257d70a99" - integrity sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw== - -typescript@~2.9.2: - version "2.9.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" - integrity sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w== +typescript@^3.6.0: + version "3.6.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.4.tgz#b18752bb3792bc1a0281335f7f6ebf1bbfc5b91d" + integrity sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg== typical@^2.4.2, typical@^2.6.0, typical@^2.6.1: version "2.6.1" @@ -13439,7 +13943,7 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -util.promisify@^1.0.0, util.promisify@~1.0.0: +util.promisify@1.0.0, util.promisify@^1.0.0, util.promisify@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== @@ -13461,6 +13965,11 @@ util@^0.11.0: dependencies: inherits "2.0.3" +utila@^0.4.0, utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -13476,7 +13985,7 @@ uuid@^3.0.1, uuid@^3.1.0, uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== -v8-compile-cache@^2.0.2: +v8-compile-cache@2.0.3, v8-compile-cache@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== @@ -13584,6 +14093,23 @@ webpack-cli@^3.3.2: v8-compile-cache "^2.0.2" yargs "^12.0.5" +webpack-cli@^3.3.7: + version "3.3.9" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.9.tgz#79c27e71f94b7fe324d594ab64a8e396b9daa91a" + integrity sha512-xwnSxWl8nZtBl/AFJCOn9pG7s5CYUYdZxmmukv+fAHLcBIHM36dImfpQg3WfShZXeArkWlf6QRw24Klcsv8a5A== + dependencies: + chalk "2.4.2" + cross-spawn "6.0.5" + enhanced-resolve "4.1.0" + findup-sync "3.0.0" + global-modules "2.0.0" + import-local "2.0.0" + interpret "1.2.0" + loader-utils "1.2.3" + supports-color "6.1.0" + v8-compile-cache "2.0.3" + yargs "13.2.4" + webpack-dev-middleware@3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz#1132fecc9026fd90f0ecedac5cbff75d1fb45890" @@ -13594,6 +14120,17 @@ webpack-dev-middleware@3.4.0: range-parser "^1.0.3" webpack-log "^2.0.0" +webpack-dev-middleware@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" + integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + webpack-dev-server@3.1.11: version "3.1.11" resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.11.tgz#3b698b5b32476f1f0d3d4014952fcf42ab118205" @@ -13630,6 +14167,50 @@ webpack-dev-server@3.1.11: webpack-log "^2.0.0" yargs "12.0.2" +webpack-dev-server@^3.8.0: + version "3.8.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.8.2.tgz#3292427bf6510da9a3ac2d500b924a4197667ff9" + integrity sha512-0xxogS7n5jHDQWy0WST0q6Ykp7UGj4YvWh+HVN71JoE7BwPxMZrwgraBvmdEMbDVMBzF0u+mEzn8TQzBm5NYJQ== + dependencies: + ansi-html "0.0.7" + bonjour "^3.5.0" + chokidar "^2.1.8" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + debug "^4.1.1" + del "^4.1.1" + express "^4.17.1" + html-entities "^1.2.1" + http-proxy-middleware "0.19.1" + import-local "^2.0.0" + internal-ip "^4.3.0" + ip "^1.1.5" + is-absolute-url "^3.0.3" + killable "^1.0.1" + loglevel "^1.6.4" + opn "^5.5.0" + p-retry "^3.0.1" + portfinder "^1.0.24" + schema-utils "^1.0.0" + selfsigned "^1.10.7" + semver "^6.3.0" + serve-index "^1.9.1" + sockjs "0.3.19" + sockjs-client "1.4.0" + spdy "^4.0.1" + strip-ansi "^3.0.1" + supports-color "^6.1.0" + url "^0.11.0" + webpack-dev-middleware "^3.7.2" + webpack-log "^2.0.0" + ws "^6.2.1" + yargs "12.0.5" + +webpack-fix-style-only-entries@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/webpack-fix-style-only-entries/-/webpack-fix-style-only-entries-0.4.0.tgz#a027ceb960447b29eed2c56d9ddc003e52d60fb5" + integrity sha512-6TDa56V/xSOw6CBVlhFm6J+xXY2oJzx7CEgH0dmex2Xe1rwb95KkLl3rXvSNpO4wyahwD3YnYqffDNR0LH1BNQ== + webpack-log@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-1.2.0.tgz#a4b34cda6b22b518dbb0ab32e567962d5c72a43d" @@ -13783,7 +14364,7 @@ which@1.2.x: dependencies: isexe "^2.0.0" -which@^1.2.14, which@^1.2.9, which@^1.3.0: +which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -13900,10 +14481,10 @@ write-pkg@^3.1.0: sort-keys "^2.0.0" write-json-file "^2.2.0" -write@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" - integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== dependencies: mkdirp "^0.5.1" @@ -13914,7 +14495,7 @@ ws@^5.2.0: dependencies: async-limiter "~1.0.0" -ws@^6.1.2: +ws@^6.1.2, ws@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== @@ -14006,7 +14587,7 @@ yargs-parser@^11.1.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^13.1.1: +yargs-parser@^13.1.0, yargs-parser@^13.1.1: version "13.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== @@ -14039,7 +14620,7 @@ yargs@12.0.2: y18n "^3.2.1 || ^4.0.0" yargs-parser "^10.1.0" -yargs@^12.0.2, yargs@^12.0.5: +yargs@12.0.5, yargs@^12.0.2, yargs@^12.0.5: version "12.0.5" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== @@ -14057,6 +14638,23 @@ yargs@^12.0.2, yargs@^12.0.5: y18n "^3.2.1 || ^4.0.0" yargs-parser "^11.1.1" +yargs@13.2.4: + version "13.2.4" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" + integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + os-locale "^3.1.0" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.0" + yargs@^13.2.4: version "13.3.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83"