From 5318b5e4aeb2bcb6959c2422ee7bb55c38fc46ea Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Sat, 29 Feb 2020 21:31:22 +0100 Subject: [PATCH] Moved "extension/ui" to "webview", removed "shared". --- README.md | 4 +- docs/exported/main/Main.png | Bin 0 -> 46806 bytes docs/main.plantuml | 12 ++++++ extension/package.json | 6 ++- extension/src/ConnectionHandler.ts | 2 +- extension/src/DataSource/DataSource.ts | 5 +-- extension/src/DataSource/DataSourceImpl.ts | 5 +-- extension/src/Server.ts | 10 ++++- extension/src/VsCodeDebugger.ts | 2 +- {shared => extension}/src/contract.ts | 0 extension/src/types.d.ts | 4 ++ extension/webpack.config.ts | 28 ++++++++----- package.json | 8 ++-- shared/package.json | 24 ----------- shared/src/index.ts | 1 - shared/tsconfig.json | 16 -------- webview/index.js | 5 +++ {extension/ui => webview}/package.json | 3 +- .../src/components}/ExpressionInput.tsx | 2 +- .../src/components}/GUI.tsx | 2 +- .../src/components}/NoData.tsx | 0 .../src/components}/Point.ts | 0 .../src/components}/SvgElements.tsx | 0 .../src/components}/Visualizer.tsx | 2 +- .../components}/VisualizerHeaderDetails.tsx | 4 +- {extension/ui => webview}/src/index.tsx | 8 ++-- .../src/Model => webview/src/model}/Model.ts | 6 +-- .../src/model}/MonacoBridge.ts | 0 .../Model => webview/src/model}/VsCodeApi.ts | 0 .../src/model}/lib.es5.d.ts.txt | 0 {extension/ui => webview}/src/playground.tsx | 0 .../ui => webview}/src/playground/index.tsx | 2 +- {extension/ui => webview}/src/style.scss | 0 .../src/visualizers}/AstVisualizer.tsx | 4 +- .../src/visualizers}/GridVisualizer.tsx | 0 .../src/visualizers}/PlotlyVisualizer.tsx | 0 .../src/visualizers}/SvgVisualizer.tsx | 0 .../TreeVisualizer/TreeVisualizer.tsx | 38 +++++++++--------- .../src/visualizers}/TreeVisualizer/Views.tsx | 4 +- .../visualizers}/TreeVisualizer/style.scss | 0 .../src/visualizers}/Visualizer.ts | 0 .../GraphvizDotVisualizer.tsx | 0 .../GraphvizGraphVisualizer.tsx | 0 .../VisJsGraphVisualizer.tsx | 0 .../src/visualizers}/index.ts | 12 +++--- .../src/visualizers}/style.scss | 0 .../MonacoTextVisualizer.tsx | 0 .../text-visualizers}/TextVisualizer.tsx | 0 .../src/visualizers}/types.d.ts | 0 .../ui => webview}/src/vscode-dark.scss | 0 .../ui => webview}/src/vscode-light.scss | 0 {extension/ui => webview}/tsconfig.json | 0 {extension/ui => webview}/webpack.config.js | 0 {extension/ui => webview}/webpack.config.ts | 7 +++- {extension/ui => webview}/yarn.lock | 0 yarn.lock | 34 +++++++++++++++- 56 files changed, 144 insertions(+), 116 deletions(-) create mode 100644 docs/exported/main/Main.png create mode 100644 docs/main.plantuml rename {shared => extension}/src/contract.ts (100%) delete mode 100644 shared/package.json delete mode 100644 shared/src/index.ts delete mode 100644 shared/tsconfig.json create mode 100644 webview/index.js rename {extension/ui => webview}/package.json (96%) rename {extension/ui/src/Components => webview/src/components}/ExpressionInput.tsx (98%) rename {extension/ui/src/Components => webview/src/components}/GUI.tsx (98%) rename {extension/ui/src/Components => webview/src/components}/NoData.tsx (100%) rename {extension/ui/src/Components => webview/src/components}/Point.ts (100%) rename {extension/ui/src/Components => webview/src/components}/SvgElements.tsx (100%) rename {extension/ui/src/Components => webview/src/components}/Visualizer.tsx (96%) rename {extension/ui/src/Components => webview/src/components}/VisualizerHeaderDetails.tsx (97%) rename {extension/ui => webview}/src/index.tsx (77%) rename {extension/ui/src/Model => webview/src/model}/Model.ts (96%) rename {extension/ui/src/Model => webview/src/model}/MonacoBridge.ts (100%) rename {extension/ui/src/Model => webview/src/model}/VsCodeApi.ts (100%) rename {extension/ui/src/Model => webview/src/model}/lib.es5.d.ts.txt (100%) rename {extension/ui => webview}/src/playground.tsx (100%) rename {extension/ui => webview}/src/playground/index.tsx (94%) rename {extension/ui => webview}/src/style.scss (100%) rename {extension/ui/src/Visualizers => webview/src/visualizers}/AstVisualizer.tsx (98%) rename {extension/ui/src/Visualizers => webview/src/visualizers}/GridVisualizer.tsx (100%) rename {extension/ui/src/Visualizers => webview/src/visualizers}/PlotlyVisualizer.tsx (100%) rename {extension/ui/src/Visualizers => webview/src/visualizers}/SvgVisualizer.tsx (100%) rename extension/ui/src/Visualizers/TreeVisualizer/Visualizer.tsx => webview/src/visualizers/TreeVisualizer/TreeVisualizer.tsx (100%) rename {extension/ui/src/Visualizers => webview/src/visualizers}/TreeVisualizer/Views.tsx (99%) rename {extension/ui/src/Visualizers => webview/src/visualizers}/TreeVisualizer/style.scss (100%) rename {extension/ui/src/Visualizers => webview/src/visualizers}/Visualizer.ts (100%) rename {extension/ui/src/Visualizers/GraphVisualizer => webview/src/visualizers/graph-visualizers}/GraphvizDotVisualizer.tsx (100%) rename {extension/ui/src/Visualizers/GraphVisualizer => webview/src/visualizers/graph-visualizers}/GraphvizGraphVisualizer.tsx (100%) rename {extension/ui/src/Visualizers/GraphVisualizer => webview/src/visualizers/graph-visualizers}/VisJsGraphVisualizer.tsx (100%) rename {extension/ui/src/Visualizers => webview/src/visualizers}/index.ts (57%) rename {extension/ui/src/Visualizers => webview/src/visualizers}/style.scss (100%) rename {extension/ui/src/Visualizers/TextVisualizer => webview/src/visualizers/text-visualizers}/MonacoTextVisualizer.tsx (100%) rename {extension/ui/src/Visualizers/TextVisualizer => webview/src/visualizers/text-visualizers}/TextVisualizer.tsx (100%) rename {extension/ui/src/Visualizers => webview/src/visualizers}/types.d.ts (100%) rename {extension/ui => webview}/src/vscode-dark.scss (100%) rename {extension/ui => webview}/src/vscode-light.scss (100%) rename {extension/ui => webview}/tsconfig.json (100%) rename {extension/ui => webview}/webpack.config.js (100%) rename {extension/ui => webview}/webpack.config.ts (89%) rename {extension/ui => webview}/yarn.lock (100%) diff --git a/README.md b/README.md index b11600f..c9fd0d5 100644 --- a/README.md +++ b/README.md @@ -15,10 +15,12 @@ You can get the extension in the [marketplace](https://marketplace.visualstudio. ## Dev Instructions +This project uses yarn workspaces. + - Clone the repository - Run `yarn` in the repository root - Run `yarn build` initially (or `yarn dev` for every project) -- Run `yarn dev` **inside** the project you are working on. +- Run `yarn dev` for the project you are working on. For the UI, `yarn dev` will start a webserver that you can access on port 8080. You can use VS Code do launch and debug the extension. diff --git a/docs/exported/main/Main.png b/docs/exported/main/Main.png new file mode 100644 index 0000000000000000000000000000000000000000..0c1c34a66f2f4b57f583f4c7b4598ab93aca37a6 GIT binary patch literal 46806 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 [debug-visualizer]: "Uses RPC contracts, connects using websockets" +[debug-visualizer] ..> [debug-visualizer-webview]: "Opens Webview in VS Code" + +[debug-visualizer] ..> [data-extraction]: "Injects Runtime into JavaScript applications" + +@enduml \ No newline at end of file diff --git a/extension/package.json b/extension/package.json index 7c6d393..4d5ad3b 100644 --- a/extension/package.json +++ b/extension/package.json @@ -1,5 +1,6 @@ { "name": "debug-visualizer", + "private": true, "displayName": "Debug Visualizer", "description": "An extension that visualizes values while debugging.", "icon": "docs/logo.png", @@ -49,7 +50,7 @@ "pub": "vsce publish --yarn --baseImagesUrl https://github.com/hediet/vscode-debug-visualizer/raw/master/extension --baseContentUrl https://github.com/hediet/vscode-debug-visualizer/raw/master/extension", "vscode:prepublish": "yarn build", "build": "webpack --mode production", - "dev": "tsc -watch -p ./" + "dev": "shx rm -rf dist && tsc -watch -p ./" }, "dependencies": { "@hediet/std": "^0.6.0", @@ -74,6 +75,7 @@ "typescript": "^3.8.2", "webpack": "^4.41.6", "webpack-cli": "^3.3.11", - "ts-loader": "^6.2.1" + "ts-loader": "^6.2.1", + "shx": "^0.3.2" } } diff --git a/extension/src/ConnectionHandler.ts b/extension/src/ConnectionHandler.ts index 4256382..0f0cb5f 100644 --- a/extension/src/ConnectionHandler.ts +++ b/extension/src/ConnectionHandler.ts @@ -1,5 +1,5 @@ import { Disposable } from "@hediet/std/disposable"; -import { debugVisualizerUIContract } from "@hediet/debug-visualizer-vscode-shared"; +import { debugVisualizerUIContract } from "./contract"; import { ConsoleRpcLogger, RequestHandlingError } from "@hediet/typed-json-rpc"; import { EvaluationWatcher, DataSource } from "./DataSource/DataSource"; import { WebSocketStream } from "@hediet/typed-json-rpc-websocket"; diff --git a/extension/src/DataSource/DataSource.ts b/extension/src/DataSource/DataSource.ts index a8ea47f..be13202 100644 --- a/extension/src/DataSource/DataSource.ts +++ b/extension/src/DataSource/DataSource.ts @@ -1,8 +1,5 @@ import { DataExtractorId } from "@hediet/debug-visualizer-data-extraction"; -import { - DataExtractionState, - CompletionItem, -} from "@hediet/debug-visualizer-vscode-shared"; +import { DataExtractionState, CompletionItem } from "../contract"; export interface DataSource { createEvaluationWatcher( diff --git a/extension/src/DataSource/DataSourceImpl.ts b/extension/src/DataSource/DataSourceImpl.ts index e6292b6..7f27b98 100644 --- a/extension/src/DataSource/DataSourceImpl.ts +++ b/extension/src/DataSource/DataSourceImpl.ts @@ -6,10 +6,7 @@ import { import { observable, autorun, action } from "mobx"; import { Disposable } from "@hediet/std/disposable"; import { DataExtractorId } from "@hediet/debug-visualizer-data-extraction"; -import { - DataExtractionState, - CompletionItem, -} from "@hediet/debug-visualizer-vscode-shared"; +import { DataExtractionState, CompletionItem } from "../contract"; import { hotClass } from "@hediet/node-reload"; import { VsCodeDebuggerView } from "../VsCodeDebugger"; import { DataExtractionProviderFactory } from "./DataExtractionProvider/DataExtractionProvider"; diff --git a/extension/src/Server.ts b/extension/src/Server.ts index a7bb61c..0136b49 100644 --- a/extension/src/Server.ts +++ b/extension/src/Server.ts @@ -1,7 +1,6 @@ import { WebSocketStream } from "@hediet/typed-json-rpc-websocket"; import { AddressInfo } from "net"; import WebSocket = require("ws"); -import { join } from "path"; import { ConnectionHandler } from "./ConnectionHandler"; import { Sources } from "./DataSource"; import * as express from "express"; @@ -9,6 +8,7 @@ import * as http from "http"; import * as serveStatic from "serve-static"; import { Config } from "./Config"; import cryptoRandomString = require("crypto-random-string"); +import { distPath } from "debug-visualizer-webview"; export class Server { private server: http.Server; @@ -16,11 +16,17 @@ export class Server { constructor(sources: Sources, config: Config) { const app = express(); - const distPath = join(__dirname, "../ui/dist"); + app.use(serveStatic(distPath)); this.server = app.listen(); + console.log( + `Serving "${distPath}" on port ${ + (this.server.address() as AddressInfo).port + }` + ); + const wss = new WebSocket.Server({ server: this.server }); wss.on("connection", ws => { const stream = new WebSocketStream(ws); diff --git a/extension/src/VsCodeDebugger.ts b/extension/src/VsCodeDebugger.ts index 31fc397..97f0895 100644 --- a/extension/src/VsCodeDebugger.ts +++ b/extension/src/VsCodeDebugger.ts @@ -1,7 +1,7 @@ import { Disposable } from "@hediet/std/disposable"; import { debug, DebugSession } from "vscode"; import { EventEmitter } from "@hediet/std/events"; -import { CompletionItem } from "@hediet/debug-visualizer-vscode-shared"; +import { CompletionItem } from "./contract"; import { observable, runInAction } from "mobx"; export class VsCodeDebugger { diff --git a/shared/src/contract.ts b/extension/src/contract.ts similarity index 100% rename from shared/src/contract.ts rename to extension/src/contract.ts diff --git a/extension/src/types.d.ts b/extension/src/types.d.ts index 33a08b8..ef361e7 100644 --- a/extension/src/types.d.ts +++ b/extension/src/types.d.ts @@ -4,3 +4,7 @@ declare namespace NodeJS { USE_DEV_UI?: "true"; } } + +declare module "debug-visualizer-webview" { + export const distPath: string; +} diff --git a/extension/webpack.config.ts b/extension/webpack.config.ts index 42f2beb..0881eb4 100644 --- a/extension/webpack.config.ts +++ b/extension/webpack.config.ts @@ -2,6 +2,7 @@ import * as webpack from "webpack"; import path = require("path"); import { CleanWebpackPlugin } from "clean-webpack-plugin"; import CopyPlugin = require("copy-webpack-plugin"); +import { readFileSync } from "fs"; const r = (file: string) => path.resolve(__dirname, file); @@ -19,6 +20,7 @@ module.exports = { vscode: "commonjs vscode", "@hediet/debug-visualizer-data-extraction": "@hediet/debug-visualizer-data-extraction", + "debug-visualizer-webview": "debug-visualizer-webview", }, resolve: { extensions: [".ts", ".js"], @@ -41,14 +43,22 @@ module.exports = { }, plugins: [ new CleanWebpackPlugin(), - new CopyPlugin([ - { - from: r("../data-extraction/"), - to: r( - "./dist/node_modules/@hediet/debug-visualizer-data-extraction/" - ), - ignore: ["**/node_modules/**/*"], - }, - ]), + includeDependency(r("../data-extraction/")), + includeDependency(r("../webview/")), ], } as webpack.Configuration; + +function includeDependency(location: string) { + const content = readFileSync(path.join(location, "package.json"), { + encoding: "utf8", + }); + const pkgName = JSON.parse(content).name; + + return new CopyPlugin([ + { + from: location, + to: r(`./dist/node_modules/${pkgName}`), + ignore: ["**/node_modules/**/*"], + }, + ]); +} diff --git a/package.json b/package.json index dc69cdd..0afa6a6 100644 --- a/package.json +++ b/package.json @@ -1,16 +1,14 @@ { "private": true, "workspaces": [ - "./shared", "./data-extraction", "./extension", - "./extension/ui" + "./webview" ], "scripts": { - "build": "yarn build-data-extraction && yarn build-shared && yarn build-extension && yarn build-ui", + "build": "yarn build-data-extraction && yarn build-extension && yarn build-ui", "build-data-extraction": "yarn workspace @hediet/debug-visualizer-data-extraction build", - "build-shared": "yarn workspace @hediet/debug-visualizer-vscode-shared build", "build-extension": "yarn workspace debug-visualizer build", - "build-ui": "yarn workspace debug-visualizer-ui build" + "build-ui": "yarn workspace debug-visualizer-webview build" } } diff --git a/shared/package.json b/shared/package.json deleted file mode 100644 index cfc6e49..0000000 --- a/shared/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "@hediet/debug-visualizer-vscode-shared", - "private": true, - "version": "1.0.0", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "author": { - "name": "Henning Dieterichs", - "email": "henning.dieterichs@live.de" - }, - "license": "MIT", - "files": [ - "dist", - "src" - ], - "scripts": { - "dev": "tsc --watch", - "build": "tsc" - }, - "dependencies": { - "@hediet/std": "^0.6.0", - "@hediet/typed-json-rpc": "^0.7.7" - } -} diff --git a/shared/src/index.ts b/shared/src/index.ts deleted file mode 100644 index 52ef7a8..0000000 --- a/shared/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./contract"; diff --git a/shared/tsconfig.json b/shared/tsconfig.json deleted file mode 100644 index 02e20c7..0000000 --- a/shared/tsconfig.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "compilerOptions": { - "target": "esnext", - "module": "commonjs", - "strict": true, - "outDir": "dist", - "skipLibCheck": true, - "rootDir": "./src", - "resolveJsonModule": true, - "declaration": true, - "declarationMap": true, - "newLine": "LF", - "sourceMap": true - }, - "include": ["./src/**/*"] -} diff --git a/webview/index.js b/webview/index.js new file mode 100644 index 0000000..82a7dea --- /dev/null +++ b/webview/index.js @@ -0,0 +1,5 @@ +// 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/extension/ui/package.json b/webview/package.json similarity index 96% rename from extension/ui/package.json rename to webview/package.json index a40f6e6..f1ac8c8 100644 --- a/extension/ui/package.json +++ b/webview/package.json @@ -1,11 +1,12 @@ { - "name": "debug-visualizer-ui", + "name": "debug-visualizer-webview", "version": "0.0.1", "scripts": { "dev": "webpack-dev-server --hot", "dev-playground": "webpack-dev-server --hot --port 8090 --playground", "build": "webpack" }, + "main": "./index.js", "dependencies": { "@blueprintjs/core": "^3.23.1", "@hediet/std": "^0.6.0", diff --git a/extension/ui/src/Components/ExpressionInput.tsx b/webview/src/components/ExpressionInput.tsx similarity index 98% rename from extension/ui/src/Components/ExpressionInput.tsx rename to webview/src/components/ExpressionInput.tsx index 53420ce..955b399 100644 --- a/extension/ui/src/Components/ExpressionInput.tsx +++ b/webview/src/components/ExpressionInput.tsx @@ -1,5 +1,5 @@ import React = require("react"); -import { Model } from "../Model/Model"; +import { Model } from "../model/Model"; import { observer, disposeOnUnmount } from "mobx-react"; import { observable, action, autorun } from "mobx"; import * as monaco from "monaco-editor"; diff --git a/extension/ui/src/Components/GUI.tsx b/webview/src/components/GUI.tsx similarity index 98% rename from extension/ui/src/Components/GUI.tsx rename to webview/src/components/GUI.tsx index af71e3a..c761ada 100644 --- a/extension/ui/src/Components/GUI.tsx +++ b/webview/src/components/GUI.tsx @@ -2,7 +2,7 @@ import React = require("react"); import { Button, Spinner } from "@blueprintjs/core"; import { observable, action } from "mobx"; import { observer } from "mobx-react"; -import { Model } from "../Model/Model"; +import { Model } from "../model/Model"; import { ExpressionInput } from "./ExpressionInput"; import { Visualizer } from "./Visualizer"; import classnames = require("classnames"); diff --git a/extension/ui/src/Components/NoData.tsx b/webview/src/components/NoData.tsx similarity index 100% rename from extension/ui/src/Components/NoData.tsx rename to webview/src/components/NoData.tsx diff --git a/extension/ui/src/Components/Point.ts b/webview/src/components/Point.ts similarity index 100% rename from extension/ui/src/Components/Point.ts rename to webview/src/components/Point.ts diff --git a/extension/ui/src/Components/SvgElements.tsx b/webview/src/components/SvgElements.tsx similarity index 100% rename from extension/ui/src/Components/SvgElements.tsx rename to webview/src/components/SvgElements.tsx diff --git a/extension/ui/src/Components/Visualizer.tsx b/webview/src/components/Visualizer.tsx similarity index 96% rename from extension/ui/src/Components/Visualizer.tsx rename to webview/src/components/Visualizer.tsx index 5b5ce89..c52a7ff 100644 --- a/extension/ui/src/Components/Visualizer.tsx +++ b/webview/src/components/Visualizer.tsx @@ -1,5 +1,5 @@ import React = require("react"); -import { Model } from "../Model/Model"; +import { Model } from "../model/Model"; import { observer } from "mobx-react"; import { NoData } from "./NoData"; diff --git a/extension/ui/src/Components/VisualizerHeaderDetails.tsx b/webview/src/components/VisualizerHeaderDetails.tsx similarity index 97% rename from extension/ui/src/Components/VisualizerHeaderDetails.tsx rename to webview/src/components/VisualizerHeaderDetails.tsx index e8325bc..28dfcc4 100644 --- a/extension/ui/src/Components/VisualizerHeaderDetails.tsx +++ b/webview/src/components/VisualizerHeaderDetails.tsx @@ -3,8 +3,8 @@ import { Popover } from "@blueprintjs/core"; import { DataExtractorInfo } from "@hediet/debug-visualizer-data-extraction"; import { computed } from "mobx"; import { observer } from "mobx-react"; -import { Model } from "../Model/Model"; -import { VisualizationId } from "../Visualizers/Visualizer"; +import { Model } from "../model/Model"; +import { VisualizationId } from "../visualizers/Visualizer"; @observer export class VisualizerHeaderDetails extends React.Component<{ model: Model }> { diff --git a/extension/ui/src/index.tsx b/webview/src/index.tsx similarity index 77% rename from extension/ui/src/index.tsx rename to webview/src/index.tsx index ef1fa8f..2892db2 100644 --- a/extension/ui/src/index.tsx +++ b/webview/src/index.tsx @@ -1,8 +1,8 @@ import * as React from "react"; import * as ReactDOM from "react-dom"; import "./style.scss"; -import { Model } from "./Model/Model"; -import Components = require("./Components/GUI"); +import { Model } from "./model/Model"; +import Components = require("./components/GUI"); const model = new Model(); @@ -15,7 +15,7 @@ if (model.runningMode !== "webView") { } function render(target: HTMLDivElement) { - const c = require("./Components/GUI") as typeof Components; + const c = require("./components/GUI") as typeof Components; ReactDOM.render(, target); } @@ -31,7 +31,7 @@ declare var module: { declare var require: (name: string) => any; if (module.hot) { - module.hot.accept("./Components/GUI", () => { + module.hot.accept("./components/GUI", () => { render(target); }); } diff --git a/extension/ui/src/Model/Model.ts b/webview/src/model/Model.ts similarity index 96% rename from extension/ui/src/Model/Model.ts rename to webview/src/model/Model.ts index ee83890..dec9a63 100644 --- a/extension/ui/src/Model/Model.ts +++ b/webview/src/model/Model.ts @@ -1,13 +1,13 @@ import { debugVisualizerUIContract, DataExtractionState, -} from "@hediet/debug-visualizer-vscode-shared"; +} from "debug-visualizer/src/contract"; import { WebSocketStream } from "@hediet/typed-json-rpc-websocket"; import { ConsoleRpcLogger } from "@hediet/typed-json-rpc"; import { observable, action, computed, when, autorun } from "mobx"; import { DataExtractorId } from "@hediet/debug-visualizer-data-extraction"; -import { Visualization, VisualizationId } from "../Visualizers/Visualizer"; -import { knownVisualizations } from "../Visualizers"; +import { Visualization, VisualizationId } from "../visualizers/Visualizer"; +import { knownVisualizations } from "../visualizers"; import { getApi as getVsCodeApi } from "./VsCodeApi"; import { MonacoBridge } from "./MonacoBridge"; import { Disposable } from "@hediet/std/disposable"; diff --git a/extension/ui/src/Model/MonacoBridge.ts b/webview/src/model/MonacoBridge.ts similarity index 100% rename from extension/ui/src/Model/MonacoBridge.ts rename to webview/src/model/MonacoBridge.ts diff --git a/extension/ui/src/Model/VsCodeApi.ts b/webview/src/model/VsCodeApi.ts similarity index 100% rename from extension/ui/src/Model/VsCodeApi.ts rename to webview/src/model/VsCodeApi.ts diff --git a/extension/ui/src/Model/lib.es5.d.ts.txt b/webview/src/model/lib.es5.d.ts.txt similarity index 100% rename from extension/ui/src/Model/lib.es5.d.ts.txt rename to webview/src/model/lib.es5.d.ts.txt diff --git a/extension/ui/src/playground.tsx b/webview/src/playground.tsx similarity index 100% rename from extension/ui/src/playground.tsx rename to webview/src/playground.tsx diff --git a/extension/ui/src/playground/index.tsx b/webview/src/playground/index.tsx similarity index 94% rename from extension/ui/src/playground/index.tsx rename to webview/src/playground/index.tsx index c6304de..837c3cb 100644 --- a/extension/ui/src/playground/index.tsx +++ b/webview/src/playground/index.tsx @@ -1,6 +1,6 @@ import React = require("react"); import "../style.scss"; -import { DecoratedGridComponent } from "../Visualizers/GridVisualizer"; +import { DecoratedGridComponent } from "../visualizers/GridVisualizer"; import { observable } from "mobx"; import { observer } from "mobx-react"; diff --git a/extension/ui/src/style.scss b/webview/src/style.scss similarity index 100% rename from extension/ui/src/style.scss rename to webview/src/style.scss diff --git a/extension/ui/src/Visualizers/AstVisualizer.tsx b/webview/src/visualizers/AstVisualizer.tsx similarity index 98% rename from extension/ui/src/Visualizers/AstVisualizer.tsx rename to webview/src/visualizers/AstVisualizer.tsx index e2b1b52..68eb11c 100644 --- a/extension/ui/src/Visualizers/AstVisualizer.tsx +++ b/webview/src/visualizers/AstVisualizer.tsx @@ -8,13 +8,13 @@ import { isCommonDataType, CommonDataTypes, } from "@hediet/debug-visualizer-data-extraction"; -import { createTreeViewModelFromTreeNodeData } from "./TreeVisualizer/Visualizer"; +import { createTreeViewModelFromTreeNodeData } from "./TreeVisualizer/TreeVisualizer"; import { TreeWithPathView, TreeViewModel } from "./TreeVisualizer/Views"; import React = require("react"); import { observer, disposeOnUnmount } from "mobx-react"; import { observable, autorun, trace } from "mobx"; import * as monaco from "monaco-editor"; -import { getLanguageId } from "./TextVisualizer/MonacoTextVisualizer"; +import { getLanguageId } from "./text-visualizers/MonacoTextVisualizer"; import LineColumn = require("line-column"); export class AstVisualizer extends VisualizationProvider { diff --git a/extension/ui/src/Visualizers/GridVisualizer.tsx b/webview/src/visualizers/GridVisualizer.tsx similarity index 100% rename from extension/ui/src/Visualizers/GridVisualizer.tsx rename to webview/src/visualizers/GridVisualizer.tsx diff --git a/extension/ui/src/Visualizers/PlotlyVisualizer.tsx b/webview/src/visualizers/PlotlyVisualizer.tsx similarity index 100% rename from extension/ui/src/Visualizers/PlotlyVisualizer.tsx rename to webview/src/visualizers/PlotlyVisualizer.tsx diff --git a/extension/ui/src/Visualizers/SvgVisualizer.tsx b/webview/src/visualizers/SvgVisualizer.tsx similarity index 100% rename from extension/ui/src/Visualizers/SvgVisualizer.tsx rename to webview/src/visualizers/SvgVisualizer.tsx diff --git a/extension/ui/src/Visualizers/TreeVisualizer/Visualizer.tsx b/webview/src/visualizers/TreeVisualizer/TreeVisualizer.tsx similarity index 100% rename from extension/ui/src/Visualizers/TreeVisualizer/Visualizer.tsx rename to webview/src/visualizers/TreeVisualizer/TreeVisualizer.tsx index ccd6a7e..42726de 100644 --- a/extension/ui/src/Visualizers/TreeVisualizer/Visualizer.tsx +++ b/webview/src/visualizers/TreeVisualizer/TreeVisualizer.tsx @@ -16,6 +16,25 @@ import { } from "../Visualizer"; import React = require("react"); +export class TreeVisualizer extends VisualizationProvider { + getVisualizations( + data: ExtractedData, + collector: VisualizationCollector + ): void { + if (isCommonDataType(data, { tree: true })) { + collector.addVisualization({ + id: asVisualizationId("tree"), + name: "Tree", + priority: 100, + render() { + const m = createTreeViewModelFromTreeNodeData(data.root); + return ; + }, + }); + } + } +} + export function createTreeViewModelFromTreeNodeData( root: TreeNode ): TreeViewModel { @@ -46,22 +65,3 @@ export function createTreeViewModelFromTreeNodeData( return model; } } - -export class TreeVisualizer extends VisualizationProvider { - getVisualizations( - data: ExtractedData, - collector: VisualizationCollector - ): void { - if (isCommonDataType(data, { tree: true })) { - collector.addVisualization({ - id: asVisualizationId("tree"), - name: "Tree", - priority: 100, - render() { - const m = createTreeViewModelFromTreeNodeData(data.root); - return ; - }, - }); - } - } -} diff --git a/extension/ui/src/Visualizers/TreeVisualizer/Views.tsx b/webview/src/visualizers/TreeVisualizer/Views.tsx similarity index 99% rename from extension/ui/src/Visualizers/TreeVisualizer/Views.tsx rename to webview/src/visualizers/TreeVisualizer/Views.tsx index 697413a..b2e6247 100644 --- a/extension/ui/src/Visualizers/TreeVisualizer/Views.tsx +++ b/webview/src/visualizers/TreeVisualizer/Views.tsx @@ -2,8 +2,8 @@ import { observer, disposeOnUnmount } from "mobx-react"; import { observable, autorun, computed, action, runInAction } from "mobx"; import React = require("react"); import classNames = require("classnames"); -import { Rectangle, Point } from "../../Components/Point"; -import { SvgLine } from "../../Components/SvgElements"; +import { Rectangle, Point } from "../../components/Point"; +import { SvgLine } from "../../components/SvgElements"; import "./style.scss"; export class TreeViewModel { diff --git a/extension/ui/src/Visualizers/TreeVisualizer/style.scss b/webview/src/visualizers/TreeVisualizer/style.scss similarity index 100% rename from extension/ui/src/Visualizers/TreeVisualizer/style.scss rename to webview/src/visualizers/TreeVisualizer/style.scss diff --git a/extension/ui/src/Visualizers/Visualizer.ts b/webview/src/visualizers/Visualizer.ts similarity index 100% rename from extension/ui/src/Visualizers/Visualizer.ts rename to webview/src/visualizers/Visualizer.ts diff --git a/extension/ui/src/Visualizers/GraphVisualizer/GraphvizDotVisualizer.tsx b/webview/src/visualizers/graph-visualizers/GraphvizDotVisualizer.tsx similarity index 100% rename from extension/ui/src/Visualizers/GraphVisualizer/GraphvizDotVisualizer.tsx rename to webview/src/visualizers/graph-visualizers/GraphvizDotVisualizer.tsx diff --git a/extension/ui/src/Visualizers/GraphVisualizer/GraphvizGraphVisualizer.tsx b/webview/src/visualizers/graph-visualizers/GraphvizGraphVisualizer.tsx similarity index 100% rename from extension/ui/src/Visualizers/GraphVisualizer/GraphvizGraphVisualizer.tsx rename to webview/src/visualizers/graph-visualizers/GraphvizGraphVisualizer.tsx diff --git a/extension/ui/src/Visualizers/GraphVisualizer/VisJsGraphVisualizer.tsx b/webview/src/visualizers/graph-visualizers/VisJsGraphVisualizer.tsx similarity index 100% rename from extension/ui/src/Visualizers/GraphVisualizer/VisJsGraphVisualizer.tsx rename to webview/src/visualizers/graph-visualizers/VisJsGraphVisualizer.tsx diff --git a/extension/ui/src/Visualizers/index.ts b/webview/src/visualizers/index.ts similarity index 57% rename from extension/ui/src/Visualizers/index.ts rename to webview/src/visualizers/index.ts index 8e34328..8df895f 100644 --- a/extension/ui/src/Visualizers/index.ts +++ b/webview/src/visualizers/index.ts @@ -1,13 +1,13 @@ import "./style.scss"; import { ComposedVisualizationProvider } from "./Visualizer"; -import { TreeVisualizer } from "./TreeVisualizer/Visualizer"; -import { GraphvizGraphVisualizer } from "./GraphVisualizer/GraphvizGraphVisualizer"; +import { TreeVisualizer } from "./TreeVisualizer/TreeVisualizer"; +import { GraphvizGraphVisualizer } from "./graph-visualizers/GraphvizGraphVisualizer"; import { SvgVisualizer } from "./SvgVisualizer"; -import { GraphvizDotVisualizer } from "./GraphVisualizer/GraphvizDotVisualizer"; -import { TextVisualizer } from "./TextVisualizer/TextVisualizer"; -import { MonacoTextVisualizer } from "./TextVisualizer/MonacoTextVisualizer"; +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 "./GraphVisualizer/VisJsGraphVisualizer"; +import { VisJsGraphVisualizer } from "./graph-visualizers/VisJsGraphVisualizer"; import { PlotlyVisualizer } from "./PlotlyVisualizer"; import { GridVisualizer } from "./GridVisualizer"; diff --git a/extension/ui/src/Visualizers/style.scss b/webview/src/visualizers/style.scss similarity index 100% rename from extension/ui/src/Visualizers/style.scss rename to webview/src/visualizers/style.scss diff --git a/extension/ui/src/Visualizers/TextVisualizer/MonacoTextVisualizer.tsx b/webview/src/visualizers/text-visualizers/MonacoTextVisualizer.tsx similarity index 100% rename from extension/ui/src/Visualizers/TextVisualizer/MonacoTextVisualizer.tsx rename to webview/src/visualizers/text-visualizers/MonacoTextVisualizer.tsx diff --git a/extension/ui/src/Visualizers/TextVisualizer/TextVisualizer.tsx b/webview/src/visualizers/text-visualizers/TextVisualizer.tsx similarity index 100% rename from extension/ui/src/Visualizers/TextVisualizer/TextVisualizer.tsx rename to webview/src/visualizers/text-visualizers/TextVisualizer.tsx diff --git a/extension/ui/src/Visualizers/types.d.ts b/webview/src/visualizers/types.d.ts similarity index 100% rename from extension/ui/src/Visualizers/types.d.ts rename to webview/src/visualizers/types.d.ts diff --git a/extension/ui/src/vscode-dark.scss b/webview/src/vscode-dark.scss similarity index 100% rename from extension/ui/src/vscode-dark.scss rename to webview/src/vscode-dark.scss diff --git a/extension/ui/src/vscode-light.scss b/webview/src/vscode-light.scss similarity index 100% rename from extension/ui/src/vscode-light.scss rename to webview/src/vscode-light.scss diff --git a/extension/ui/tsconfig.json b/webview/tsconfig.json similarity index 100% rename from extension/ui/tsconfig.json rename to webview/tsconfig.json diff --git a/extension/ui/webpack.config.js b/webview/webpack.config.js similarity index 100% rename from extension/ui/webpack.config.js rename to webview/webpack.config.js diff --git a/extension/ui/webpack.config.ts b/webview/webpack.config.ts similarity index 89% rename from extension/ui/webpack.config.ts rename to webview/webpack.config.ts index 986e780..6393e27 100644 --- a/extension/ui/webpack.config.ts +++ b/webview/webpack.config.ts @@ -47,7 +47,12 @@ module.exports = { new CleanWebpackPlugin(), ]; if (mode === "default") { - plugins.push(new MonacoWebpackPlugin()); + plugins.push( + new MonacoWebpackPlugin({ + // Add more languages here once webworker issues are solved. + languages: ["typescript"], + }) + ); } return plugins; })(), diff --git a/extension/ui/yarn.lock b/webview/yarn.lock similarity index 100% rename from extension/ui/yarn.lock rename to webview/yarn.lock diff --git a/yarn.lock b/yarn.lock index 5b9f64a..3f344f8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2906,6 +2906,11 @@ es6-iterator@^2.0.3, es6-iterator@~2.0.3: es5-ext "^0.10.35" es6-symbol "^3.1.1" +es6-object-assign@^1.0.3: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" + integrity sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw= + es6-promise@^3.0.2: version "3.3.1" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" @@ -4659,7 +4664,7 @@ internal-ip@^4.3.0: default-gateway "^4.2.0" ipaddr.js "^1.9.0" -interpret@1.2.0: +interpret@1.2.0, interpret@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== @@ -7292,6 +7297,13 @@ readdirp@^3.1.1: dependencies: picomatch "^2.0.4" +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" @@ -7581,7 +7593,7 @@ resolve@^0.6.1: resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.6.3.tgz#dd957982e7e736debdf53b58a4dd91754575dd46" integrity sha1-3ZV5gufnNt699TtYpN2RdUV13UY= -resolve@^1.0.0, resolve@^1.1.5: +resolve@^1.0.0, resolve@^1.1.5, resolve@^1.1.6: version "1.15.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== @@ -7979,6 +7991,24 @@ shebang-regex@^1.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= +shelljs@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.3.tgz#a7f3319520ebf09ee81275b2368adb286659b097" + integrity sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +shx@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/shx/-/shx-0.3.2.tgz#40501ce14eb5e0cbcac7ddbd4b325563aad8c123" + integrity sha512-aS0mWtW3T2sHAenrSrip2XGv39O9dXIFUqxAEWHEOS1ePtGIBavdPJY1kE2IHl14V/4iCbUiNDPGdyYTtmhSoA== + dependencies: + es6-object-assign "^1.0.3" + minimist "^1.2.0" + shelljs "^0.8.1" + signal-exit@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"