From 17be6029063f7f3601402b64ed9a9b66de91f399 Mon Sep 17 00:00:00 2001 From: Henning Dieterichs Date: Sat, 22 Aug 2020 19:47:15 +0200 Subject: [PATCH] Updates docs. --- CONTRIBUTING.md | 12 +- docs/exported/main/Main.png | Bin 19679 -> 17380 bytes docs/main.plantuml | 6 +- extension/README.md | 230 ++++-------------------------------- 4 files changed, 31 insertions(+), 217 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 98bec34..2e5ac6b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -42,16 +42,10 @@ Implements the UI and is hosted inside a webview in VS Code. Can be opened in a browser window. Uses websockets and JSON RPC to communicate with the extension. -### visualization +### hediet/visualization -Contains React components that visualize various JSON documents. -Also provides infrastructure for selecting the best visualization for a given JSON document. - -### visualization-playground - -A playground to test and play with the visualizations for the web. -Is hosted at [https://hediet.github.io/vscode-debug-visualizer/](https://hediet.github.io/vscode-debug-visualizer/). -Aims to have fast build times. +Contains all the visualizers and visualization infrastructure. +This external project can be found [here](https://github.com/hediet/visualization). ### extension diff --git a/docs/exported/main/Main.png b/docs/exported/main/Main.png index 035055950b3282fd32ba4c47f1dae588bb3d1125..90801fcea5a74ece073e3ada85f557659da372ea 100644 GIT binary patch literal 17380 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%0A54b$l~1kW+V| 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 J5z+Vm{{ReexxWAa literal 19679 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 [extension]: "Uses RPC contracts, connects using websockets" [extension] ..> [webview]: "Loads into a Webview in VS Code" -[webview] ..> [visualization]: "Uses React Components" +[webview] ..> [hediet/visualization]: "Uses React Components" -[visualization-playground] ..> [visualization]: "Uses React Components" [extension] ..> [data-extraction]: "Injects Runtime into JavaScript applications" diff --git a/extension/README.md b/extension/README.md index 721fdd8..44ebac4 100644 --- a/extension/README.md +++ b/extension/README.md @@ -3,7 +3,7 @@ [![](https://img.shields.io/twitter/follow/hediet_dev.svg?style=social)](https://twitter.com/intent/follow?screen_name=hediet_dev) A VS Code extension for visualizing data structures while debugging. -Like the VS Code's watch view, but with custom visualizations. +Like the VS Code's watch view, but with rich visualizations of the watched value. ![](../docs/demo.gif) @@ -11,7 +11,7 @@ Like the VS Code's watch view, but with custom visualizations. See [demos](../demos/) for demos. These languages and debuggers are verified to work with this extension: -- JavaScript/TypeScript/... using `node`/`node2`/`extensionHost` or `chrome` debug adapter: [⭐ Full Support](../demos/js) +- JavaScript/TypeScript/... using `node`/`node2`/`extensionHost`/`chrome`/`pwa-chrome`/`pwa-node` debug adapter: [⭐ Full Support](../demos/js) - Go using `go` (Delve) debug adapter: [✅ Rudimentary Support](../demos/golang) - Python using `python` debug adapter: [✅ Rudimentary Support](../demos/python) - C# using `coreclr` debug adapter: [✅ Rudimentary Support](../demos/csharp) @@ -29,20 +29,19 @@ Fully supported languages offer _Data Extractors_ which convert some well known After installing this extension, use the command `Debug Visualizer: New View` to open a new visualizer view. In this view you can enter an expression that is evaluated and visualized while stepping through your application. -This view works the same as the watch view of VS Code, except that the resulting value is presented visually rather than textually. +This view works the same as the watch view of VS Code, except that the resulting value is presented visually rather than textually. Not all values can be processed - +see [_Supported Values_](#Supported%20Values) for which values can be visualized. -You can refresh the evaluation and open the current visualizer view into a new browser window by using the top right buttons. -You can also unfold the details pane to select a _Data Extractor_ and a _Visualizer_. - -Use the command `Debug Visualizer: Use Selection as Expression` (Shift + F1) to use the currently selected text as expression +Use the command `Debug Visualizer: Use Selection as Expression` _(Shift + F1)_ to use the currently selected text as expression in the most recently opened debug visualizer. ## Supported Values -Visualizers consume specific JSON data. See [Integrated Visualizers](#Integrated%20Visualizers) for the schema of supported JSON data. +Visualizers consume specific JSON data. This extension uses [hediet/visualization](https://github.com/hediet/visualization), a generic visualization framework. +You can see in its [playground](https://hediet.github.io/visualization/) which data can be visualized and how the visualization looks like. The currently watched expression should evaluate to a JSON Object string, -matching the schema of one of the supported visualizers. This JSON string may be surrounded by single or double quotation marks (or none at all) and must not be escaped. +matching the [schema](https://hediet.github.io/visualization/docs/visualization-data-schema.json) of one of the supported visualizers. This JSON string may be surrounded by single or double quotation marks (or none at all) and must not be escaped. A valid example is `"{ "kind": { "text": true }, "text": "some text\nmore text" }"`. For some languages (TypeScript/JavaScript), runtime code is injected to support _Data Extractors_. @@ -50,171 +49,7 @@ A Data Extractor lifts the requirement for the visualized value to be a JSON str and acts as a bridge between custom data structures and the JSON data processed by the visualizers. When multiple Data Extractors are applicable, a preferred one can be selected in the visualization view. -## Integrated Visualizers - -The following visualizers are built into this extension. - -### Graph Visualization - -[Demo](https://hediet.github.io/vscode-debug-visualizer/?value=%7B%0A++++%22kind%22%3A+%7B+%22graph%22%3A+true+%7D%2C%0A++++%22nodes%22%3A+%5B%0A++++++++%7B+%22id%22%3A+%221%22%2C+%22label%22%3A+%221%22+%7D%2C%0A++++++++%7B+%22id%22%3A+%222%22%2C+%22label%22%3A+%222%22%2C+%22color%22%3A+%22orange%22+%7D%2C%0A++++++++%7B+%22id%22%3A+%223%22%2C+%22label%22%3A+%223%22+%7D%0A++++%5D%2C%0A++++%22edges%22%3A+%5B%0A++++++++%7B+%22from%22%3A+%221%22%2C+%22to%22%3A+%222%22%2C+%22color%22%3A+%22red%22+%7D%2C%0A++++++++%7B+%22from%22%3A+%221%22%2C+%22to%22%3A+%223%22+%7D%0A++++%5D%0A%7D). -The Graphviz and vis.js visualizers render data that matches the `Graph` interface. - -```ts -interface Graph { - kind: { graph: true }; - nodes: NodeGraphData[]; - edges: EdgeGraphData[]; -} - -interface NodeGraphData { - id: string; - label?: string; - color?: string; - shape?: "ellipse" | "box"; -} - -interface EdgeGraphData { - from: string; - to: string; - label?: string; - id?: string; - color?: string; - dashes?: boolean; -} -``` - -The graphviz visualizer uses the SVG viewer to render the SVG created by `viz.js`. - -![](../docs/visualization-graphviz.png) -![](../docs/visualization-visjs.png) - -### Plotly Visualization - -[Demo](https://hediet.github.io/vscode-debug-visualizer/?value=%7B%22kind%22%3A%7B%22plotly%22%3Atrue%7D%2C%22data%22%3A%5B%7B%22y%22%3A%5B0%2C1%2C2%2C3%2C4%2C3%2C4%2C3%2C2%2C1%2C2%5D%7D%5D%7D). -The plotly visualizer uses plotly and can visualize JSON data matching the following interface: - -```ts -export interface Plotly { - kind: { plotly: true }; - data: Partial[]; -} -// See plotly docs for Plotly.Data. -``` - -![](../docs/visualization-plotly-random-walk.png) - -### Tree Visualization - -The tree visualizer renders data that matches the `Tree` interface. - -```ts -interface Tree { - kind: { tree: true }; - root: TreeNode; -} -interface TreeNode { - id: string | undefined; - name: string; - value: string | undefined; - emphasizedValue: string | undefined; - children: TreeNode[]; - data: TExtraData; - isMarked: boolean; -} -``` - -![](../docs/visualization-tree.png) - -### AST Visualization - -[Demo](https://hediet.github.io/vscode-debug-visualizer/?value=%7B%22kind%22%3A%7B%22text%22%3Atrue%2C%22tree%22%3Atrue%2C%22ast%22%3Atrue%7D%2C%22root%22%3A%7B%22name%22%3A%22SourceFile%22%2C%22id%22%3A%22root%22%2C%22children%22%3A%5B%7B%22name%22%3A%22ClassDeclaration%22%2C%22id%22%3A%22statements%22%2C%22children%22%3A%5B%7B%22name%22%3A%22Identifier%22%2C%22id%22%3A%22name%22%2C%22children%22%3A%5B%5D%2C%22data%22%3A%7B%22length%22%3A6%2C%22position%22%3A6%7D%2C%22isMarked%22%3Afalse%2C%22value%22%3A%22Test1%22%7D%2C%7B%22name%22%3A%22MethodDeclaration%22%2C%22id%22%3A%22members%22%2C%22children%22%3A%5B%7B%22name%22%3A%22PublicKeyword%22%2C%22id%22%3A%22modifiers%22%2C%22children%22%3A%5B%5D%2C%22data%22%3A%7B%22length%22%3A8%2C%22position%22%3A14%7D%2C%22isMarked%22%3Afalse%7D%2C%7B%22name%22%3A%22Identifier%22%2C%22id%22%3A%22name%22%2C%22children%22%3A%5B%5D%2C%22data%22%3A%7B%22length%22%3A4%2C%22position%22%3A22%7D%2C%22isMarked%22%3Afalse%2C%22value%22%3A%22foo%22%7D%2C%7B%22name%22%3A%22Parameter%22%2C%22id%22%3A%22parameters%22%2C%22children%22%3A%5B%7B%22name%22%3A%22Identifier%22%2C%22id%22%3A%22name%22%2C%22children%22%3A%5B%5D%2C%22data%22%3A%7B%22length%22%3A1%2C%22position%22%3A27%7D%2C%22isMarked%22%3Afalse%2C%22value%22%3A%22a%22%7D%2C%7B%22name%22%3A%22NumberKeyword%22%2C%22id%22%3A%22type%22%2C%22children%22%3A%5B%5D%2C%22data%22%3A%7B%22length%22%3A7%2C%22position%22%3A29%7D%2C%22isMarked%22%3Afalse%7D%5D%2C%22data%22%3A%7B%22length%22%3A9%2C%22position%22%3A27%7D%2C%22isMarked%22%3Afalse%7D%2C%7B%22name%22%3A%22Block%22%2C%22id%22%3A%22body%22%2C%22children%22%3A%5B%7B%22name%22%3A%22VariableStatement%22%2C%22id%22%3A%22statements%22%2C%22children%22%3A%5B%7B%22name%22%3A%22VariableDeclarationList%22%2C%22id%22%3A%22declarationList%22%2C%22children%22%3A%5B%7B%22name%22%3A%22VariableDeclaration%22%2C%22id%22%3A%22declarations%22%2C%22children%22%3A%5B%7B%22name%22%3A%22Identifier%22%2C%22id%22%3A%22name%22%2C%22children%22%3A%5B%5D%2C%22data%22%3A%7B%22length%22%3A2%2C%22position%22%3A47%7D%2C%22isMarked%22%3Afalse%2C%22value%22%3A%22x%22%7D%2C%7B%22name%22%3A%22ObjectLiteralExpression%22%2C%22id%22%3A%22initializer%22%2C%22children%22%3A%5B%7B%22name%22%3A%22PropertyAssignment%22%2C%22id%22%3A%22properties%22%2C%22children%22%3A%5B%7B%22name%22%3A%22Identifier%22%2C%22id%22%3A%22name%22%2C%22children%22%3A%5B%5D%2C%22data%22%3A%7B%22length%22%3A2%2C%22position%22%3A53%7D%2C%22isMarked%22%3Afalse%2C%22value%22%3A%22a%22%7D%2C%7B%22name%22%3A%22FirstLiteralToken%22%2C%22id%22%3A%22initializer%22%2C%22children%22%3A%5B%5D%2C%22data%22%3A%7B%22length%22%3A2%2C%22position%22%3A56%7D%2C%22isMarked%22%3Afalse%2C%22value%22%3A%225%22%7D%5D%2C%22data%22%3A%7B%22length%22%3A5%2C%22position%22%3A53%7D%2C%22isMarked%22%3Afalse%7D%5D%2C%22data%22%3A%7B%22length%22%3A9%2C%22position%22%3A51%7D%2C%22isMarked%22%3Afalse%7D%5D%2C%22data%22%3A%7B%22length%22%3A13%2C%22position%22%3A47%7D%2C%22isMarked%22%3Afalse%7D%5D%2C%22data%22%3A%7B%22length%22%3A21%2C%22position%22%3A39%7D%2C%22isMarked%22%3Afalse%7D%5D%2C%22data%22%3A%7B%22length%22%3A22%2C%22position%22%3A39%7D%2C%22isMarked%22%3Afalse%7D%5D%2C%22data%22%3A%7B%22length%22%3A27%2C%22position%22%3A37%7D%2C%22isMarked%22%3Afalse%7D%5D%2C%22data%22%3A%7B%22length%22%3A50%2C%22position%22%3A14%7D%2C%22isMarked%22%3Afalse%7D%5D%2C%22data%22%3A%7B%22length%22%3A66%2C%22position%22%3A0%7D%2C%22isMarked%22%3Afalse%7D%2C%7B%22name%22%3A%22EndOfFileToken%22%2C%22id%22%3A%22endOfFileToken%22%2C%22children%22%3A%5B%5D%2C%22data%22%3A%7B%22length%22%3A1%2C%22position%22%3A66%7D%2C%22isMarked%22%3Afalse%7D%5D%2C%22data%22%3A%7B%22length%22%3A67%2C%22position%22%3A0%7D%2C%22isMarked%22%3Atrue%7D%2C%22text%22%3A%22%5Cnclass+Test1+%7B%5Cn%5Ctpublic+foo%28a%3A+number%29+%7B%5Cn%5Ct%5Ctconst+x+%3D+%7B+a%3A+5+%7D%3B%5Cn%5Ct%7D%5Cn%7D%5Cn%22%2C%22fileName%22%3A%22index.ts%22%7D). -The AST (Abstract Syntax Tree) visualizer renders data that matches the `Ast` interface. - -```ts -interface Ast - extends Tree<{ - position: number; - length: number; - }>, - Text { - kind: { text: true; tree: true; ast: true }; -} -``` - -Additionally to the tree view, the source code is rendered and when selecting an AST node, -its span in the source code is highlighted. - -![](../docs/visualization-ast.png) - -### Grid Visualization - -Visualizes data matching the following interface: - -```ts -export interface Grid { - kind: { array: true }; - columnLabels?: { label?: string }[]; - rows: { - label?: string; - columns: { - content?: string; - tag?: string; - color?: string; - }[]; - }[]; - markers?: { - id: string; - - row: number; - column: number; - rows?: number; - columns?: number; - - label?: string; - color?: string; - }[]; -} -``` - -![](../docs/visualization-grid.gif) - -### Text Visualization - -The text visualizer renders data that matches the `Text` interface. - -```ts -interface Text { - kind: { text: true }; - text: string; - mimeType?: string; - fileName?: string; -} -``` - -The `mimeType` and the file extension of `fileName` are used for syntax highlighting. - -### SVG Visualization - -The SVG visualizer renders data that matches the `Svg` interface. -The actual SVG data must be stored in `text`. - -```ts -interface Svg extends Text { - kind: { text: true; svg: true }; -} -``` - -### Dot Graph Visualization - -The Graphviz Dot visualizer renders data that matches the `DotGraph` interface. - -```ts -interface DotGraph extends Text { - kind: { text: true; dotGraph: true }; -} -``` - -`Viz.js` (Graphviz) is used for rendering. +There is a [JSON Schema for all supported visualizations](https://hediet.github.io/visualization/docs/visualization-data-schema.json) and a [typescript declaration file](https://hediet.github.io/visualization/docs/visualization-data.ts). ## JavaScript/TypeScript Integrated Data Extractors @@ -224,35 +59,22 @@ Custom data extractors can be registered too. See the package `@hediet/debug-visualizer-data-extraction` and its [README](../data-extraction/README.md) for the implementation and its API. Also, a global object of name `hedietDbgVis` with helper functions is injected. -### ToString - -Just calls `.toString()` on values and treats the result as text. - -### TypeScript AST - -- Direct Visualization of `ts.Node`s -- Visualization of `Record` and `[ts.Node]`. If the record contains a key `fn`, its value is displayed for each node. - -### As Is Data Extractor - -Treats the data as direct input to the visualizer. - -### Use Method 'getDebugVisualization' - -Calls `.getDebugVisualization()` on values and treats the result as direct input to the visualizer. - -### Plotly y-Values - -Uses plotly to plot an array of numbers. - -### Object Graph - -Constructs a graph containing all objects reachable from object the expression evaluates to. -Graph is constructed using a breadth search. Stops after 50 nodes. - -### Array Grid - -Creates Grid visualization data for an array. +- **ToString** + - Just calls `.toString()` on values and treats the result as text. +- **TypeScript AST** + - Direct Visualization of `ts.Node`s + - Visualization of `Record` and `ts.Node[]`. If the record contains a key `fn`, its value is displayed for each node. +- **As Is Data Extractor** + - Treats the data as direct input to the visualizer. +- **Use Method 'getVisualizationData'** + - Calls `.getVisualizationData()` on values and treats the result as direct input to the visualizer. +- **Plotly y-Values** + - Uses plotly to plot an array of numbers. +- **Object Graph** + - Constructs a graph containing all objects reachable from object the expression evaluates to. + Graph is constructed using a breadth search. Stops after 50 nodes. +- **Array Grid** + - Creates Grid visualization data for an array. ## UI Features @@ -282,7 +104,7 @@ This extension provides these configuration options: Configurations here overwrite the built-in support for the corresponding debug adapter type. -* `debugVisualizer.useChromeKioskMode` +- `debugVisualizer.useChromeKioskMode` Specifies whether to pop out Debug Visualization Views with Chrome in Kiosk Mode. Uses the default browser otherwise or if Chrome is not found. Defaults to `true`.