Updated demos.
This commit is contained in:
69
demo/.vscode/launch.json
vendored
Normal file
69
demo/.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,69 @@
|
||||
{
|
||||
// Use IntelliSense to find out which attributes exist for C# debugging
|
||||
// Use hover for the description of the existing attributes
|
||||
// For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"name": "TypeScript - Demo: Custom Data Extractor",
|
||||
"program": "${workspaceFolder}/js/dist/demo_custom-data-extractor",
|
||||
"skipFiles": ["<node_internals>/**"],
|
||||
"preLaunchTask": "typescript-watch"
|
||||
},
|
||||
{
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"name": "TypeScript - Demo: Doubly Linked List",
|
||||
"program": "${workspaceFolder}/js/dist/demo-doubly-linked-list",
|
||||
"skipFiles": ["<node_internals>/**"],
|
||||
"preLaunchTask": "typescript-watch"
|
||||
},
|
||||
{
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"name": "TypeScript - Demo: Random Walks",
|
||||
"program": "${workspaceFolder}/js/dist/demo_random-walks",
|
||||
"skipFiles": ["<node_internals>/**"],
|
||||
"preLaunchTask": "typescript-watch"
|
||||
},
|
||||
{
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"name": "TypeScript - Demo: TypeScript ASTs",
|
||||
"program": "${workspaceFolder}/js/dist/demo_typescript-asts",
|
||||
"skipFiles": ["<node_internals>/**"],
|
||||
"preLaunchTask": "typescript-watch",
|
||||
"cwd": "${workspaceFolder}/js"
|
||||
},
|
||||
{
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"name": "JavaScript - Demo: Singly Linked List",
|
||||
"program": "${workspaceFolder}/js/src/demo_singly-linked-list",
|
||||
"skipFiles": ["<node_internals>/**"],
|
||||
"preLaunchTask": "typescript-watch"
|
||||
},
|
||||
{
|
||||
"name": "C# - Demo: Linked List",
|
||||
"type": "coreclr",
|
||||
"request": "launch",
|
||||
"preLaunchTask": "csharp-build",
|
||||
"program": "${workspaceFolder}/csharp/bin/Debug/netcoreapp3.1/demo.dll",
|
||||
"args": [],
|
||||
"cwd": "${workspaceFolder}/csharp",
|
||||
"console": "internalConsole",
|
||||
"stopAtEntry": false
|
||||
},
|
||||
{
|
||||
"name": "PHP - Demo",
|
||||
"type": "php",
|
||||
"request": "launch",
|
||||
"program": "${workspaceFolder}/php/demo.php",
|
||||
"xdebugSettings": {
|
||||
"max_data": -1
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
4
demo/.vscode/settings.json
vendored
Normal file
4
demo/.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"debugVisualizer.useChromeKioskMode": false,
|
||||
"editor.minimap.enabled": false
|
||||
}
|
||||
32
demo/.vscode/tasks.json
vendored
Normal file
32
demo/.vscode/tasks.json
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"type": "npm",
|
||||
"label": "typescript-watch",
|
||||
"script": "dev",
|
||||
"problemMatcher": "$tsc-watch",
|
||||
"isBackground": true,
|
||||
"presentation": {
|
||||
"reveal": "never"
|
||||
},
|
||||
"path": "js/",
|
||||
"group": {
|
||||
"kind": "build",
|
||||
"isDefault": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"label": "csharp-build",
|
||||
"command": "dotnet",
|
||||
"type": "process",
|
||||
"args": [
|
||||
"build",
|
||||
"${workspaceFolder}/csharp/demo.csproj",
|
||||
"/property:GenerateFullPaths=true",
|
||||
"/consoleloggerparameters:NoSummary"
|
||||
],
|
||||
"problemMatcher": "$msCompile"
|
||||
}
|
||||
]
|
||||
}
|
||||
353
demo/csharp/.gitignore
vendored
Normal file
353
demo/csharp/.gitignore
vendored
Normal file
@@ -0,0 +1,353 @@
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
##
|
||||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||
|
||||
# User-specific files
|
||||
*.rsuser
|
||||
*.suo
|
||||
*.user
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
|
||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
*.userprefs
|
||||
|
||||
# Mono auto generated files
|
||||
mono_crash.*
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
[Rr]elease/
|
||||
[Rr]eleases/
|
||||
x64/
|
||||
x86/
|
||||
[Aa][Rr][Mm]/
|
||||
[Aa][Rr][Mm]64/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
[Ll]og/
|
||||
[Ll]ogs/
|
||||
|
||||
# Visual Studio 2015/2017 cache/options directory
|
||||
.vs/
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
#wwwroot/
|
||||
|
||||
# Visual Studio 2017 auto generated files
|
||||
Generated\ Files/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
# NUnit
|
||||
*.VisualState.xml
|
||||
TestResult.xml
|
||||
nunit-*.xml
|
||||
|
||||
# Build Results of an ATL Project
|
||||
[Dd]ebugPS/
|
||||
[Rr]eleasePS/
|
||||
dlldata.c
|
||||
|
||||
# Benchmark Results
|
||||
BenchmarkDotNet.Artifacts/
|
||||
|
||||
# .NET Core
|
||||
project.lock.json
|
||||
project.fragment.lock.json
|
||||
artifacts/
|
||||
|
||||
# StyleCop
|
||||
StyleCopReport.xml
|
||||
|
||||
# Files built by Visual Studio
|
||||
*_i.c
|
||||
*_p.c
|
||||
*_h.h
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.iobj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.ipdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*_wpftmp.csproj
|
||||
*.log
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.svclog
|
||||
*.scc
|
||||
|
||||
# Chutzpah Test files
|
||||
_Chutzpah*
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opendb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
*.VC.db
|
||||
*.VC.VC.opendb
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
*.sap
|
||||
|
||||
# Visual Studio Trace Files
|
||||
*.e2e
|
||||
|
||||
# TFS 2012 Local Workspace
|
||||
$tf/
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
*.DotSettings.user
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# AxoCover is a Code Coverage Tool
|
||||
.axoCover/*
|
||||
!.axoCover/settings.json
|
||||
|
||||
# Coverlet is a free, cross platform Code Coverage Tool
|
||||
coverage*[.json, .xml, .info]
|
||||
|
||||
# Visual Studio code coverage results
|
||||
*.coverage
|
||||
*.coveragexml
|
||||
|
||||
# NCrunch
|
||||
_NCrunch_*
|
||||
.*crunch*.local.xml
|
||||
nCrunchTemp_*
|
||||
|
||||
# MightyMoose
|
||||
*.mm.*
|
||||
AutoTest.Net/
|
||||
|
||||
# Web workbench (sass)
|
||||
.sass-cache/
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.[Pp]ublish.xml
|
||||
*.azurePubxml
|
||||
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||
# but database connection strings (with potential passwords) will be unencrypted
|
||||
*.pubxml
|
||||
*.publishproj
|
||||
|
||||
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||
# in these scripts will be unencrypted
|
||||
PublishScripts/
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# NuGet Symbol Packages
|
||||
*.snupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/[Pp]ackages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/[Pp]ackages/build/
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
#!**/[Pp]ackages/repositories.config
|
||||
# NuGet v3's project.json files produces more ignorable files
|
||||
*.nuget.props
|
||||
*.nuget.targets
|
||||
|
||||
# Microsoft Azure Build Output
|
||||
csx/
|
||||
*.build.csdef
|
||||
|
||||
# Microsoft Azure Emulator
|
||||
ecf/
|
||||
rcf/
|
||||
|
||||
# Windows Store app package directories and files
|
||||
AppPackages/
|
||||
BundleArtifacts/
|
||||
Package.StoreAssociation.xml
|
||||
_pkginfo.txt
|
||||
*.appx
|
||||
*.appxbundle
|
||||
*.appxupload
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
*.[Cc]ache
|
||||
# but keep track of directories ending in .cache
|
||||
!?*.[Cc]ache/
|
||||
|
||||
# Others
|
||||
ClientBin/
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.dbproj.schemaview
|
||||
*.jfm
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
orleans.codegen.cs
|
||||
|
||||
# Including strong name files can present a security risk
|
||||
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
||||
#*.snk
|
||||
|
||||
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||
#bower_components/
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file
|
||||
# to a newer Visual Studio version. Backup files are not needed,
|
||||
# because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
ServiceFabricBackup/
|
||||
*.rptproj.bak
|
||||
|
||||
# SQL Server files
|
||||
*.mdf
|
||||
*.ldf
|
||||
*.ndf
|
||||
|
||||
# Business Intelligence projects
|
||||
*.rdl.data
|
||||
*.bim.layout
|
||||
*.bim_*.settings
|
||||
*.rptproj.rsuser
|
||||
*- [Bb]ackup.rdl
|
||||
*- [Bb]ackup ([0-9]).rdl
|
||||
*- [Bb]ackup ([0-9][0-9]).rdl
|
||||
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
|
||||
# GhostDoc plugin setting file
|
||||
*.GhostDoc.xml
|
||||
|
||||
# Node.js Tools for Visual Studio
|
||||
.ntvs_analysis.dat
|
||||
node_modules/
|
||||
|
||||
# Visual Studio 6 build log
|
||||
*.plg
|
||||
|
||||
# Visual Studio 6 workspace options file
|
||||
*.opt
|
||||
|
||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||
*.vbw
|
||||
|
||||
# Visual Studio LightSwitch build output
|
||||
**/*.HTMLClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/ModelManifest.xml
|
||||
**/*.Server/GeneratedArtifacts
|
||||
**/*.Server/ModelManifest.xml
|
||||
_Pvt_Extensions
|
||||
|
||||
# Paket dependency manager
|
||||
.paket/paket.exe
|
||||
paket-files/
|
||||
|
||||
# FAKE - F# Make
|
||||
.fake/
|
||||
|
||||
# CodeRush personal settings
|
||||
.cr/personal
|
||||
|
||||
# Python Tools for Visual Studio (PTVS)
|
||||
__pycache__/
|
||||
*.pyc
|
||||
|
||||
# Cake - Uncomment if you are using it
|
||||
# tools/**
|
||||
# !tools/packages.config
|
||||
|
||||
# Tabs Studio
|
||||
*.tss
|
||||
|
||||
# Telerik's JustMock configuration file
|
||||
*.jmconfig
|
||||
|
||||
# BizTalk build output
|
||||
*.btp.cs
|
||||
*.btm.cs
|
||||
*.odx.cs
|
||||
*.xsd.cs
|
||||
|
||||
# OpenCover UI analysis results
|
||||
OpenCover/
|
||||
|
||||
# Azure Stream Analytics local run output
|
||||
ASALocalRun/
|
||||
|
||||
# MSBuild Binary and Structured Log
|
||||
*.binlog
|
||||
|
||||
# NVidia Nsight GPU debugger configuration file
|
||||
*.nvuser
|
||||
|
||||
# MFractors (Xamarin productivity tool) working folder
|
||||
.mfractor/
|
||||
|
||||
# Local History for Visual Studio
|
||||
.localhistory/
|
||||
|
||||
# BeatPulse healthcheck temp database
|
||||
healthchecksdb
|
||||
|
||||
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
||||
MigrationBackup/
|
||||
|
||||
# Ionide (cross platform F# VS Code tools) working folder
|
||||
.ionide/
|
||||
186
demo/csharp/ExtractedData.cs
Normal file
186
demo/csharp/ExtractedData.cs
Normal file
@@ -0,0 +1,186 @@
|
||||
#nullable enable
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Hediet.DebugVisualizer.ExtractedData
|
||||
{
|
||||
[JsonObject(ItemNullValueHandling = NullValueHandling.Ignore)]
|
||||
public abstract class ExtractedData
|
||||
{
|
||||
[JsonProperty("kind")]
|
||||
public Dictionary<string, bool> Kind
|
||||
{
|
||||
get
|
||||
{
|
||||
var d = new Dictionary<string, bool>();
|
||||
foreach (var tag in Tags)
|
||||
{
|
||||
d.Add(tag, true);
|
||||
}
|
||||
return d;
|
||||
}
|
||||
}
|
||||
|
||||
[JsonIgnore]
|
||||
public abstract string[] Tags { get; }
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return JsonConvert.SerializeObject(this);
|
||||
}
|
||||
}
|
||||
|
||||
public class TextData : ExtractedData
|
||||
{
|
||||
public override string[] Tags => new string[] { "text" };
|
||||
|
||||
[JsonProperty("text")]
|
||||
public string TextValue { get; set; }
|
||||
|
||||
public TextData(string text)
|
||||
{
|
||||
this.TextValue = text;
|
||||
}
|
||||
}
|
||||
|
||||
public class GraphData : ExtractedData
|
||||
{
|
||||
public override string[] Tags => new string[] { "graph" };
|
||||
|
||||
[JsonProperty("nodes")]
|
||||
public IList<NodeData> Nodes { get; set; } = new List<NodeData>();
|
||||
|
||||
[JsonProperty("edges")]
|
||||
public IList<EdgeData> Edges { get; set; } = new List<EdgeData>();
|
||||
|
||||
[JsonObject(ItemNullValueHandling = NullValueHandling.Ignore)]
|
||||
public class NodeData
|
||||
{
|
||||
public NodeData(string id)
|
||||
{
|
||||
Id = id;
|
||||
}
|
||||
|
||||
[JsonProperty("id")]
|
||||
public string Id { get; set; }
|
||||
|
||||
[JsonProperty("label")]
|
||||
public string? Label { get; set; }
|
||||
|
||||
[JsonProperty("color")]
|
||||
public string? Color { get; set; }
|
||||
|
||||
[JsonProperty("shape")]
|
||||
public string? Shape { get; set; }
|
||||
}
|
||||
|
||||
[JsonObject(ItemNullValueHandling = NullValueHandling.Ignore)]
|
||||
|
||||
public class EdgeData
|
||||
{
|
||||
public EdgeData(string from, string to)
|
||||
{
|
||||
From = from;
|
||||
To = to;
|
||||
}
|
||||
|
||||
[JsonProperty("from")]
|
||||
public string From { get; set; }
|
||||
|
||||
[JsonProperty("to")]
|
||||
public string To { get; set; }
|
||||
|
||||
[JsonProperty("label")]
|
||||
public string? Label { get; set; }
|
||||
|
||||
[JsonProperty("id")]
|
||||
public string? Id { get; set; }
|
||||
|
||||
[JsonProperty("color")]
|
||||
public string? Color { get; set; }
|
||||
|
||||
[JsonProperty("dashes")]
|
||||
public bool? Dashes { get; set; }
|
||||
}
|
||||
|
||||
public static GraphData From<T>(IEnumerable<T> items, Func<T, NodeInfo<T>, NodeInfo<T>> f) where T : notnull
|
||||
{
|
||||
var d = new GraphData();
|
||||
var q = new Queue<T>(items);
|
||||
var i = 0;
|
||||
var infos = new Dictionary<T, NodeInfo<T>>();
|
||||
|
||||
string GetId(NodeInfo<T> item)
|
||||
{
|
||||
if (item.Id == null)
|
||||
item.Id = "hediet.de/" + (i++);
|
||||
return item.Id;
|
||||
}
|
||||
|
||||
NodeInfo<T> GetNodeInfo(T item)
|
||||
{
|
||||
if (infos.ContainsKey(item))
|
||||
return infos[item];
|
||||
|
||||
var info = f(item, new NodeInfo<T>());
|
||||
infos.Add(item, info);
|
||||
return info;
|
||||
}
|
||||
|
||||
while (q.Count > 0)
|
||||
{
|
||||
var nodeInfo = GetNodeInfo(q.Dequeue());
|
||||
var nd = new NodeData(GetId(nodeInfo));
|
||||
d.Nodes.Add(nd);
|
||||
|
||||
nd.Label = nodeInfo.Label;
|
||||
nd.Color = nodeInfo.Color;
|
||||
|
||||
foreach (var e in nodeInfo.Edges)
|
||||
{
|
||||
var ed = new EdgeData(nd.Id, GetId(GetNodeInfo(e.To)));
|
||||
d.Edges.Add(ed);
|
||||
|
||||
ed.Label = e.Label;
|
||||
ed.Id = e.Id;
|
||||
|
||||
q.Enqueue(e.To);
|
||||
}
|
||||
}
|
||||
|
||||
return d;
|
||||
}
|
||||
|
||||
public class NodeInfo<T>
|
||||
{
|
||||
public IList<EdgeInfo<T>> Edges { get; set; } = new List<EdgeInfo<T>>();
|
||||
public string? Label { get; set; }
|
||||
public string? Id { get; set; }
|
||||
public string? Color { get; set; }
|
||||
|
||||
public NodeInfo<T> AddEdge(T to, string? id = null, string? label = null)
|
||||
{
|
||||
var e = new EdgeInfo<T>(to);
|
||||
e.Id = id;
|
||||
e.Label = label;
|
||||
Edges.Add(e);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
public class EdgeInfo<T>
|
||||
{
|
||||
public T To { get; set; }
|
||||
public string? Label { get; set; }
|
||||
public string? Id { get; set; }
|
||||
|
||||
public EdgeInfo(T to)
|
||||
{
|
||||
To = to;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
65
demo/csharp/Program.cs
Normal file
65
demo/csharp/Program.cs
Normal file
@@ -0,0 +1,65 @@
|
||||
#nullable enable
|
||||
|
||||
using System.Linq;
|
||||
using Hediet.DebugVisualizer.ExtractedData;
|
||||
|
||||
namespace Demo
|
||||
{
|
||||
class Program
|
||||
{
|
||||
static void Main(string[] args)
|
||||
{
|
||||
var list = new LinkedList<int>();
|
||||
// visualize `list.Visualize()` here!
|
||||
list.Append(1);
|
||||
list.Append(2);
|
||||
list.Append(3);
|
||||
list.Append(4);
|
||||
}
|
||||
}
|
||||
|
||||
class LinkedList<T>
|
||||
{
|
||||
class Node
|
||||
{
|
||||
public Node(T value) { Value = value; }
|
||||
public T Value { get; set; }
|
||||
public Node? Next { get; set; }
|
||||
}
|
||||
|
||||
private Node? Head { get; set; }
|
||||
|
||||
public void Append(T item)
|
||||
{
|
||||
if (this.Head == null)
|
||||
{
|
||||
this.Head = new Node(item);
|
||||
}
|
||||
else
|
||||
{
|
||||
var cur = this.Head;
|
||||
while (cur.Next != null)
|
||||
{
|
||||
cur = cur.Next;
|
||||
}
|
||||
cur.Next = new Node(item);
|
||||
}
|
||||
}
|
||||
|
||||
public ExtractedData Visualize()
|
||||
{
|
||||
var list = new Node(default(T)!) { Next = this.Head };
|
||||
return GraphData.From(new[] { list }.Where(i => i != null), (item, info) =>
|
||||
{
|
||||
info.Id = item == list ? "List" : string.Format("{0}", item.Value);
|
||||
if (item == list)
|
||||
{
|
||||
info.Color = "orange";
|
||||
}
|
||||
if (item.Next != null)
|
||||
info.AddEdge(item.Next!, label: item == list ? "head" : "next");
|
||||
return info;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
12
demo/csharp/demo.csproj
Normal file
12
demo/csharp/demo.csproj
Normal file
@@ -0,0 +1,12 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="newtonsoft.json" Version="12.0.3" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
3
demo/js/README.md
Normal file
3
demo/js/README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# JS Demos
|
||||
|
||||
Simply run `yarn` and select the launch target you want to debug in the debugger pane of VS Code.
|
||||
15
demo/js/package.json
Normal file
15
demo/js/package.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"name": "demo",
|
||||
"version": "1.0.0",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@hediet/live-debug": "^0.5.2",
|
||||
"@hediet/node-reload": "0.7.0",
|
||||
"@hediet/std": "^0.4.0",
|
||||
"@types/node": "^13.7.1",
|
||||
"typescript": "^3.5.3"
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "tsc --watch"
|
||||
}
|
||||
}
|
||||
39
demo/js/src/MockLanguageServiceHost.ts
Normal file
39
demo/js/src/MockLanguageServiceHost.ts
Normal file
@@ -0,0 +1,39 @@
|
||||
import * as ts from "typescript";
|
||||
|
||||
export class MockLanguageServiceHost implements ts.LanguageServiceHost {
|
||||
constructor(
|
||||
private readonly files: Map<string, string>,
|
||||
private readonly compilationSettings: ts.CompilerOptions
|
||||
) {}
|
||||
|
||||
getScriptFileNames(): string[] {
|
||||
return [...this.files.keys()];
|
||||
}
|
||||
|
||||
getScriptVersion(fileName: string): string {
|
||||
return ""; // our files don't change
|
||||
}
|
||||
|
||||
getScriptSnapshot(fileName: string): ts.IScriptSnapshot | undefined {
|
||||
const content = this.files.get(fileName);
|
||||
if (!content) {
|
||||
return undefined;
|
||||
}
|
||||
return {
|
||||
dispose() {},
|
||||
getChangeRange: () => undefined,
|
||||
getLength: () => content.length,
|
||||
getText: (start, end) => content.substr(start, end - start),
|
||||
};
|
||||
}
|
||||
|
||||
getCompilationSettings(): ts.CompilerOptions {
|
||||
return this.compilationSettings;
|
||||
}
|
||||
getCurrentDirectory(): string {
|
||||
return "/";
|
||||
}
|
||||
getDefaultLibFileName(options: ts.CompilerOptions): string {
|
||||
return ts.getDefaultLibFileName(options);
|
||||
}
|
||||
}
|
||||
32
demo/js/src/demo_custom-data-extractor.ts
Normal file
32
demo/js/src/demo_custom-data-extractor.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
import { getDataExtractorApi } from "@hediet/debug-visualizer-data-extraction";
|
||||
|
||||
// Registers all existing extractors.
|
||||
getDataExtractorApi().registerDefaultExtractors();
|
||||
|
||||
getDataExtractorApi().registerExtractor({
|
||||
id: "my-extractor",
|
||||
getExtractions: (data, collector) => {
|
||||
if (data instanceof Foo) {
|
||||
collector.addExtraction({
|
||||
id: "my-extractor",
|
||||
name: "My Extractor",
|
||||
priority: 2000,
|
||||
extractData: () => ({ kind: { text: true }, text: "Foo" }),
|
||||
});
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
setTimeout(() => {
|
||||
new Main().run();
|
||||
}, 0);
|
||||
|
||||
class Foo {}
|
||||
|
||||
class Main {
|
||||
run() {
|
||||
const f = new Foo();
|
||||
// visualize `f` here!
|
||||
debugger;
|
||||
}
|
||||
}
|
||||
59
demo/js/src/demo_doubly-linked-list.ts
Normal file
59
demo/js/src/demo_doubly-linked-list.ts
Normal file
@@ -0,0 +1,59 @@
|
||||
import {
|
||||
getDataExtractorApi,
|
||||
createGraphFromPointers,
|
||||
} from "@hediet/debug-visualizer-data-extraction";
|
||||
|
||||
getDataExtractorApi().registerDefaultExtractors();
|
||||
|
||||
setTimeout(() => {
|
||||
new Main().run();
|
||||
}, 0);
|
||||
|
||||
class Main {
|
||||
run() {
|
||||
const list = new DoublyLinkedList("1");
|
||||
list.setNext(new DoublyLinkedList("2"));
|
||||
list.next!.setNext(new DoublyLinkedList("3"));
|
||||
list.next!.next!.setNext(new DoublyLinkedList("4"));
|
||||
|
||||
// Use `visualize()` as expression to visualize in the Debug Visualizer!
|
||||
const visualize = () =>
|
||||
createGraphFromPointers({ list, last, cur }, i => ({
|
||||
id: i.id,
|
||||
label: i.name,
|
||||
color: finished.has(i) ? "lime" : undefined,
|
||||
edges: [
|
||||
{ to: i.next!, label: "next" },
|
||||
{ to: i.prev!, label: "prev", color: "lightgray" },
|
||||
].filter(r => !!r.to),
|
||||
}));
|
||||
|
||||
const finished = new Set();
|
||||
var cur: DoublyLinkedList | undefined = list;
|
||||
// Reverses `list`. Finished nodes have correct pointers,
|
||||
// their next node is also finished.
|
||||
var last: DoublyLinkedList | undefined = undefined;
|
||||
while (cur) {
|
||||
cur.prev = cur.next;
|
||||
cur.next = last;
|
||||
finished.add(cur);
|
||||
last = cur;
|
||||
cur = cur.prev;
|
||||
}
|
||||
console.log("finished");
|
||||
}
|
||||
}
|
||||
|
||||
let id = 0;
|
||||
class DoublyLinkedList {
|
||||
public readonly id = (id++).toString();
|
||||
constructor(public name: string) {}
|
||||
|
||||
next: DoublyLinkedList | undefined;
|
||||
prev: DoublyLinkedList | undefined;
|
||||
|
||||
public setNext(val: DoublyLinkedList): void {
|
||||
val.prev = this;
|
||||
this.next = val;
|
||||
}
|
||||
}
|
||||
12
demo/js/src/demo_random-walks.ts
Normal file
12
demo/js/src/demo_random-walks.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
while (true) {
|
||||
// visualize data
|
||||
const data = new Array<number>();
|
||||
let value = 0;
|
||||
for (let i = 0; i < 10000; i++) {
|
||||
const delta = Math.random() > 0.5 ? 1 : -1;
|
||||
data.push(value);
|
||||
value += delta;
|
||||
}
|
||||
|
||||
debugger;
|
||||
}
|
||||
108
demo/js/src/demo_singly-linked-list.js
Normal file
108
demo/js/src/demo_singly-linked-list.js
Normal file
@@ -0,0 +1,108 @@
|
||||
// See https://codeburst.io/linked-lists-in-javascript-es6-code-part-1-6dd349c3dcc3
|
||||
/*
|
||||
After install the Debug Visualizer extension,
|
||||
press F1, enter "Open Debug Visualizer" and
|
||||
use the following code as expression to visualize.
|
||||
Then, press F5 and chose "node".
|
||||
```
|
||||
hedietDbgVis.createGraphFromPointers(
|
||||
hedietDbgVis.tryEval([
|
||||
"list.head",
|
||||
"newNode",
|
||||
"node",
|
||||
"previous",
|
||||
this.constructor.name === "LinkedList" ? "this.head" : "err",
|
||||
]),
|
||||
n => ({
|
||||
id: n.data,
|
||||
color: "lightblue",
|
||||
label: `${n.data}`,
|
||||
edges: [{ to: n.next, label: "next" }].filter(i => !!i.to),
|
||||
})
|
||||
)
|
||||
```
|
||||
|
||||
*/
|
||||
|
||||
class LinkedList {
|
||||
constructor() {
|
||||
this.head = null;
|
||||
}
|
||||
}
|
||||
|
||||
class Node {
|
||||
constructor(data, next = null) {
|
||||
(this.data = data), (this.next = next);
|
||||
}
|
||||
}
|
||||
|
||||
LinkedList.prototype.insertAtBeginning = function(data) {
|
||||
// A newNode object is created with property data
|
||||
// and next = null
|
||||
let newNode = new Node(data);
|
||||
// The pointer next is assigned head pointer
|
||||
// so that both pointers now point at the same node.
|
||||
newNode.next = this.head;
|
||||
// As we are inserting at the beginning the head pointer
|
||||
// needs to now point at the newNode.
|
||||
this.head = newNode;
|
||||
return this.head;
|
||||
};
|
||||
|
||||
LinkedList.prototype.getAt = function(index) {
|
||||
let counter = 0;
|
||||
let node = this.head;
|
||||
while (node) {
|
||||
if (counter === index) {
|
||||
return node;
|
||||
}
|
||||
counter++;
|
||||
node = node.next;
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
// The insertAt() function contains the steps to insert
|
||||
// a node at a given index.
|
||||
LinkedList.prototype.insertAt = function(data, index) {
|
||||
// if the list is empty i.e. head = null
|
||||
if (!this.head) {
|
||||
this.head = new Node(data);
|
||||
return;
|
||||
}
|
||||
// if new node needs to be inserted at the front
|
||||
// of the list i.e. before the head.
|
||||
if (index === 0) {
|
||||
this.head = new Node(data, this.head);
|
||||
return;
|
||||
}
|
||||
// else, use getAt() to find the previous node.
|
||||
const previous = this.getAt(index - 1);
|
||||
let newNode = new Node(data);
|
||||
newNode.next = previous.next;
|
||||
previous.next = newNode;
|
||||
|
||||
return this.head;
|
||||
};
|
||||
|
||||
const list = new LinkedList();
|
||||
debugger; // Press F10 to continue
|
||||
list.insertAtBeginning("4");
|
||||
list.insertAtBeginning("3");
|
||||
list.insertAtBeginning("2");
|
||||
list.insertAtBeginning("1");
|
||||
|
||||
list.insertAt("3.5", 3);
|
||||
|
||||
console.log("finished");
|
||||
|
||||
// Some Plotting.
|
||||
// Use `data` as expression to visualize.
|
||||
const data = [];
|
||||
for (let x = 0; x < 1000; x += 1) {
|
||||
data.push(Math.sin(x / 10));
|
||||
|
||||
if (x % 10 === 0) {
|
||||
console.log("step");
|
||||
}
|
||||
}
|
||||
97
demo/js/src/demo_typescript-asts.ts
Normal file
97
demo/js/src/demo_typescript-asts.ts
Normal file
@@ -0,0 +1,97 @@
|
||||
import * as ts from "typescript";
|
||||
import { getDataExtractorApi } from "@hediet/debug-visualizer-data-extraction";
|
||||
import { MockLanguageServiceHost } from "./MockLanguageServiceHost";
|
||||
|
||||
// Registers all existing extractors.
|
||||
getDataExtractorApi().registerDefaultExtractors();
|
||||
|
||||
setTimeout(() => {
|
||||
new Main().run();
|
||||
}, 0);
|
||||
|
||||
class Main {
|
||||
run() {
|
||||
const mainFile = {
|
||||
name: "main.ts",
|
||||
content: `
|
||||
class Test1 {
|
||||
public foo(a: number) {
|
||||
}
|
||||
}
|
||||
`,
|
||||
};
|
||||
|
||||
//console.log(ts, require("typescript"));
|
||||
|
||||
const files = new Map<string, string>([
|
||||
[mainFile.name, mainFile.content],
|
||||
]);
|
||||
const serviceHost = new MockLanguageServiceHost(files, {});
|
||||
const baseService = ts.createLanguageService(
|
||||
serviceHost,
|
||||
ts.createDocumentRegistry()
|
||||
);
|
||||
const prog = baseService.getProgram()!;
|
||||
|
||||
const identifiers = new Array<ts.Identifier>();
|
||||
function traverse(node: ts.Node) {
|
||||
if (ts.isIdentifier(node)) identifiers.push(node);
|
||||
node.forEachChild(traverse);
|
||||
}
|
||||
traverse(prog.getSourceFiles()[0]);
|
||||
|
||||
const c = prog.getTypeChecker();
|
||||
let myValue = undefined; // Visualize `myValue` here!
|
||||
const sourceFileAst = prog.getSourceFiles()[0];
|
||||
myValue = sourceFileAst.getText();
|
||||
console.log("myValue is the source code of the AST");
|
||||
debugger;
|
||||
|
||||
myValue = {
|
||||
sf: sourceFileAst,
|
||||
fn: (n: ts.Node) => {
|
||||
try {
|
||||
const t = c.getTypeAtLocation(n);
|
||||
return t ? c.typeToString(t) : undefined;
|
||||
} catch (e) {
|
||||
return "" + e;
|
||||
}
|
||||
},
|
||||
};
|
||||
console.log("myValue is AST, annotated with type information");
|
||||
debugger;
|
||||
|
||||
myValue = {
|
||||
sf: sourceFileAst,
|
||||
fn: (n: ts.Node) => {
|
||||
try {
|
||||
const t = c.getSymbolAtLocation(n);
|
||||
return t ? ts.SymbolFlags[t.flags] : undefined;
|
||||
} catch (e) {
|
||||
return "" + e;
|
||||
}
|
||||
},
|
||||
};
|
||||
console.log("myValue is AST, annotated with symbol information");
|
||||
debugger;
|
||||
|
||||
for (const ident of identifiers) {
|
||||
myValue = ident;
|
||||
console.log("myValue is an identifier");
|
||||
debugger;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
myValue = {
|
||||
kind: { text: true, svg: true },
|
||||
text: `
|
||||
<svg height="210" width="500">
|
||||
<polygon
|
||||
points="100,10 40,198 190,78 10,78 160,198"
|
||||
style="fill:lime;stroke:purple;stroke-width:5;fill-rule:nonzero;"
|
||||
/>
|
||||
</svg>
|
||||
`,
|
||||
};*/
|
||||
37
demo/js/src/playground.ts
Normal file
37
demo/js/src/playground.ts
Normal file
@@ -0,0 +1,37 @@
|
||||
import {
|
||||
enableHotReload,
|
||||
registerUpdateReconciler,
|
||||
getReloadCount,
|
||||
hotCallExportedFunction,
|
||||
} from "@hediet/node-reload";
|
||||
|
||||
enableHotReload();
|
||||
registerUpdateReconciler(module);
|
||||
|
||||
import { registerDefaultExtractors } from "@hediet/debug-visualizer-data-extraction";
|
||||
registerDefaultExtractors();
|
||||
|
||||
if (getReloadCount(module) === 0) {
|
||||
// set interval so that the file watcher can detect changes in other files.
|
||||
setInterval(() => {
|
||||
hotCallExportedFunction(module, run);
|
||||
}, 1000);
|
||||
}
|
||||
|
||||
export function run() {
|
||||
new Demo().run();
|
||||
}
|
||||
|
||||
class Demo {
|
||||
private f = new Foo(new Foo(undefined));
|
||||
private arr = [new Foo(this.f), this.f];
|
||||
private set = new Set([this.arr[0], new Foo(new Foo(this.arr[1]))]);
|
||||
|
||||
run() {
|
||||
debugger;
|
||||
}
|
||||
}
|
||||
|
||||
class Foo {
|
||||
constructor(public readonly next: Foo | undefined) {}
|
||||
}
|
||||
17
demo/js/tsconfig.json
Normal file
17
demo/js/tsconfig.json
Normal file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "esnext",
|
||||
"module": "commonjs",
|
||||
"strict": true,
|
||||
"outDir": "dist",
|
||||
"skipLibCheck": true,
|
||||
"rootDir": "./src",
|
||||
"resolveJsonModule": true,
|
||||
"declaration": true,
|
||||
"declarationMap": true,
|
||||
"newLine": "LF",
|
||||
"sourceMap": true,
|
||||
"experimentalDecorators": true
|
||||
},
|
||||
"include": ["src/**/*"]
|
||||
}
|
||||
436
demo/js/yarn.lock
Normal file
436
demo/js/yarn.lock
Normal file
@@ -0,0 +1,436 @@
|
||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@hediet/live-debug@^0.5.1", "@hediet/live-debug@^0.5.2":
|
||||
version "0.5.2"
|
||||
resolved "https://registry.yarnpkg.com/@hediet/live-debug/-/live-debug-0.5.2.tgz#f2ee0034f014836bfd68e26c35a168ab42b15486"
|
||||
integrity sha512-HBqVbyFez1oQlIPO9dzkFi7/9Gvt6ZpssgURzYaVFREl9Oq03nPd6V7Ay4bW03xFHPo3YT2Yff9mFmGQUX7JEg==
|
||||
dependencies:
|
||||
"@hediet/std" "^0.6.0"
|
||||
"@hediet/typed-json-rpc" "^0.7.6"
|
||||
"@hediet/typed-json-rpc-websocket" "^0.7.7"
|
||||
stacktracey "^1.2.112"
|
||||
ws "^7.0.0"
|
||||
|
||||
"@hediet/node-reload@0.7.0":
|
||||
version "0.7.0"
|
||||
resolved "https://registry.yarnpkg.com/@hediet/node-reload/-/node-reload-0.7.0.tgz#ec50160ce26203079f18e7024cd58025fa79652a"
|
||||
integrity sha512-gWFbq2tOThSV9GT+pFx1JJzFuOV7l40IsseOFHMJGyvLmmAdgbJPV3OZuV9gcsXIGocOtbfEyky9S4tQELLLxA==
|
||||
dependencies:
|
||||
"@hediet/live-debug" "^0.5.1"
|
||||
"@hediet/std" "^0.6.0"
|
||||
"@hediet/typed-json-rpc" "^0.7.6"
|
||||
"@types/node" "^12.0.7"
|
||||
"@types/stack-trace" "^0.0.29"
|
||||
chokidar "^3.0.1"
|
||||
stack-trace "^0.0.10"
|
||||
ws "^7.0.0"
|
||||
|
||||
"@hediet/std@^0.4.0":
|
||||
version "0.4.0"
|
||||
resolved "https://registry.yarnpkg.com/@hediet/std/-/std-0.4.0.tgz#95dfd6e9d62f8bf9d91f3925d37b7b359b2af047"
|
||||
integrity sha512-2kw4vSOprLchTjhcg8qQo6fdbBxJicSUrzZXgL0KzgMv18hjVmpm57NPLCPfI6115kAaMIWvMnlHFLYbx7poQQ==
|
||||
dependencies:
|
||||
"@types/chai" "^4.1.7"
|
||||
"@types/sinon" "^7.0.10"
|
||||
chai "^4.2.0"
|
||||
sinon "^7.2.7"
|
||||
|
||||
"@hediet/std@^0.6.0":
|
||||
version "0.6.0"
|
||||
resolved "https://registry.yarnpkg.com/@hediet/std/-/std-0.6.0.tgz#f7d2ffc1180ecef6ff272d0d6780f0c0d9337e4e"
|
||||
integrity sha512-XzBiZo6pnt01k266lSbXOBZd7jrQQSutoH3IpI/1GuL09zxuDX+c0XersEbMCGS45S2l/TSlISyV3MH1lbYJEg==
|
||||
dependencies:
|
||||
"@types/chai" "^4.1.7"
|
||||
"@types/sinon" "^7.0.10"
|
||||
chai "^4.2.0"
|
||||
mobx "^5.10.0"
|
||||
sinon "^7.2.7"
|
||||
|
||||
"@hediet/typed-json-rpc-websocket@^0.7.7":
|
||||
version "0.7.7"
|
||||
resolved "https://registry.yarnpkg.com/@hediet/typed-json-rpc-websocket/-/typed-json-rpc-websocket-0.7.7.tgz#b1555528226e2bf3202d1d0e1870d04b59c14048"
|
||||
integrity sha512-0Aakr7ktqjR9paPRHM0fhePZDA8kKWn2t2Al3ta9nXSsY4ec/HknEwR9NMhXD3lATa/wvvKVIymalzKuRoV82A==
|
||||
dependencies:
|
||||
"@hediet/typed-json-rpc" "^0.7.5"
|
||||
"@types/ws" "^6.0.1"
|
||||
isomorphic-ws "^4.0.1"
|
||||
|
||||
"@hediet/typed-json-rpc@^0.7.5", "@hediet/typed-json-rpc@^0.7.6":
|
||||
version "0.7.7"
|
||||
resolved "https://registry.yarnpkg.com/@hediet/typed-json-rpc/-/typed-json-rpc-0.7.7.tgz#bd7e586ad5c0480f7bd6bc40d6ad202e0a80b54d"
|
||||
integrity sha512-lyjbVqt+mFrRS0+2cOVDithtfG9gfRV5CJMVDwV+F2gfCUjTe1aZu4xObpDDLfxfoZOGgtPNNg6jCNhvXSxQHg==
|
||||
dependencies:
|
||||
"@hediet/std" "^0.6.0"
|
||||
io-ts "^1.8.6"
|
||||
|
||||
"@sinonjs/commons@^1", "@sinonjs/commons@^1.0.2", "@sinonjs/commons@^1.4.0":
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.4.0.tgz#7b3ec2d96af481d7a0321252e7b1c94724ec5a78"
|
||||
integrity sha512-9jHK3YF/8HtJ9wCAbG+j8cD0i0+ATS9A7gXFqS36TblLPNy6rEEc+SB0imo91eCboGaBYGV/MT1/br/J+EE7Tw==
|
||||
dependencies:
|
||||
type-detect "4.0.8"
|
||||
|
||||
"@sinonjs/formatio@^3.1.0", "@sinonjs/formatio@^3.2.1":
|
||||
version "3.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.2.1.tgz#52310f2f9bcbc67bdac18c94ad4901b95fde267e"
|
||||
integrity sha512-tsHvOB24rvyvV2+zKMmPkZ7dXX6LSLKZ7aOtXY6Edklp0uRcgGpOsQTTGTcWViFyx4uhWc6GV8QdnALbIbIdeQ==
|
||||
dependencies:
|
||||
"@sinonjs/commons" "^1"
|
||||
"@sinonjs/samsam" "^3.1.0"
|
||||
|
||||
"@sinonjs/samsam@^3.1.0", "@sinonjs/samsam@^3.3.1":
|
||||
version "3.3.2"
|
||||
resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.2.tgz#63942e3d5eb0b79f6de3bef9abfad15fb4b6401b"
|
||||
integrity sha512-ILO/rR8LfAb60Y1Yfp9vxfYAASK43NFC2mLzpvLUbCQY/Qu8YwReboseu8aheCEkyElZF2L2T9mHcR2bgdvZyA==
|
||||
dependencies:
|
||||
"@sinonjs/commons" "^1.0.2"
|
||||
array-from "^2.1.1"
|
||||
lodash "^4.17.11"
|
||||
|
||||
"@sinonjs/text-encoding@^0.7.1":
|
||||
version "0.7.1"
|
||||
resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5"
|
||||
integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==
|
||||
|
||||
"@types/chai@^4.1.7":
|
||||
version "4.1.7"
|
||||
resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.1.7.tgz#1b8e33b61a8c09cbe1f85133071baa0dbf9fa71a"
|
||||
integrity sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA==
|
||||
|
||||
"@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/node@*", "@types/node@^12.0.7":
|
||||
version "12.6.8"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.6.8.tgz#e469b4bf9d1c9832aee4907ba8a051494357c12c"
|
||||
integrity sha512-aX+gFgA5GHcDi89KG5keey2zf0WfZk/HAQotEamsK2kbey+8yGKcson0hbK8E+v0NArlCJQCqMP161YhV6ZXLg==
|
||||
|
||||
"@types/node@^8.0.7":
|
||||
version "8.10.51"
|
||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.51.tgz#80600857c0a47a8e8bafc2dae6daed6db58e3627"
|
||||
integrity sha512-cArrlJp3Yv6IyFT/DYe+rlO8o3SIHraALbBW/+CcCYW/a9QucpLI+n2p4sRxAvl2O35TiecpX2heSZtJjvEO+Q==
|
||||
|
||||
"@types/sinon@^7.0.10":
|
||||
version "7.0.13"
|
||||
resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-7.0.13.tgz#ca039c23a9e27ebea53e0901ef928ea2a1a6d313"
|
||||
integrity sha512-d7c/C/+H/knZ3L8/cxhicHUiTDxdgap0b/aNJfsmLwFu/iOP17mdgbQsbHA3SJmrzsjD0l3UEE5SN4xxuz5ung==
|
||||
|
||||
"@types/stack-trace@^0.0.29":
|
||||
version "0.0.29"
|
||||
resolved "https://registry.yarnpkg.com/@types/stack-trace/-/stack-trace-0.0.29.tgz#eb7a7c60098edb35630ed900742a5ecb20cfcb4d"
|
||||
integrity sha512-TgfOX+mGY/NyNxJLIbDWrO9DjGoVSW9+aB8H2yy1fy32jsvxijhmyJI9fDFgvz3YP4lvJaq9DzdR/M1bOgVc9g==
|
||||
|
||||
"@types/ws@^6.0.1":
|
||||
version "6.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@types/ws/-/ws-6.0.1.tgz#ca7a3f3756aa12f62a0a62145ed14c6db25d5a28"
|
||||
integrity sha512-EzH8k1gyZ4xih/MaZTXwT2xOkPiIMSrhQ9b8wrlX88L0T02eYsddatQlwVFlEPyEqV0ChpdpNnE51QPH6NVT4Q==
|
||||
dependencies:
|
||||
"@types/events" "*"
|
||||
"@types/node" "*"
|
||||
|
||||
anymatch@^3.0.1:
|
||||
version "3.0.3"
|
||||
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.0.3.tgz#2fb624fe0e84bccab00afee3d0006ed310f22f09"
|
||||
integrity sha512-c6IvoeBECQlMVuYUjSwimnhmztImpErfxJzWZhIQinIvQWoGOnB0dLIgifbPHQt5heS6mNlaZG16f06H3C8t1g==
|
||||
dependencies:
|
||||
normalize-path "^3.0.0"
|
||||
picomatch "^2.0.4"
|
||||
|
||||
array-from@^2.1.1:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195"
|
||||
integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=
|
||||
|
||||
as-table@^1.0.36:
|
||||
version "1.0.52"
|
||||
resolved "https://registry.yarnpkg.com/as-table/-/as-table-1.0.52.tgz#537fb0cfcc6d04b498c8922df5f75ed357ec91e6"
|
||||
integrity sha512-Lw3OjVL9BDGSrU6RoK5aTm79SnrDY0Zvucxc+oOTqZrC2Sw575IhkOTPtvpzviliL/WJaCSWzJdKFdYeI+8wFg==
|
||||
dependencies:
|
||||
printable-characters "^1.0.42"
|
||||
|
||||
assertion-error@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b"
|
||||
integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==
|
||||
|
||||
async-limiter@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
|
||||
integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==
|
||||
|
||||
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==
|
||||
|
||||
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==
|
||||
dependencies:
|
||||
fill-range "^7.0.1"
|
||||
|
||||
chai@^4.2.0:
|
||||
version "4.2.0"
|
||||
resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5"
|
||||
integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==
|
||||
dependencies:
|
||||
assertion-error "^1.1.0"
|
||||
check-error "^1.0.2"
|
||||
deep-eql "^3.0.1"
|
||||
get-func-name "^2.0.0"
|
||||
pathval "^1.1.0"
|
||||
type-detect "^4.0.5"
|
||||
|
||||
check-error@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82"
|
||||
integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=
|
||||
|
||||
chokidar@^3.0.1:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.0.2.tgz#0d1cd6d04eb2df0327446188cd13736a3367d681"
|
||||
integrity sha512-c4PR2egjNjI1um6bamCQ6bUNPDiyofNQruHvKgHQ4gDUP/ITSVSzNsiI5OWtHOsX323i5ha/kk4YmOZ1Ktg7KA==
|
||||
dependencies:
|
||||
anymatch "^3.0.1"
|
||||
braces "^3.0.2"
|
||||
glob-parent "^5.0.0"
|
||||
is-binary-path "^2.1.0"
|
||||
is-glob "^4.0.1"
|
||||
normalize-path "^3.0.0"
|
||||
readdirp "^3.1.1"
|
||||
optionalDependencies:
|
||||
fsevents "^2.0.6"
|
||||
|
||||
data-uri-to-buffer@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-2.0.1.tgz#ca8f56fe38b1fd329473e9d1b4a9afcd8ce1c045"
|
||||
integrity sha512-OkVVLrerfAKZlW2ZZ3Ve2y65jgiWqBKsTfUIAFbn8nVbPcCZg6l6gikKlEYv0kXcmzqGm6mFq/Jf2vriuEkv8A==
|
||||
dependencies:
|
||||
"@types/node" "^8.0.7"
|
||||
|
||||
deep-eql@^3.0.1:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df"
|
||||
integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==
|
||||
dependencies:
|
||||
type-detect "^4.0.0"
|
||||
|
||||
diff@^3.5.0:
|
||||
version "3.5.0"
|
||||
resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
|
||||
integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
|
||||
|
||||
fill-range@^7.0.1:
|
||||
version "7.0.1"
|
||||
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
|
||||
integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
|
||||
dependencies:
|
||||
to-regex-range "^5.0.1"
|
||||
|
||||
fp-ts@^1.0.0:
|
||||
version "1.19.5"
|
||||
resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a"
|
||||
integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A==
|
||||
|
||||
fsevents@^2.0.6:
|
||||
version "2.0.7"
|
||||
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.0.7.tgz#382c9b443c6cbac4c57187cdda23aa3bf1ccfc2a"
|
||||
integrity sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ==
|
||||
|
||||
get-func-name@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41"
|
||||
integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=
|
||||
|
||||
get-source@^1.0.34:
|
||||
version "1.0.37"
|
||||
resolved "https://registry.yarnpkg.com/get-source/-/get-source-1.0.37.tgz#f1f3f799abd2a196de73ba8b853c38cd76c04583"
|
||||
integrity sha512-Q0YbhnCgvqFe3OTuxkNvWCM+22O4hkx7D0g8em7iFW4vmw/TiX8dhsFIaP6yRkyN9ETHgzU190L3keCg2MADtg==
|
||||
dependencies:
|
||||
data-uri-to-buffer "^2.0.0"
|
||||
source-map "^0.6.1"
|
||||
|
||||
glob-parent@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.0.0.tgz#1dc99f0f39b006d3e92c2c284068382f0c20e954"
|
||||
integrity sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==
|
||||
dependencies:
|
||||
is-glob "^4.0.1"
|
||||
|
||||
has-flag@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
|
||||
integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
|
||||
|
||||
io-ts@^1.8.6:
|
||||
version "1.10.4"
|
||||
resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2"
|
||||
integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==
|
||||
dependencies:
|
||||
fp-ts "^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-extglob@^2.1.1:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
|
||||
integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
|
||||
|
||||
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==
|
||||
dependencies:
|
||||
is-extglob "^2.1.1"
|
||||
|
||||
is-number@^7.0.0:
|
||||
version "7.0.0"
|
||||
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
|
||||
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
|
||||
|
||||
isarray@0.0.1:
|
||||
version "0.0.1"
|
||||
resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
|
||||
integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
|
||||
|
||||
isomorphic-ws@^4.0.1:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc"
|
||||
integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==
|
||||
|
||||
just-extend@^4.0.2:
|
||||
version "4.0.2"
|
||||
resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc"
|
||||
integrity sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==
|
||||
|
||||
lodash@^4.17.11:
|
||||
version "4.17.15"
|
||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
|
||||
integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
|
||||
|
||||
lolex@^4.0.1, lolex@^4.1.0:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.yarnpkg.com/lolex/-/lolex-4.1.0.tgz#ecdd7b86539391d8237947a3419aa8ac975f0fe1"
|
||||
integrity sha512-BYxIEXiVq5lGIXeVHnsFzqa1TxN5acnKnPCdlZSpzm8viNEOhiigupA4vTQ9HEFQ6nLTQ9wQOgBknJgzUYQ9Aw==
|
||||
|
||||
mobx@^5.10.0:
|
||||
version "5.13.0"
|
||||
resolved "https://registry.yarnpkg.com/mobx/-/mobx-5.13.0.tgz#0fd68f10aa5ff2d146a4ed9e145b53337cfbca59"
|
||||
integrity sha512-eSAntMSMNj0PFL705rgv+aB/z1RjNqDnFEpBe18yQVreXTWiVgIrmBUXzjnJfuba+eo4eAk6zi+/gXQkSUea8A==
|
||||
|
||||
nise@^1.4.10:
|
||||
version "1.5.0"
|
||||
resolved "https://registry.yarnpkg.com/nise/-/nise-1.5.0.tgz#d03ea0e6c1b75c638015aa3585eddc132949a50d"
|
||||
integrity sha512-Z3sfYEkLFzFmL8KY6xnSJLRxwQwYBjOXi/24lb62ZnZiGA0JUzGGTI6TBIgfCSMIDl9Jlu8SRmHNACLTemDHww==
|
||||
dependencies:
|
||||
"@sinonjs/formatio" "^3.1.0"
|
||||
"@sinonjs/text-encoding" "^0.7.1"
|
||||
just-extend "^4.0.2"
|
||||
lolex "^4.1.0"
|
||||
path-to-regexp "^1.7.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==
|
||||
|
||||
path-to-regexp@^1.7.0:
|
||||
version "1.7.0"
|
||||
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d"
|
||||
integrity sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=
|
||||
dependencies:
|
||||
isarray "0.0.1"
|
||||
|
||||
pathval@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0"
|
||||
integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA=
|
||||
|
||||
picomatch@^2.0.4:
|
||||
version "2.0.7"
|
||||
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6"
|
||||
integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==
|
||||
|
||||
printable-characters@^1.0.42:
|
||||
version "1.0.42"
|
||||
resolved "https://registry.yarnpkg.com/printable-characters/-/printable-characters-1.0.42.tgz#3f18e977a9bd8eb37fcc4ff5659d7be90868b3d8"
|
||||
integrity sha1-Pxjpd6m9jrN/zE/1ZZ176Qhos9g=
|
||||
|
||||
readdirp@^3.1.1:
|
||||
version "3.1.1"
|
||||
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.1.1.tgz#b158123ac343c8b0f31d65680269cc0fc1025db1"
|
||||
integrity sha512-XXdSXZrQuvqoETj50+JAitxz1UPdt5dupjT6T5nVB+WvjMv2XKYj+s7hPeAVCXvmJrL36O4YYyWlIC3an2ePiQ==
|
||||
dependencies:
|
||||
picomatch "^2.0.4"
|
||||
|
||||
sinon@^7.2.7:
|
||||
version "7.3.2"
|
||||
resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.3.2.tgz#82dba3a6d85f6d2181e1eca2c10d8657c2161f28"
|
||||
integrity sha512-thErC1z64BeyGiPvF8aoSg0LEnptSaWE7YhdWWbWXgelOyThent7uKOnnEh9zBxDbKixtr5dEko+ws1sZMuFMA==
|
||||
dependencies:
|
||||
"@sinonjs/commons" "^1.4.0"
|
||||
"@sinonjs/formatio" "^3.2.1"
|
||||
"@sinonjs/samsam" "^3.3.1"
|
||||
diff "^3.5.0"
|
||||
lolex "^4.0.1"
|
||||
nise "^1.4.10"
|
||||
supports-color "^5.5.0"
|
||||
|
||||
source-map@^0.6.1:
|
||||
version "0.6.1"
|
||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
|
||||
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
|
||||
|
||||
stack-trace@^0.0.10:
|
||||
version "0.0.10"
|
||||
resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
|
||||
integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=
|
||||
|
||||
stacktracey@^1.2.112:
|
||||
version "1.2.117"
|
||||
resolved "https://registry.yarnpkg.com/stacktracey/-/stacktracey-1.2.117.tgz#7249d41937c37af29011173131d6b9aa62e6ec05"
|
||||
integrity sha512-sj9olGCco8jxMw3fcmhL5er1yuVL2qSMhNfycwx+iIWz6uVpG+bQ2YNpVSlWscGmSskt61gSmUBjZ0Mb5jYBLw==
|
||||
dependencies:
|
||||
as-table "^1.0.36"
|
||||
get-source "^1.0.34"
|
||||
|
||||
supports-color@^5.5.0:
|
||||
version "5.5.0"
|
||||
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
|
||||
integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
|
||||
dependencies:
|
||||
has-flag "^3.0.0"
|
||||
|
||||
to-regex-range@^5.0.1:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
|
||||
integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
|
||||
dependencies:
|
||||
is-number "^7.0.0"
|
||||
|
||||
type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5:
|
||||
version "4.0.8"
|
||||
resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
|
||||
integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
|
||||
|
||||
typescript@^3.5.3:
|
||||
version "3.5.3"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977"
|
||||
integrity sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==
|
||||
|
||||
ws@^7.0.0:
|
||||
version "7.1.1"
|
||||
resolved "https://registry.yarnpkg.com/ws/-/ws-7.1.1.tgz#f9942dc868b6dffb72c14fd8f2ba05f77a4d5983"
|
||||
integrity sha512-o41D/WmDeca0BqYhsr3nJzQyg9NF5X8l/UdnFNux9cS3lwB+swm8qGWX5rn+aD6xfBU3rGmtHij7g7x6LxFU3A==
|
||||
dependencies:
|
||||
async-limiter "^1.0.0"
|
||||
26
demo/php/demo.php
Normal file
26
demo/php/demo.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
$graph = [
|
||||
"kind" => ["graph" => true],
|
||||
"nodes" => [
|
||||
["id" => "1", "label" => "1"]
|
||||
],
|
||||
"edges" => []
|
||||
];
|
||||
|
||||
// Visualize "$visualize()"
|
||||
$visualize = function () use (&$graph) {
|
||||
return json_encode($graph);
|
||||
};
|
||||
|
||||
for ($i = 2; $i < 100; $i++) {
|
||||
$targetId = "" . random_int(1, $i - 1);
|
||||
$id = "" . $i;
|
||||
|
||||
array_push($graph["nodes"], ["id" => $id, "label" => $id]);
|
||||
array_push($graph["edges"], ["from" => $id, "to" => "" . $targetId]);
|
||||
|
||||
xdebug_break();
|
||||
}
|
||||
|
||||
echo "finished";
|
||||
Reference in New Issue
Block a user