From 927b5bbc45e29d041de74b31a48b19d6f8141e5c Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Sun, 22 Mar 2020 14:17:54 +0100 Subject: [PATCH] Updates visualization playground. --- visualization-playground/index.js | 5 - visualization-playground/package.json | 8 +- .../src/components/GUI.tsx | 47 ++--- .../src/components/LightExpressionInput.tsx | 76 +++++++++ visualization-playground/src/model/Model.ts | 51 +++++- .../src/model/QueryController.ts | 26 +++ visualization-playground/src/style.scss | 11 +- visualization-playground/webpack.config.ts | 56 ++++-- visualization/src/EnabledVisualizers.ts | 12 ++ visualization/src/index.ts | 1 + visualization/src/visualizers/index.ts | 56 +++--- webview/webpack.config.ts | 22 +++ yarn.lock | 161 +++++++++++++++++- 13 files changed, 453 insertions(+), 79 deletions(-) delete mode 100644 visualization-playground/index.js create mode 100644 visualization-playground/src/components/LightExpressionInput.tsx create mode 100644 visualization-playground/src/model/QueryController.ts create mode 100644 visualization/src/EnabledVisualizers.ts diff --git a/visualization-playground/index.js b/visualization-playground/index.js deleted file mode 100644 index 82a7dea..0000000 --- a/visualization-playground/index.js +++ /dev/null @@ -1,5 +0,0 @@ -// This is the entry point when this package is used as library from the extension. -// This package MUST NOT be bundled. -const path = require("path"); - -module.exports.distPath = path.join(__dirname, "dist"); diff --git a/visualization-playground/package.json b/visualization-playground/package.json index 20b22b1..8914331 100644 --- a/visualization-playground/package.json +++ b/visualization-playground/package.json @@ -4,9 +4,9 @@ "scripts": { "dev": "webpack-dev-server --hot --port 8090", "dev-fast": "webpack-dev-server --hot --port 8090 --fast", - "build": "webpack" + "build": "webpack", + "pub": "gh-pages -d dist" }, - "main": "./index.js", "dependencies": { "@blueprintjs/core": "^3.23.1", "@hediet/std": "^0.6.0", @@ -19,9 +19,11 @@ "react": "^16.12.0", "react-dom": "^16.12.0", "react-measure": "^2.3.0", - "@hediet/debug-visualizer-data-extraction": "*" + "@hediet/debug-visualizer-data-extraction": "*", + "react-autosize-textarea": "^7.0.0" }, "devDependencies": { + "gh-pages": "^2.2.0", "@types/html-webpack-plugin": "^3.2.2", "@types/react-measure": "^2.0.6", "@types/webpack": "^4.41.6", diff --git a/visualization-playground/src/components/GUI.tsx b/visualization-playground/src/components/GUI.tsx index 1d986e9..8de6502 100644 --- a/visualization-playground/src/components/GUI.tsx +++ b/visualization-playground/src/components/GUI.tsx @@ -5,34 +5,41 @@ import { observer } from "mobx-react"; import { Model } from "../model/Model"; import classnames = require("classnames"); import { knownVisualizations } from "@hediet/visualization"; -import { - ExtractedData, - CommonDataType, -} from "@hediet/debug-visualizer-data-extraction"; +import { CommonDataType } from "@hediet/debug-visualizer-data-extraction"; +import { LightExpressionInput } from "./LightExpressionInput"; @observer export class GUI extends React.Component<{ model: Model }> { render() { const m = this.props.model; - const e: CommonDataType = { - kind: { graph: true }, - nodes: [ - { id: "1", label: "1" }, - { id: "2", label: "2" }, - ], - edges: [ - { - from: "1", - to: "2", - }, - ], - }; - const result = knownVisualizations.getBestVisualization(e, undefined); return ( -
- {result.visualization!.render()} +
+
+ +
+
+ {this.renderVisualization()} +
); } + + renderVisualization() { + const m = this.props.model; + + if (!m.visualizations) { + return
No/Invalid Data
; + } + if (!m.visualizations.visualization) { + return
Data cannot be visualized
; + } + return m.visualizations.visualization.render(); + } } diff --git a/visualization-playground/src/components/LightExpressionInput.tsx b/visualization-playground/src/components/LightExpressionInput.tsx new file mode 100644 index 0000000..bf6ba5e --- /dev/null +++ b/visualization-playground/src/components/LightExpressionInput.tsx @@ -0,0 +1,76 @@ +import * as React from "react"; +import { observer } from "mobx-react"; +import { observable, action } from "mobx"; +import TextareaAutosize from "react-autosize-textarea"; + +export class ExpressionModel { + @observable + private _value: string; + + constructor(initialValue: string) { + this._value = initialValue; + } + + public get value(): string { + return this._value; + } + + public setValue(newValue: string): void { + this._value = newValue; + } +} + +@observer +export class LightExpressionInput extends React.Component<{ + model: ExpressionModel; +}> { + @observable localText: string | undefined = undefined; + + get text(): string { + if (this.localText !== undefined) { + return this.localText; + } + return this.props.model.value; + } + + render() { + return ( +
+ (this.localText = e.currentTarget.value)} + onKeyDown={e => { + if (e.keyCode == 9 || e.which == 9) { + // enable tab + const target = e.currentTarget; + e.preventDefault(); + var s = target.selectionStart; + target.value = + target.value.substring( + 0, + target.selectionStart + ) + + "\t" + + target.value.substring(target.selectionEnd); + target.selectionEnd = s + 1; + } + }} + style={{ + width: "100%", + resize: "none", + }} + onBlur={this.handleBlur} + /> +
+ ); + } + + @action.bound + private handleBlur() { + if (this.localText !== undefined) { + this.props.model.setValue(this.localText); + } + this.localText = undefined; + } +} diff --git a/visualization-playground/src/model/Model.ts b/visualization-playground/src/model/Model.ts index c38f73a..dd30e9a 100644 --- a/visualization-playground/src/model/Model.ts +++ b/visualization-playground/src/model/Model.ts @@ -5,6 +5,9 @@ import { knownVisualizations, } from "@hediet/visualization"; import { Disposable } from "@hediet/std/disposable"; +import { ExpressionModel } from "../components/LightExpressionInput"; +import { ExtractedData } from "@hediet/debug-visualizer-data-extraction"; +import { QueryController } from "./QueryController"; export class Model { public readonly dispose = Disposable.fn(); @@ -21,24 +24,64 @@ export class Model { this.preferredVisualizationId = id; } + public jsonExpression = new ExpressionModel( + JSON.stringify( + { + kind: { graph: true }, + nodes: [ + { id: "1", label: "1" }, + { id: "2", label: "2" }, + ], + edges: [ + { + from: "1", + to: "2", + }, + ], + }, + undefined, + 4 + ) + ); + + get state(): + | { kind: "data"; data: ExtractedData } + | { kind: "parseError" } { + const json = this.jsonExpression.value; + let data: ExtractedData; + try { + data = JSON.parse(json); + } catch (e) { + return { + kind: "parseError", + }; + } + + return { + kind: "data", + data, + }; + } + @computed get visualizations(): | { visualization: Visualization | undefined; allVisualizations: Visualization[]; } | undefined { - return undefined; - /*if (this.state.kind === "data") { + if (this.state.kind === "data") { const vis = knownVisualizations.getBestVisualization( - this.state.result.data, + this.state.data, this.preferredVisualizationId ); return vis; } else { return undefined; - }*/ + } } + private readonly q = new QueryController(this); + constructor() { const url = new URL(window.location.href); diff --git a/visualization-playground/src/model/QueryController.ts b/visualization-playground/src/model/QueryController.ts new file mode 100644 index 0000000..d47d5a4 --- /dev/null +++ b/visualization-playground/src/model/QueryController.ts @@ -0,0 +1,26 @@ +import { Model } from "./Model"; +import { autorun } from "mobx"; + +export class QueryController { + constructor(private readonly model: Model) { + this.loadFromQuery(); + autorun(() => { + this.updateQuery(); + }); + } + + loadFromQuery() { + const url = new URL(window.location.href); + const val = url.searchParams.get("value"); + if (val) { + this.model.jsonExpression.setValue(val); + } + } + + updateQuery() { + const url = new URL(window.location.href); + url.searchParams.set("value", this.model.jsonExpression.value); + + history.replaceState(null, document.title, url.toString()); + } +} diff --git a/visualization-playground/src/style.scss b/visualization-playground/src/style.scss index 7f03f49..79cf191 100644 --- a/visualization-playground/src/style.scss +++ b/visualization-playground/src/style.scss @@ -36,8 +36,8 @@ body { .component-GUI { height: 100%; & > .part-Header { - padding: 6px 20px 6px 0; - background-color: var(--vscode-sideBar-background); + //padding: 6px 20px 6px 0; + //background-color: var(--vscode-sideBar-background); // border-top: solid 1px var(--vscode-button-background); // rgba(128, 128, 128, 0.15) @@ -66,13 +66,6 @@ body { } } -.svgViewer { - width: 100%; - height: 100%; - padding: 0; - margin: 0; -} - .bp3-transition-container { z-index: 100000; } diff --git a/visualization-playground/webpack.config.ts b/visualization-playground/webpack.config.ts index 1da126b..6af1f7c 100644 --- a/visualization-playground/webpack.config.ts +++ b/visualization-playground/webpack.config.ts @@ -4,13 +4,46 @@ import HtmlWebpackPlugin = require("html-webpack-plugin"); import MonacoWebpackPlugin = require("monaco-editor-webpack-plugin"); import ForkTsCheckerWebpackPlugin = require("fork-ts-checker-webpack-plugin"); import { CleanWebpackPlugin } from "clean-webpack-plugin"; +import { EnabledVisualizers } from "@hediet/visualization"; const r = (file: string) => path.resolve(__dirname, file); const mode = process.argv.some(v => v === "--fast") ? "fast" : "default"; +const enabledVisualizers: EnabledVisualizers = + mode === "fast" + ? { + VisJsGraphVisualizer: true, + TreeVisualizer: false, + GraphvizGraphVisualizer: false, + SvgVisualizer: false, + GraphvizDotVisualizer: false, + TextVisualizer: false, + PlotlyVisualizer: false, + GridVisualizer: false, + MonacoTextVisualizer: false, + AstVisualizer: false, + } + : { + VisJsGraphVisualizer: true, + TreeVisualizer: true, + GraphvizGraphVisualizer: true, + SvgVisualizer: true, + GraphvizDotVisualizer: true, + TextVisualizer: true, + PlotlyVisualizer: true, + GridVisualizer: true, + MonacoTextVisualizer: true, + AstVisualizer: true, + }; + +const stringifiedEnabledVisualizers: Record = {}; +for (const [key, val] of Object.entries(enabledVisualizers)) { + stringifiedEnabledVisualizers[key] = JSON.stringify(val); +} + module.exports = { - entry: [mode === "default" ? r("src/index.tsx") : r("src/playground.tsx")], + entry: [r("src/index.tsx")], output: { path: r("dist"), filename: "[name].js", @@ -19,7 +52,7 @@ module.exports = { resolve: { extensions: [".webpack.js", ".web.js", ".ts", ".tsx", ".js"], }, - devtool: "source-map", + devtool: "eval", // "source-map", module: { rules: [ { test: /\.css$/, loader: "style-loader!css-loader" }, @@ -45,15 +78,18 @@ module.exports = { }), new ForkTsCheckerWebpackPlugin(), new CleanWebpackPlugin(), + new webpack.DefinePlugin({ + ENABLED_VISUALIZERS: stringifiedEnabledVisualizers, + }), ]; - if (mode === "default") { - plugins.push( - new MonacoWebpackPlugin({ - // Add more languages here once webworker issues are solved. - languages: ["typescript"], - }) - ); - } + + plugins.push( + new MonacoWebpackPlugin({ + // Add more languages here once webworker issues are solved. + languages: ["typescript"], + }) + ); + return plugins; })(), } as webpack.Configuration; diff --git a/visualization/src/EnabledVisualizers.ts b/visualization/src/EnabledVisualizers.ts new file mode 100644 index 0000000..083873a --- /dev/null +++ b/visualization/src/EnabledVisualizers.ts @@ -0,0 +1,12 @@ +export interface EnabledVisualizers { + VisJsGraphVisualizer: boolean; + TreeVisualizer: boolean; + GraphvizGraphVisualizer: boolean; + SvgVisualizer: boolean; + GraphvizDotVisualizer: boolean; + TextVisualizer: boolean; + PlotlyVisualizer: boolean; + GridVisualizer: boolean; + MonacoTextVisualizer: boolean; + AstVisualizer: boolean; +} diff --git a/visualization/src/index.ts b/visualization/src/index.ts index 686036d..bcf603e 100644 --- a/visualization/src/index.ts +++ b/visualization/src/index.ts @@ -1,3 +1,4 @@ export * from "./visualizers"; export * from "./Visualizer"; export * from "./VisualizerView"; +export * from "./EnabledVisualizers"; diff --git a/visualization/src/visualizers/index.ts b/visualization/src/visualizers/index.ts index 5a391ba..817c1c0 100644 --- a/visualization/src/visualizers/index.ts +++ b/visualization/src/visualizers/index.ts @@ -1,25 +1,33 @@ -// import "./style.scss"; -import { ComposedVisualizer } from "../Visualizer"; -import { TreeVisualizer } from "./TreeVisualizer/TreeVisualizer"; -import { GraphvizGraphVisualizer } from "./graph-visualizers/GraphvizGraphVisualizer"; -import { SvgVisualizer } from "./SvgVisualizer"; -import { GraphvizDotVisualizer } from "./graph-visualizers/GraphvizDotVisualizer"; -import { TextVisualizer } from "./text-visualizers/TextVisualizer"; -import { MonacoTextVisualizer } from "./text-visualizers/MonacoTextVisualizer"; -import { AstVisualizer } from "./AstVisualizer"; -import { VisJsGraphVisualizer } from "./graph-visualizers/VisJsGraphVisualizer"; -import { PlotlyVisualizer } from "./plotly"; -import { GridVisualizer } from "./GridVisualizer"; +import { ComposedVisualizer, Visualizer } from "../Visualizer"; +import { EnabledVisualizers } from "../EnabledVisualizers"; -export const knownVisualizations = new ComposedVisualizer([ - new TreeVisualizer(), - new GraphvizGraphVisualizer(), - new VisJsGraphVisualizer(), - new SvgVisualizer(), - new GraphvizDotVisualizer(), - new TextVisualizer(), - new MonacoTextVisualizer(), - new AstVisualizer(), - new PlotlyVisualizer(), - new GridVisualizer(), -]); +declare const ENABLED_VISUALIZERS: EnabledVisualizers; + +function isVisualizer(v: Visualizer | false): v is Visualizer { + return !!v; +} + +export const knownVisualizations = new ComposedVisualizer( + [ + ENABLED_VISUALIZERS.VisJsGraphVisualizer && + new (require("./graph-visualizers/VisJsGraphVisualizer") as typeof import("./graph-visualizers/VisJsGraphVisualizer")).VisJsGraphVisualizer(), + ENABLED_VISUALIZERS.TreeVisualizer && + new (require("./TreeVisualizer/TreeVisualizer") as typeof import("./TreeVisualizer/TreeVisualizer")).TreeVisualizer(), + ENABLED_VISUALIZERS.GraphvizGraphVisualizer && + new (require("./graph-visualizers/GraphvizGraphVisualizer") as typeof import("./graph-visualizers/GraphvizGraphVisualizer")).GraphvizGraphVisualizer(), + ENABLED_VISUALIZERS.SvgVisualizer && + new (require("./SvgVisualizer") as typeof import("./SvgVisualizer")).SvgVisualizer(), + ENABLED_VISUALIZERS.GraphvizDotVisualizer && + new (require("./graph-visualizers/GraphvizDotVisualizer") as typeof import("./graph-visualizers/GraphvizDotVisualizer")).GraphvizDotVisualizer(), + ENABLED_VISUALIZERS.TextVisualizer && + new (require("./text-visualizers/TextVisualizer") as typeof import("./text-visualizers/TextVisualizer")).TextVisualizer(), + ENABLED_VISUALIZERS.PlotlyVisualizer && + new (require("./plotly") as typeof import("./plotly")).PlotlyVisualizer(), + ENABLED_VISUALIZERS.GridVisualizer && + new (require("./GridVisualizer") as typeof import("./GridVisualizer")).GridVisualizer(), + ENABLED_VISUALIZERS.MonacoTextVisualizer && + new (require("./text-visualizers/MonacoTextVisualizer") as typeof import("./text-visualizers/MonacoTextVisualizer")).MonacoTextVisualizer(), + ENABLED_VISUALIZERS.AstVisualizer && + new (require("./AstVisualizer") as typeof import("./AstVisualizer")).AstVisualizer(), + ].filter(isVisualizer) +); diff --git a/webview/webpack.config.ts b/webview/webpack.config.ts index 7295a83..1c1be8b 100644 --- a/webview/webpack.config.ts +++ b/webview/webpack.config.ts @@ -4,9 +4,28 @@ import HtmlWebpackPlugin = require("html-webpack-plugin"); import MonacoWebpackPlugin = require("monaco-editor-webpack-plugin"); import ForkTsCheckerWebpackPlugin = require("fork-ts-checker-webpack-plugin"); import { CleanWebpackPlugin } from "clean-webpack-plugin"; +import { EnabledVisualizers } from "@hediet/visualization"; const r = (file: string) => path.resolve(__dirname, file); +const enabledVisualizers: EnabledVisualizers = { + VisJsGraphVisualizer: true, + TreeVisualizer: true, + GraphvizGraphVisualizer: true, + SvgVisualizer: true, + GraphvizDotVisualizer: true, + TextVisualizer: true, + PlotlyVisualizer: true, + GridVisualizer: true, + MonacoTextVisualizer: true, + AstVisualizer: true, +}; + +const stringifiedEnabledVisualizers: Record = {}; +for (const [key, val] of Object.entries(enabledVisualizers)) { + stringifiedEnabledVisualizers[key] = JSON.stringify(val); +} + module.exports = { entry: [r("src/index.tsx")], output: { @@ -47,6 +66,9 @@ module.exports = { // Add more languages here once webworker issues are solved. languages: ["typescript"], }), + new webpack.DefinePlugin({ + ENABLED_VISUALIZERS: stringifiedEnabledVisualizers, + }), ]; return plugins; diff --git a/yarn.lock b/yarn.lock index 3f344f8..6bb1069 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1068,7 +1068,7 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== -async@^2.6.2: +async@^2.6.1, 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== @@ -1095,6 +1095,11 @@ atob@^2.1.1: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +autosize@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/autosize/-/autosize-4.0.2.tgz#073cfd07c8bf45da4b9fd153437f5bafbba1e4c9" + integrity sha512-jnSyH2d+qdfPGpWlcuhGiHmqBJ6g3X+8T+iRwFrHPLVcdoGJE/x6Qicm6aDHfTsbgZKxyV8UU/YB2p4cjKDRRA== + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -1886,7 +1891,7 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@2, commander@^2.15.1: +commander@2, commander@^2.15.1, commander@^2.18.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -1971,6 +1976,11 @@ compute-dims@^1.1.0: validate.io-ndarray-like "^1.0.0" validate.io-positive-integer "^1.0.0" +computed-style@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/computed-style/-/computed-style-0.1.4.tgz#7f344fd8584b2e425bedca4a1afc0e300bb05d74" + integrity sha1-fzRP2FhLLkJb7cpKGvwOMAuwXXQ= + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -2786,6 +2796,11 @@ elliptic@^6.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" +email-addresses@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/email-addresses/-/email-addresses-3.1.0.tgz#cabf7e085cbdb63008a70319a74e6136188812fb" + integrity sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg== + emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -3266,6 +3281,28 @@ file-loader@^5.1.0: loader-utils "^1.4.0" schema-utils "^2.5.0" +filename-reserved-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz#e61cf805f0de1c984567d0386dc5df50ee5af7e4" + integrity sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q= + +filenamify-url@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/filenamify-url/-/filenamify-url-1.0.0.tgz#b32bd81319ef5863b73078bed50f46a4f7975f50" + integrity sha1-syvYExnvWGO3MHi+1Q9GpPeXX1A= + dependencies: + filenamify "^1.0.0" + humanize-url "^1.0.0" + +filenamify@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-1.2.1.tgz#a9f2ffd11c503bed300015029272378f1f1365a5" + integrity sha1-qfL/0RxQO+0wABUCknI3jx8TZaU= + dependencies: + filename-reserved-regex "^1.0.0" + strip-outer "^1.0.0" + trim-repeated "^1.0.0" + fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -3453,6 +3490,15 @@ from2@^2.1.0, from2@^2.3.0: inherits "^2.0.1" readable-stream "^2.0.0" +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-minipass@^1.2.5: version "1.2.6" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07" @@ -3596,6 +3642,18 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +gh-pages@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/gh-pages/-/gh-pages-2.2.0.tgz#74ebeaca8d2b9a11279dcbd4a39ddfff3e6caa24" + integrity sha512-c+yPkNOPMFGNisYg9r4qvsMIjVYikJv7ImFOhPIVPt0+AcRUamZ7zkGRLHz7FKB0xrlZ+ddSOJsZv9XAFVXLmA== + dependencies: + async "^2.6.1" + commander "^2.18.0" + email-addresses "^3.0.1" + filenamify-url "^1.0.0" + fs-extra "^8.1.0" + globby "^6.1.0" + gl-axes3d@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/gl-axes3d/-/gl-axes3d-1.5.2.tgz#27dacb2f246cc5802b1ecddbb2caddf75e0c708a" @@ -4258,6 +4316,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.0.tgz#8d8fdc73977cb04104721cb53666c1ca64cd328b" integrity sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg== +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" + integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + grid-index@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/grid-index/-/grid-index-1.1.0.tgz#97f8221edec1026c8377b86446a7c71e79522ea7" @@ -4540,6 +4603,14 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= +humanize-url@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/humanize-url/-/humanize-url-1.0.1.tgz#f4ab99e0d288174ca4e1e50407c55fbae464efff" + integrity sha1-9KuZ4NKIF0yk4eUEB8VfuuRk7/8= + dependencies: + normalize-url "^1.0.0" + strip-url-auth "^1.0.0" + iconv-lite@0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -4954,7 +5025,7 @@ is-path-inside@^2.1.0: dependencies: path-is-inside "^1.0.2" -is-plain-obj@^1.1.0: +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" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= @@ -5139,6 +5210,13 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -5241,6 +5319,13 @@ line-column@^1.0.2: isarray "^1.0.0" isobject "^2.0.0" +line-height@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/line-height/-/line-height-0.3.1.tgz#4b1205edde182872a5efa3c8f620b3187a9c54c9" + integrity sha1-SxIF7d4YKHKl76PI9iCzGHqcVMk= + dependencies: + computed-style "~0.1.3" + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -6105,6 +6190,16 @@ normalize-svg-path@~0.1.0: resolved "https://registry.yarnpkg.com/normalize-svg-path/-/normalize-svg-path-0.1.0.tgz#456360e60ece75fbef7b5d7e160480e7ffd16fe5" integrity sha1-RWNg5g7Odfvve11+FgSA5//Rb+U= +normalize-url@^1.0.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + normalize.css@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-8.0.1.tgz#9b98a208738b9cc2634caacbc42d131c97487bf3" @@ -6891,6 +6986,11 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + pretty-error@^2.0.2: version "2.1.1" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" @@ -6919,7 +7019,7 @@ promise-inflight@^1.0.1: resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= -prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: +prop-types@^15.5.6, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -7042,6 +7142,14 @@ quat-slerp@^1.0.0: dependencies: gl-quat "^1.0.0" +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -7132,6 +7240,15 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" +react-autosize-textarea@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/react-autosize-textarea/-/react-autosize-textarea-7.0.0.tgz#4f633e4238de7ba73c1da8fdc307353c50f1c5ab" + integrity sha512-rGQLpGUaELvzy3NKzp0kkcppaUtZTptsyR0PGuLotaJDjwRbT0DpD000yCzETpXseJQ/eMsyVGDDHXjXP93u8w== + dependencies: + autosize "^4.0.2" + line-height "^0.3.1" + prop-types "^15.5.6" + react-dom@^16.12.0: version "16.12.0" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.12.0.tgz#0da4b714b8d13c2038c9396b54a92baea633fe11" @@ -8143,6 +8260,13 @@ sockjs@0.3.19: faye-websocket "^0.10.0" uuid "^3.0.1" +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= + dependencies: + is-plain-obj "^1.0.0" + source-list-map@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" @@ -8410,6 +8534,11 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + string-split-by@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/string-split-by/-/string-split-by-1.0.0.tgz#53895fb3397ebc60adab1f1e3a131f5372586812" @@ -8540,6 +8669,18 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= +strip-outer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" + integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== + dependencies: + escape-string-regexp "^1.0.2" + +strip-url-auth@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-url-auth/-/strip-url-auth-1.0.1.tgz#22b0fa3a41385b33be3f331551bbb837fa0cd7ae" + integrity sha1-IrD6OkE4WzO+PzMVUbu4N/oM164= + strongly-connected-components@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strongly-connected-components/-/strongly-connected-components-1.0.1.tgz#0920e2b4df67c8eaee96c6b6234fe29e873dba99" @@ -8869,6 +9010,13 @@ trim-newlines@^1.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= +trim-repeated@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" + integrity sha1-42RqLqTokTEr9+rObPsFOAvAHCE= + dependencies: + escape-string-regexp "^1.0.2" + "true-case-path@^1.0.2": version "1.0.3" resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" @@ -9118,6 +9266,11 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"