diff --git a/.config/1espt/PipelineAutobaseliningConfig.yml b/.config/1espt/PipelineAutobaseliningConfig.yml new file mode 100644 index 000000000..4434d09aa --- /dev/null +++ b/.config/1espt/PipelineAutobaseliningConfig.yml @@ -0,0 +1,21 @@ +## DO NOT MODIFY THIS FILE MANUALLY. This is part of auto-baselining from 1ES Pipeline Templates. Go to [https://aka.ms/1espt-autobaselining] for more details. + +pipelines: + 494: + retail: + binary: + credscan: + lastModifiedDate: 2024-03-13 + binskim: + lastModifiedDate: 2024-03-13 + spotbugs: + lastModifiedDate: 2024-03-13 + source: + credscan: + lastModifiedDate: 2024-03-13 + eslint: + lastModifiedDate: 2024-03-13 + psscriptanalyzer: + lastModifiedDate: 2024-03-13 + armory: + lastModifiedDate: 2024-03-13 diff --git a/.config/credscan/Suppressions.json b/.config/credscan/Suppressions.json new file mode 100644 index 000000000..419b41b02 --- /dev/null +++ b/.config/credscan/Suppressions.json @@ -0,0 +1,9 @@ +{ + "tool": "Credential Scanner", + "suppressions": [ + { + "file": "artifacts/bin/Microsoft.TryDotNet.IntegrationTests/Release/net9.0/.playwright/package/ThirdPartyNotices.txt", + "_justification": "This file is a third party notice text file, but not a real issue, and not one we distribute" + } + ] +} \ No newline at end of file diff --git a/.config/guardian/.gdnbaselines b/.config/guardian/.gdnbaselines new file mode 100644 index 000000000..e0a1e0789 --- /dev/null +++ b/.config/guardian/.gdnbaselines @@ -0,0 +1,29 @@ +{ + "properties": { + "helpUri": "https://eng.ms/docs/microsoft-security/security/azure-security/cloudai-security-fundamentals-engineering/security-integration/guardian-wiki/microsoft-guardian/general/baselines" + }, + "version": "1.0.0", + "baselines": { + "default": { + "name": "default", + "createdDate": "2024-03-13 17:27:58Z", + "lastUpdatedDate": "2024-03-13 17:27:58Z" + } + }, + "results": { + "dadd4935cc62146c68a2bc507ab14dbdaa10b05aed99d1c0afcf677bd22a0dba": { + "signature": "dadd4935cc62146c68a2bc507ab14dbdaa10b05aed99d1c0afcf677bd22a0dba", + "alternativeSignatures": [], + "target": "artifacts/bin/Microsoft.TryDotNet.IntegrationTests/Release/net8.0/.playwright/package/ThirdPartyNotices.txt", + "line": 1240, + "memberOf": [ + "default" + ], + "tool": "credscan", + "ruleId": "CSCAN-GENERAL0030", + "createdDate": "2024-03-13 17:44:29Z", + "expirationDate": "2024-08-30 18:33:33Z", + "justification": "This error is baselined with an expiration date of 180 days from 2024-03-13 18:33:33Z" + } + } +} \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 61c0e2a93..bda5d84d6 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -4,14 +4,13 @@ about: Create a report to help us improve title: '' labels: '' assignees: '' + --- #### Describe the bug Please provide as much information as you can. -#### Did this error occur while using `dotnet try` or online? -- [ ] `dotnet-try` -- [ ] online +#### What is the URL where you saw the error? #### What kind of error was it? - [ ] User Interface (UI): For example the output never displayed @@ -23,7 +22,7 @@ If applicable, add screenshots to help explain your problem. #### Please complete the following: - OS - - [ ] Windows 10 + - [ ] Windows - [ ] macOS - [ ] Linux (Please specify distro) - [ ] iOS @@ -31,4 +30,5 @@ If applicable, add screenshots to help explain your problem. - Browser - [ ] Chrome - [ ] Edge + - [ ] Firefox - [ ] Safari diff --git a/.gitignore b/.gitignore index 9bbb21045..beb49b1ce 100644 --- a/.gitignore +++ b/.gitignore @@ -378,3 +378,27 @@ docs/\.ionide/ #Backup files *.bak NotebookExamples/*/Samples/housing.csv + +src/microsoft-trydotnet-editor/test-results/ + +src/microsoft-trydotnet-editor/dist/ + +src/microsoft-trydotnet-editor/simulatorGenerator/ + +src/microsoft-trydotnet-editor/lib/ + +src/microsoft-trydotnet/test-results/ + +src/microsoft-trydotnet/dist/ + +src/microsoft-trydotnet/simulatorGenerator/ + +src/microsoft-trydotnet/lib/ + +src/Microsoft.TryDotNet/wwwroot/api/ + +src/Microsoft.TryDotNet/wwwroot/css/trydotnet.css + +src/microsoft-learn-mock/dist/ + +src/microsoft-learn-mock/site/index.js diff --git a/Developer-guide.ipynb b/Developer-guide.ipynb new file mode 100644 index 000000000..41ff3c797 --- /dev/null +++ b/Developer-guide.ipynb @@ -0,0 +1,503 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Prerequisites\n", + "\n", + "In order to build Try .NET, you'll need the following installed:\n", + "\n", + "* The [.NET 9 SDK](https://learn.microsoft.com/en-us/dotnet/core/install/).\n", + "* The LTS version of [Node.js](https://nodejs.org/en/download)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 1: [Optional] Build .NET Interactive\n", + "\n", + "The core functionality in Try .NET is the .NET Interactive repo, which contains the `CSharpProjectKernel` that powers Try .NET's compilation and language services. \n", + "\n", + "* If you're making changes in that layer, then you'll need to build the .NET Interactive packages locally. \n", + "\n", + "* If not, skip to step 2.1." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1.1: Clone, build, and pack .NET Interactive\n", + "\n", + "First, make sure you have the [.NET Interactive repo](https://github.com/dotnet/interactive) forked and cloned. Set the path to the repo root in the following cell. \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "pwsh" + }, + "polyglot_notebook": { + "kernelName": "pwsh" + } + }, + "outputs": [], + "source": [ + "$dotnetInteractiveRepoPath = Read-Host -Prompt \"Enter the path to the root of your dotnet/interactive clone\"\n", + "$dotnetInteractiveRepoPath" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Follow the instructions to build .NET Interactive in the [developer guide](https://github.com/dotnet/interactive/blob/main/DEVELOPER-GUIDE.md). \n", + "\n", + "You don't need to set up a local build of the Polyglot Notebooks extension to work on Try .NET.\n", + "\n", + "The following script will build the project and copy the generated packages to C:\\temp\\packages\\ which will be be used a NuGet package source when building Try .NET." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "pwsh" + }, + "polyglot_notebook": { + "kernelName": "pwsh" + } + }, + "outputs": [], + "source": [ + "Invoke-Expression \"$dotnetInteractiveRepoPath\\repack.ps1\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1.2: Update Microsoft.DotNet.Interactive.CSharpProject version used by Try .NET\n", + "\n", + "This step only needs to be done if you're changing code from the .NET Interactive repo.\n", + "\n", + "This step modifies NuGet.config to reference the local package source where .NET Interactive packages build in Step 1.* should be found." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "pwsh" + }, + "polyglot_notebook": { + "kernelName": "pwsh" + } + }, + "outputs": [], + "source": [ + "$tryDotnetRepoPath = Get-Location\n", + "\n", + "$nugetConfigPath = Join-Path $tryDotnetRepoPath 'NuGet.config'\n", + "[xml]$nugetConfig = Get-Content $nugetConfigPath\n", + "\n", + "$newPackageSource = $nugetConfig.CreateElement(\"add\")\n", + "$newPackageSource.SetAttribute(\"key\", \"LocalDevPackages\")\n", + "$newPackageSource.SetAttribute(\"value\", \"C:\\temp\\packages\")\n", + "\n", + "$packageSourcesNode = $nugetConfig.SelectSingleNode('configuration/packageSources')\n", + "$packageSourcesNode.AppendChild($newPackageSource) > $null\n", + "\n", + "$packageMappingNode = $nugetConfig.CreateElement(\"packageSource\")\n", + "$packageMappingNode.SetAttribute(\"key\", \"LocalDevPackages\")\n", + "$packageNode = $nugetConfig.CreateElement(\"package\")\n", + "$packageNode.SetAttribute(\"pattern\", \"*\")\n", + "$packageMappingNode.AppendChild($packageNode) > $null\n", + "\n", + "$packageSourcesNode = $nugetConfig.SelectSingleNode('configuration/packageSourceMapping')\n", + "$packageSourcesNode.AppendChild($packageMappingNode) > $null\n", + "\n", + "$nugetConfig.Save($nugetConfigPath)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, update the referenced version of the package." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "pwsh" + }, + "polyglot_notebook": { + "kernelName": "pwsh" + } + }, + "outputs": [], + "source": [ + "# Define the path to the Directory.Packages.props file\n", + "$packagesPropsPath = \"$tryDotnetRepoPath\\Directory.Packages.props\"\n", + "\n", + "# Load the XML content of the Directory.Packages.props file\n", + "[xml]$packagesProps = Get-Content $packagesPropsPath\n", + "\n", + "# Define the namespace to handle the default namespace in the document\n", + "$namespaceManager = New-Object System.Xml.XmlNamespaceManager($packagesProps.NameTable)\n", + "$namespaceManager.AddNamespace(\"msb\", \"http://schemas.microsoft.com/developer/msbuild/2003\")\n", + "\n", + "# Ensure that the ItemGroup element exists\n", + "$itemGroup = $packagesProps.SelectSingleNode(\"msb:Project/msb:ItemGroup\", $namespaceManager)\n", + "if ($itemGroup -eq $null) {\n", + " $itemGroup = $packagesProps.CreateElement(\"ItemGroup\", $namespaceManager.LookupNamespace(\"msb\"))\n", + " $packagesProps.DocumentElement.AppendChild($itemGroup)\n", + "}\n", + "\n", + "# Check if the PackageVersion element for the package already exists\n", + "$packageRef = $itemGroup.SelectSingleNode(\"msb:PackageVersion[@Include='Microsoft.DotNet.Interactive.CSharpProject']\", $namespaceManager)\n", + "\n", + "if ($packageRef -eq $null) {\n", + " # If the package reference doesn't exist, create it\n", + " $newPackageRef = $packagesProps.CreateElement(\"PackageVersion\", $namespaceManager.LookupNamespace(\"msb\"))\n", + " $newPackageRef.SetAttribute(\"Include\", \"Microsoft.DotNet.Interactive.CSharpProject\")\n", + " $newPackageRef.SetAttribute(\"Version\", \"2.0.0\")\n", + " $itemGroup.AppendChild($newPackageRef)\n", + "} else {\n", + " # If it exists, just update the version\n", + " $packageRef.SetAttribute(\"Version\", \"2.0.0\")\n", + "}\n", + "\n", + "# Save the changes back to the Directory.Packages.props file\n", + "$packagesProps.Save($packagesPropsPath)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.1: Build Try .NET" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "pwsh" + }, + "polyglot_notebook": { + "kernelName": "pwsh" + } + }, + "outputs": [], + "source": [ + "$tryDotnetRepoPath = Get-Location\n", + "\n", + "$tryDotNetProjectFilePath=\"$tryDotnetRepoPath\\src\\Microsoft.TryDotNet\\Microsoft.TryDotNet.csproj\"\n", + "$mockMsLearnServerPath=\"$tryDotnetRepoPath\\src\\microsoft-learn-mock\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, build the client pieces, which includes the `trydotnet.js` library." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "pwsh" + }, + "polyglot_notebook": { + "kernelName": "pwsh" + } + }, + "outputs": [], + "source": [ + "if ($IsWindows) {\n", + " Invoke-Expression \"$tryDotnetRepoPath\\build-js.cmd\"\n", + "} else {\n", + " Invoke-Expression \"$tryDotnetRepoPath/build-js.sh\"\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, build the Try .NET service." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "pwsh" + }, + "polyglot_notebook": { + "kernelName": "pwsh" + } + }, + "outputs": [], + "source": [ + "dotnet build -c Debug $tryDotnetRepoPath" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.2: Start the Try .NET service\n", + "\n", + "This launches the Try .NET web service. It will launch in a separate terminal window. Closing that window will stop the server." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "pwsh" + }, + "polyglot_notebook": { + "kernelName": "pwsh" + } + }, + "outputs": [], + "source": [ + "Start-Process pwsh -ArgumentList \"-c dotnet run --no-build --project ${tryDotNetProjectFilePath} --launch-profile TryDotNet-Development\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* _Note: If the above crashes with an error that looks like the following, the issue is hardcoded paths in the `Prebuild` folder. If you delete them, they will be regenerated on startup._\n", + "\n", + " ```console\n", + " Logging to: c:\\temp\n", + " Unhandled exception. System.IO.FileNotFoundException: Could not find a part of the path 'C:\\Program Files\\dotnet\\packs\\Microsoft.NETCore.App.Ref\\8.0.8\\ref\\net8.0\\Microsoft.CSharp.dll'.\n", + " File name: 'C:\\Program Files\\dotnet\\packs\\Microsoft.NETCore.App.Ref\\8.0.8\\ref\\net8.0\\Microsoft.CSharp.dll'\n", + " ---> System.IO.DirectoryNotFoundException: Could not find a part of the path 'C:\\Program Files\\dotnet\\packs\\Microsoft.NETCore.App.Ref\\8.0.8\\ref\\net8.0\\Microsoft.CSharp.dll'.\n", + " ```\n", + "\n", + " _The following cell will tell you where the prebuilds are located on your machine. You can delete this directory entirely to allow the prebuilds to be rebuilt when the Try .NET service starts._" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "csharp" + }, + "polyglot_notebook": { + "kernelName": "csharp" + } + }, + "outputs": [], + "source": [ + "using System.IO;\n", + "\n", + "string PrebuildPathEnvironmentVariableName = \"TRYDOTNET_PREBUILDS_PATH\";\n", + "\n", + "var environmentVariable = Environment.GetEnvironmentVariable(PrebuildPathEnvironmentVariableName);\n", + "\n", + "var prebuildsLocation =\n", + " environmentVariable is not null\n", + " ? new DirectoryInfo(environmentVariable)\n", + " : new DirectoryInfo(\n", + " Path.Combine(\n", + " Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),\n", + " \".trydotnet\",\n", + " \"prebuilds\"));\n", + "\n", + "prebuildsLocation.ToString().Display();\n", + "\n", + "// UNCOMMENT TO DELETE THIS FOLDER AND RESET\n", + "// prebuildsLocation.Delete(recursive: true);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.3: Verify Try .NET by running Peaky tests" + ] + }, + { + "attachments": { + "image.png": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAo4AAAERCAYAAAD11ibrAAAgAElEQVR4Ae29b8x+W1rfxStNKL/n/Jth6PDnzBTO/D+jwlgZ6JR2LBQzUikDRSQtFCxNJdBmKuoZNdYztmWmlPYUsBzbKlg7VCWkGidi3yDvDGmOIaRRk1pDwisTXpSW1HdbPk/5wMX6rb3Xuv8893P/+Z5kn7X2Wte6rmtd13fv63vvfT/377M+85nPLJ/4xCeWr/qqr1re//7350gMgoFgIBgIBoKBYCAYCAa6GPgsSGMIYwhzMBAMBAPBQDAQDAQDwcAIA5+VJ40ByQgkmQ9GgoFgIBgIBoKBYAAMfFaAECAEA8FAMBAMBAPBQDAQDMxgIMQx32HIVxWCgWAgGAgGgoFgIBiYwkCIY4AyBZSZTyGRyafVYCAYCAaCgWDgujEQ4hjiGOIYDAQDwUAwEAwEA8HAFAZ2Io7vfOc7ly/4gi9Y3vSmNy13d3fLb/ttvy1HYhAMPBIGuAbf/OY331+T73rXu6Yu+DwJuO4nAclv8hsMBAMPjYFp4vj5n//5y+d8zufkSAyCgTPFAB/qHvqGEf0pSsFAMBAM3DYGhsTx5ZdfXp577rmQhTMlCyHz+TBTMfDCCy8sXLO5sd/2jT35T/6DgWDgoTAwJI550hhiUolJ+uePhzx5TMF4qIIRvcFWMBAMbBLHl156aXny5EmeNuZpYzBwQRjgmn3HO95xlk8dP/ShD52lXymGKYbBQDAQDMxhYJU48rrrrW99awjDBRGGPA08/6eBp8oRTx3P8ZV1iOPcjTkFLHEKBoKBc8XAKnF83/ved/8Xm6cqdLET0hMMHA8Db3nLWxau4XO78YQ4phieGybjTzAZDOyGgVXi+N73vnd55pln8sQxTxyDgQvEAH/QxjV8bjfEEMfdbtDnlr/4k/wFA8HAKnF8z3veE8JwgYQhT+2O99Tu0mPJNXxuN/kQxxSdc8Nk/Akmg4HdMLBKHN/97neHOIY4BgMXjAGu4XO7IYY47naDPrf8xZ/kLxgIBo5GHP/on/z48uN/943lx/6XN5Yf++k3lv/yf35j+eufeWP5a//TG8vr/+Mby4/+D28sf/XvvLH8yE+9sfzwT76x/JX//o3lL/+3b4SYXDAxufQnctfu/0MQx+/7vu87iIyGOKbohHgEA8HAZWPgaMTxz/znf3t5+Wv+7eVP/pkfXr73P/mh5T2/9w8v7/rd/+by0ld8dPni3/l1y9u+9PcvX/jy71ne+q4PLp/7xV+6vPBF71n+1J/9WyGORyaO3/Zt35aYHjmmxyaYkK+1PPF6+Ud/9EePksOHII6/+Iu/GOKYf8/2IAyENFw2aUj+kr+jEMcXf8dLy7/3l37injj+3M//nwv/vfLn/+ryjq/8xuWLf+cfWN72pV+7fOH7f+/y1nd/xfKWL/my5YUveu/y7G//4uW7/oMfOkqBPHZhv1R9kBH++4mf+In7uP6Df/APls985jM3FeN990zcIHTkvvYfAgvk6Zd/+ZefIo+Qxl/6pV8KcQwxCzELBoKBYOBsMXAU4vj7vu6blm/52A8s7/vq71i+4Y/9R8uv/ONfXX7ln/x/y9f9kX93efuXfe3yRe//8PLWd3/l8pYv+cDyphfftzz7279keelf+NDydd/yPTuTGp7GUFz9j34t7s7XMfoQqPof677/+7//t6xt15zzed0LfQgT/kIa/cOmfUnUz/3czy0/8zM/81Rs0Ff/+4Vf+IWnyM8pYsb+8NH/yOXXfM3X3Pu7757R1RLHXhyQ4b9D99mSx2OTRvy75CeOH/7wh1dvmltzeRqSpyHBQDAQDDwsBo5CHL/9ez++fOVH/+Ty3g9/2/Lur/q3ln/j279v+Uf/+J8s/+hX/snytX/ou5bPf89XLm95CdL48vLcW19anrzpC5ff9wf/+PLyl31opwIMmeE/Wgo4R/tajwL8q7/6q08RGomj6yAbyEmyDiUCp15PHCA27qf36nNfEoVOYtPuCX3EjXlINzKMtXIPfc6+eWKHD/gCHszjvnsmnujCd/u9OGBHuUP3KXlEH3FtsXyo/ksmjj//8z+/fPKTn3yKPDLGXArDwxaGxDfxDQaCgTUMHIU4ft8n//ry3n8V0vityzt/1zctX/LlX798yx//9+8L8D/6lX+8fMH7v2Z509vevzz31ncsT978RctnP/Pm5Tu/74eWN73586ZJB0WW/3wN2xZVCIMkBmLBUWUkjo5RrPmPljnXS5iwxxM1/6MvOaFFP/9BYJRDt3q1hx58Ro7/0C9BqLKMcyBbdbNen2uLLmzUMfr8h176lURVn5HxiWI7bnzxVz+1YYw8d4+cQ+IgP/zHPtSPPs5dgwwH59jmP/bY+uF65PiPc+PT+qFuWuaQpeU/WnQzhx3H0VX3h6xxq/1eHKq9Q/sVA4fqatcfShzxje801uOf/tN/+lvOmfv0pz89TeRm/ziGp4r/8B/+w99CHiGNjOWJYwraWkHLeLARDDw8Bg4mjm9+y+ctH/+hn1ze/XsgjX/onjR+5Fu/Z/n7/9f/fV+4f+7v/9Lytq/4tuW5z3/ncvfmF5fPfvZzl3/us++W7/jTf+U3yERb8HrnEBD+kwS0MpAYiRQEAWJQZSU5FENJDjLocY5WoiYhRAcHZAfSgTzEjnlejzqHb8xJBCCT9BlDp/1KpJSVrElA8Q+9+oCO9sAefqCDw1e1jGsLf40JspJfdUOcsM3eGEOH+2fc/Wqbc2TRz1rih07W8Z+2jD/nzjGGDdbwH332yR7Rv+Yfc/yHXeNCy3/oMgbVR3OjbePLePURHchow7gxbr8XB20d2hID9oVP+GbsD9Xr+kOJY+8GfMo/jqnkMaTx4YtBL98ZS9yDgWCgxcDBxPFf+lc+tHzrn/6Lyzs/9M3Ll3zwDy6f+MG/dl/U+d/3/1c/u7z9d/+x5YUX37/cfS6k8S3LP//Zzyxv+rwXl4/+0Y8/RYYseL2W4sp/vbneGAVZwsC863UOwmOhtnCrh3H+kzwwji7+ow9hYY3y6uacNfwnIWEMfRAcfPK/KtvTwxh6W/KmrHps9Ydz/a7EUcKmPC1r9Jd4sEfIDDZo+c8YMYY+/5O0IVdjo3/o03dIETKQTeLAOeSPJ4Ocs2bNP+b4rz4dZIz4otOYoo/xuud6bk7139ZYcd7r9+KA3kMP9OK7+8K/Y5PHSyeO3Kwkj3nSmOLVFq+cBxPBwONg4GDi+I3f/j3Lhz76PcuXfc0fXv7u//q/3dfj/+P/+X+Xb/jYjy3f/CdeXT75gz+y/Pm/8NryZz/5F5f/7M99//KlH/iXlw986A8sX/n7vmmn4ivBgSzMFG0KMoVY2UruHLNtCZq2JBLIVXLEJiVqzFXdrlU3LX5AkCAHdb72Wz2eS76qPvqtD84zrt+VRK3Jsw4Sxh7ws9rDZ4kdcszVeW3W/TtWiSMEkXN0kRfOOSBOEr4t/+qe1F9b9KCfsbrnem6sjU1dT7/aqH3m2ji0a3c9b0mj649NHq+BOFIYvvzLv/z+SJF4nCKRuCfuwUAwUDFwMHH8U6/+1eWlr/iG5bW/9un74vs3P/O/Lx/4xv90ectLv3P55F/6kfux+r8/91/89PLN3/Xq8gUvvvQbpM7COWohBfwHUYEAQDros47Wvnp4iiVRYI7/nKstcy0hgkRBRijyFnrJCS1kpc6pW4JS9TMn4YWErMm2Pvb8Ui86mPfclnH3XEkUPrMnn4RC4PCfc+XxERl1QWSIIXKMoa+NE+PoqP64zj2jHz3qIm/Ej/+0teYf8/ynj5wTQ3Qzxj7Qq626Z2TrOXLYMW+s1X61UfvMux/j4Jp9W+xW21UPtiDVdWzf/rUQx3rDSj8FLBgIBoKBx8XAwcTxP/7hv3P/A9+/6yN/ZPn6f+e15e1f+Uf+2Q98f+F7lmc+73csX/Bl37S89V/8+uXzXv7Xl89977+2vPDSVy1/4j/863sVRgo3ZAly438SgR6poQBDMii8LSmrxbhH0Cjg6PQ/9EgcIErOSTCRQydkxr42IAn8B3GpfrSydU6fsaOe2qIP+TpGn/8kWaxVBt+Jlf/RZx+QOONJ6xNA9ULwJDnoW/On6nGf6qBlrK7FD3xQZs0/5vnPPXFOLvQZvZVo1T0jW8/JqYSVdWKjtdHaY77GgfNLOB6COO7yhzC9m/vsH8f01mbscYtF4p/4BwPBABg4mDi2/5TgD/3kG8tr/90by1/+228sP/gTbyw/8LfeWP7Cf/PG8qm/+cbyyf/6nx27fr9x3yLtkzAJ3756RusgZxCZkdwlzkMaIU2X6Psxfb7EODwEcTy0cIQ4pvAciqGsD4aCgcfFwMHE8ZjF+SF08VSpfYp2qB0IKQd6fI3pk71DdZ/bekg3T+3c77n5dyp/LjEOIY6Pe3NNcUv8g4Fg4BoxcPXE8SGIBU+f6qvSayWNDxG76Dzda+4QxxStayxa2VNwHQw8LgZCHC/k+2ohXKcjXNcS6xDHx725prgl/sFAMHCNGAhxDHG8+e8vXgtRbPcR4piidY1FK3sKroOBx8VAiGOIY4jjlWIgxPFxb64pbol/MBAMXCMGQhyvlDS0T59yfnuvukMcU7SusWhlT8F1MPC4GOgSx5dffnl5xzvekSdRIZXBwAVj4F3veteSG+zj3mAT/8Q/GAgGrg0DXeL4vve9b3nxxRdDGi6YNOQJ4+09YWxz/va3v33hWr62m1b2k0IcDAQDwcDjYeAp4kiheec737k888wzIY4hjsHABWPg2WefXXjqGPL4eDfYFLfEPhgIBq4NA5/F96A8eD3Nk8aQxjytap9e5fwyMQF5fNvb3nb/1ROv85deemm51cMYpP3N+35ikVgEA8HALhj4rBCCyyQEyVvyFgwEA8FAMBAMBAOnxkCI4wW/ijw1WGIvN6hgIBgIBoKBYOC2MRDiGOKY7zEGA8FAMBAMBAPBQDAwhYEQxwBlCij5hHnbnzCT/+Q/GAgGgoFgAAyEOIY4hjgGA8FAMBAMBAPBQDAwhYEQxwBlCij5pJlPmsFAMBAMBAPBQDAQ4hjiGOIYDAQDwUAwEAwEA8HAFAZCHAOUKaDkU2Y+ZQYDwUAwEAwEA8FAiGOIY4hjMBAMBAPBQDAQDAQDUxgIcQxQpoCST5n5lBkMBAPBQDAQDAQDIY4hjiGOwUAwEAwEA8FAMBAMTGHgoonjT/3UTy0/+7M/u3zgAx+Y2mw+Kc19Unr729++/L2/9/eWT3ziE4lrbiTBQDAQDAQDwUAw8BsYGBLHT3/60wvHOZIuSCME56u/+qsf1b9v/MZvvCdZ10Rgf/iHf/ielEMit3J/jXvf2m/m5j58JE6JUzAQDAQD14mBiyaOELXHJo1cGDyZg8BCoq7lQiG27OmVV17Z3NM17v1acph9XOdNO3lNXoOBYOAxMXDRxPExA1dtXyt5+ht/428sP/3TPx3imFcUmxio10L6KWjBQDAQDFw3Bo5GHL/jO77jnmTwlIpXyLzqrK856TPGPMcP/MAP/MaTOkE2I8NTPXXYut6WV+t8//F7v/d7731BjrH6dHLGlvrWWgmjfrRtXTeKj7Lsj/gRH8d2bbHF/vWHPmOtnpEtY00c27W77r36U7GhDfbLviGq5o1zX//3corOmtPWx5xf980r+U1+g4FgIBg4PQaOQhwhJZAUij6EgidVnNfvRkoamUOGOQ7kTPyMDESC9eqo69WjXloIiXohGso4tuWPsmstpKf6gU59o3XdTHyUhTSxJ/xybJdWIib5lJBVEqa+GVvEsMbNtfvu3bijF136iw3jZByJg3Fsc7q1L31Me/obSmKemAcDwUAwcN0YOApxtKj7dAjQ1DGe7kECJAuCCqIp8ZuRcZ0tpML1jtFqG1LiuGSW831sqafX6ke1V+X0Zy0+VZY+T9HwsR2fOXef9UkcBBEf6pi6RrYkl2t7G+0dfyCtdT+uIR4SR8bwSbLYjhvD6oe+jb6H6V7TXvfNLPlNfoOBYCAYeHgMHIU49kih5IBC35IAE8tTI4nfjIzrbLXhua0kw3PaKruPraqr7asbve0c56P49NbsO9azta8u10HwianntZ3dO7HxgOjhp+f00YNe+8zZZ7yX0ypffUr/4W8ciXFiHAwEA8HAbWLgUYmjpAPwtURBQFYZx2zX5noko8ruY0ubvVbd6O3NQ4Ba4jVa09MzM8bTvd6r5Zm1azI+2atPTJUd7QN/2H/vIF5tLiSL7Xgvp/igvP6kvc0bWfKevAcDwUAwcBoMHIU4WtQrsahjvhrmu2s1sX7fjbEZmbqWvqSlHdd2Ha+y+9iqutq+unt/gIKs/qzFp9U3en3cytfz3qvqOt/2Z2wRLwhgmz90jfaOPzyxREdrm/OWIEoE23FjWPX4nci8qj7NzaKXv4wl9sFAMBAM3BYGpoijf/QCSagHxR3AWMCVk7xQ7AWUhd8/fJBQQBR2kYHoYJdD4um5xExb6qWV4DimzJY/yo5afGIfkCtev2OLVn9m4qMNn+4RH8d2aYkFvnC4N/yh3+rZxZbxc0/qGu2deeIi8USPBzr0lzHO8Zt+O26+aJnPH8fc1o1KvKVN3oOBYCAYeFwMTBFHiUjbWuxJIuQI4oiMJKE+HaIv0UNGUkNfEMzISCBaXzjXH2XUS8vcrrbq+lGf/fOKuPoFaXLdKD7KQZgkoI7t2qJD8q4/5KbVs4stclNjXHWN9k4c8Id96Y/EuCWI2mjHzSlkVz3EG7nqS/qPe0NJ/BP/YCAYCAauGwND4viQAJAMbNmYkdlav8vcKW3t4te5yEL2IW31A8GpfEturvtGdCocxU5wFAwEA8HAYRh4NOLoK86tP+SYkTkWAE5p61g+n1oPr6l5IvgY3ykMcTzsQj81VmIv+QoGgoFg4DoxcDLiyCtGv5smCYCE8JpTcM3IKHtoe0pbh/p6Tush2Byn9knMnNpu7F3njS95TV6DgWAgGNgPAycjjn7HELLI9+34jlv7/bQZmWMl+pS2juXzLesJcdzvAr9lzGTvwUwwEAwEA8fHwMmIY5J3/OQlpolpMBAMBAPBQDAQDJwSAyGOnxPAnRJwsRW8BQPBQDAQDAQDl4uBEMcQx5N/XzE3jMu9YTxW7viKSz346sKxfalfX9EWY8e2E33BfzAQDFwyBnYijs9/6m554fW75e7lw5J+98Eny3Mff7K88ON39wf9cw8if/3NT9G0P4B97n6P/OMPXepvPvr7iqN11zB/iTmd8fmUOZ3x5xhYgchBFiFyHPxx2zH0Vh1851r9/uZsiONh9/oa3/QTy2DgOjCwE3GENEL2IH77AgDSea/n9bvl2e9+sjz7nU+WZz66v759/fCJAv8CCTooto71ioU/Ov0Yf1G87x5H6yDB7IvDf/GmFmQL6SFk2YJffUEv4+0fR1WZffu7+HwOOYUM7fL0bOTzKKczcT3HGIKX3nXJfvAXouc/QLAWT35GquK7h03jg84tm8qlvY5CmDwmj8HAPAZ2Io6QvkNII4mBLEI+n/nw6cliBQZFgYMnJoxTVBzrFSgK8jWRRvYMWWTPFMkaG/vEYWteua2W9W0htyiv2d3SN5rbxedzyOmuxHHk8yino/gxf44xBEe961J/IY0+JWzx5p7R4QdFxnrYVFaMrtlULu18sUmsEqtg4DowsBNxPEbSn3/1bnn+tbsuUTmG/lkdFA1IIy1reEXrE4tbKRYUWPa8FrNdCMSajl5xtig/NnFc8/mU47sSx5Fvo5yO1jN/jLzP2NlFBhzNXJc9vGFHzOWJ43UUrl2wE9nkPBg4LgaGxJEng34X0bZNwj0Z/NTd/StnX2cz1ns6eS/76jpxfOYjT+6J5b2t1++W5z72ZHny4tObphD4irX1Z+bcQoQOdNUnFhYoiw2yHj3d7b/VDCGtP2zuWmzwxIjizhjn9SkmaxhjDr94gtL+834UPtdXvdWvGT3Ir5EWiYP627baGvVZi50qZ1xpHZ/xeWvvsz5ru+5JH2zxlxxiz1fDjNVctf+uuq/60auemXYtB3XtjM/Kj/QRZz8w4WvF2LFiqL/EhPiBaWPJOdeA/m75owwtvnpd1vG2jxwxaMd9o1Btr8my1j3M2Gxt5fzp+3VikpgEA9eDgSFx5PU030PkgPRB6FoAOE7Lq2jIHnL8MU1PFrl2nHNI4/261+7u7fkHND15ChE3/n3/mMNCxHpfcVHEHMcfigyFg4NixFzrtwWGgkihtFjWAlnXM489WvRRxNGpbYos8vjFfC2C2lJG34iFfs3oUXaNZGCn+oy/2qJ1/Uzb7oE17oOW8xmfXbO291mfZ3JqrmnNV80VPosZ8mSsXDcTF2XWcuA87YzPym/pa+PsHljD+mPF0Fz5AYrYiSH6Ymjkj3uirevqeNtHzv3UOexzTdaxNVlk3IO+1nXpX08BTC6Ty2BgdwwMiWMNKuRxizjW7y1K+ljvOtb2DtdJQOtfbffG9IknQO0TOedGrYXIJxEUua1iQQFhTatXglefRkHkKF51zPUQEXUgo0779YlIO6YOCq462rZdw3wdUwd2ewcxUKeydcy52bZnwzH1Vv/U247py9beWaucutXXa5Vt57RddZhnZMEce0CuroXUMl7HRn10tHq21vR8dsy4tq37YA+Qp3rNuLbizjHX7eoP6/ABPay1347P+lN1bPmiXC+eXN/tOH61Y+pvfXU87e5FJjFLzIKB68LAUYljBYdkkTGIIeccfL+Rw3NaieL908bmaSTzjEsuq41D+hYzyB3FAwK5VSwspq3NreJTZV2PjTpuv6enXYOvFH5lIaEtkXJOvbRVD/Y554DotE/w9iUQ1V7t409rwyddxmLkM/pm9t7utfrR6xuXdg484FMdr7JrOPEpcl036mNrjbz01lY/nJ/NqXFG3sMPTpyrTxt1zLm2VbaOsw5bzDFuvzfO3hn36PlTdVQ7vb57bOf0oY6vySLT+lrXpX9dRTD5TD6Dgd0wcBLiWJPCE8Teq2dkHoM4Vt+2ikWvQLIWIufr5qqr7bseG+0c570i1lvD0yKeaEJSsMu6an9WDzZHpKVnv+f71ljPH+NsLHoyPdujveNHb92af8q288QFn+p4ldV/xtZk6vhWf5SDdm31o53jfEufHzrYW3uYC3Roo471bFXZOt/GB1vobMdn/UG3OqqdXh85YlDntNvu2fNWnrWuaXNc9aa/W7FJvBKvYOA6MHBWxLH3Wro3Jvh4ClVfuzk+0/YK0VaxsJi2un2FiS/tXD13PTbquH2KFz7VJ369MeVtfXqn/d6a3hjrGedQV9vqc/tUs5XjfC0X7Km1YZyNRc+/3lhrt90787v4rGyrV9t1vMqCOfaF/SqjP3XM/lp8sMWh3KitfvRkt/SBVZ7+jq4ZbczkXdnqi/lljnGvtXZ81p+qo9rp9Xt4I/b40h7IEo/6HWF1tr46nvY6Cl/ymDwGA/tjYEgc+ctoXhNz+EcvnvuKWXJXE+Er5jpGH1mOdpzzx/jjmOpHWywoOIxxSAo8l+C5RiJhcZJUMM+YZIRxzl2vfYq0hYx5CWklFYzzpJGWA108teHYRY+yWyQDGfaPT+jXLm3rO4UXOXxWty3jdQ+MGzNazo+1d3SNfJ7JqblyD7TEm704poz5lARVGWW34oOe9lW++TU+Mz5rC30cntcWPeJFv7XVyrGPtbyP/DG/6EYvuui347P+VB3VT/vE131gq8azxapr1LkWq9bXui79/QtOYpfYBQOXj4EhcZQU9v6oBXIICJSpgNiHOLL+1D/HU31uiwVFhULUOyyKrGedRE9ZihdzyDlWW9ZU2/QhUKxDjqJNca9PhzivOpDBLgW46hrpUXaLZCiDLl+Ja7u1x14kGa6zZU1bnI1zjcHI59m9Y3fL55mcKuMeaM2jY+Sl+kS/lVF2Kz7aMra1FWMzMtpClsPztiV3YIZ8aYvzVu6QGJpf/ccO/XYcm7P+oIN9oYejPiXcik/FWLtHdTqOrPrNLefOp738gpccJofBwOEYGBLHBPnwICeGtxFDCUzyffx8S3Jtt8jxvvGHJKrfNsTx+LncNz9Zl1wEA+eBgRDHX/un9wLGxOBQDPDkDLJR/1DpUJ1ZH1wGA8FAMBAMnBsGQhxDHEOc98CA36vjO58+aYQ48or33C7y+JPCEwwEA8FAMHAsDIQ47kEajhX86LncC7m+1uR7qXxPcOv7dMn15eY6uUvugoFgIBj4TQyEOIY45glZMBAMBAPBQDAQDAQDUxgIcQxQpoCST1u/+WkrsUgsgoFgIBgIBm4VAyGOIY4hjsFAMBAMBAPBQDAQDExhIMTxDIDi79v5EyAzPzXCX+/yW3xbP3B8bp+GLtHnh46hf1jz0HbORT+/jwhu6++TVt/4vigyjO1zXVRdx+7P+nNrOT12nKMvT/KCgfPGwM0SR2/u9YeELQy0pwQu5I8/tvAPLmaIoz/g3P4Y96zf7BF7pySeh/o8u7dLkhOHI59n8jUjM7LzkPOQRT4cgbueHa5F5sX0PtdFT++xxmb9mc3psfw6NO+s90Nrr/UfM8Df+sPwXM/8qkBvH+T6lVdeuf/FAeRqzrHHhwP/sYOZ+13PRsbOm1wkP9ebn5snjvWm5Q2U9rFAz427+rTmB0XMArsmszUuST3lXg/1eWs/lzo3SzJm8jUj85hx0j9w0PMDIrGG/dnroqf3Ica2/JnN6bH8Mq77Xsve9/AbXR78UgD75BxflSNPjLnPljxyX/JDIm8ZmK++sRYd/us8azk/Vnyi53oJTHL7OLm9eeLIjdFC5o2x3uRODcytgnRMX7h5Y+sx93rM/VyqLovvyP+ZfM3IjOw81DxPoCATvoZu7YyuvVNdF61fa+db/szmdE33ruOH5t3Yo6faljh6f2zPkXWvfvUAWfLMMXNv2Ypj9SX9xyEIiXvi3sPATRNHbnp88vUTszfQesPj1Qwy3OAsfN4keRXDOJ+wkaPvzRfdHL2gb41t3UCSKlAAACAASURBVEj1DxmPni5e+XlDV449IGuRcbxtq776Wgo5ir57Rw4bPFHAHrFBhrH6JHTG5xk92PUJBXbImXupPs/0t3I6uy/tsD/2LoYcn23N01oM3WObJ8+xMyODXC/O5K/mC7kt/NR97bJ3dOKzJKTq0Tcx2s5xzlr8780xNsqpMuzX2NFnnTrxzTl8AW9tbJTd8meUU3XM+LyVi9m8a28tX+wRn7GlLNcbeyRGjoHzNgfmFd3IeY167tq1diuOa2syHjITDDwuBm6eOHLz5YYIELnZcSPzpseNnXOKCHJ+4vbmWeWZR845+sjvCvCtGymFDTsc2EG21a9P+qy8RYH5up4bvTK06mv3bkFwf8jpAy3ESZlabGZ8ntGjbmKq/67T55m23Veb09l9acvCuU+uZ2zN5GtGpmeLnIF9DgndCD/um3aXvddro+qgD3EBy2K0ned867qYyan7Yq/su7f3ilXy2cam+rXlj7jcui528fnQa1m/d8mXsnw4dj175jqEVDJOTI2r9w58lZDTZw0t+1VPbbfiWOXSf1yikPgn/hUDN08cKRbcvLhRehOkJUgWAItqO1bluaFycJNEDp3eTGvAR/3ZGym6kW31Ob52o1ZeOffquK2Fsz5hdI3xMD5Vh0RMPbV1fR2jP9Lj0w/k6loLUx0b9bXlHqp9x5SZ3RfEp8Zp5EOdn7Vl7KpPVQ/9kUzPVksQ1DHCj7Zn9i5JWvOd6waSps5eu3VduC/zx/p2TFzir/rZO3J1zDla9K1dxzP+1P1qX/2tf4y3Y7O5UK7a007bzuSLNfpbY2osxAw5w6bjrKPPdcmBXxJ0xqsu/WKcfXueNgQlGDh/DNw8cQSkFC5uXt4EvQH3bmr1Ji2hoTDW9ehkbf20Pnsx9Gz21upHO0dh4IauHm7cPRLgevfa6nE98x6+mneNha6uVW8ds782N9KDPfxhvbpo2RvjdWzUd19VTr/23VfVtWt/tHf1tT46XtuRTM8W62tsZ/FT7Y762K1Poav8Fjmrcr28Od+ba2PRk3F9bSFFrPVYW7c2jq5enPVHW731yojD2Vy067Sxb+t9rc0ZPnPNMc89k/tKe20iA2msH6Qkmr37YS8O+/qddedPOJKj68hRiGN5Re0Nzht376bW3qSRcYyLgpttq2eXiwXSR+EZrak2W1lu2vjATR5/8LEtAq53r60OySdr28M1MwWy6tVmHaM/0tMWJ9ev6XO+17KXNr7q2XdfPTuzY6O9q6f10fHajmR6tlhPTFirrhn8KDtqzR147MmCUbBWiUZPbuu6mMkp69troLXDvHaIlfGibWWVa8c5d12dMzeOzfiM7Ewu1C1+tbFv6/2rzVlvz8r64bS3LzFQMaZvPXnn0l4HyUgery+PIY6//gPgFA1ffXoDtgDUVyztGDc+ih9ruUB4xXPIjRz96tq64LSxJeMcTwfwkycYjrneG77jtuyjfXLgnK2x8JxWvXXM/trcSA/FE//Zh7po3VcdG/W1tZVTZaquNd+RIa4j4lN11f6sLe2v5QudIxltVV/RR2x7T4P00zhX/Dg32jtr1/CMH5CRNq/qri2+r+lxX1s59dVrbw/YkdzU+Io79Fdf6M/4U9eYG8dmfFa2tr1cqLv6XtfU/ihfyHIvBBMVJ4wbw16clSVHLUH3TUXPP+z04lt9Tv/6iEdyetk5DXH8deLoJ2duZBJHiyo3Q27O3jjrjY4+N0rHkPPGu8/FYWHAFro4t9jR4huHcp57M2cNRJbW9RRnjuoPutgr48rTqod512FLfbTqYc/o8JyW+To24/OMHmX0hfiQl2qr+rHWn81pq7fdl/rFDf44tkvrvuqanq1Rvlg/ktEWLTbItzk2747TchBvZaqP9Ed7RydxXCOl6Gde263+ei7ee9fFTE65TrDFIYbcH3aMHbFBFp1cxxzgjLFZf4xzlXevjs34zBqvTX3t5ULfmVO+XsvaHOULOXPWw7Mx9H7oPrGlDfdVMUbMWSO5xA/2Y0zUx/kMFrSV9rLJR/J3ufkLcSz/5CA3Xm5ytUhwI+TGxjjzFB1vgADfmyc3Pc69uSK/z4WBbnV6w6UwVFuMt4f2LbDO4zNFQB3VJ4ujsrRVjj5rjQvztaDoZ9VpMXBMmWrDvj4r4xraVg9xqXuz+KOrrpvpz+a06mr9cY58E59aPJ2baWf2rp5RvpDbktEWhducQowq3muMie0WfkZ7Rxfr6/XiXmi5rpCpY2v9reuCNaOcIoO/4Ff80eKDNomL1zot51VeOdotf4xzle/hZ+TzLrnYyrt+jPKFnE8H2bvralvtrOG+yhBjYljvK8an5sF+xWK1m/7lkozk7vpyd7PEMWC+fDBbgJLLuVyeMl4QK4iFHw7aHEFMIAshCnO5a+OX88QtGAgGHgsDIY7lieNjJSF2d78B8AQD4sETs8RvLn6nJI4+YVt79cgTPfxJ7uZylzglTsFAMHAuGAhxDHG8iOLNEyrICK+EJUAQR16LncvFdO5+GLdT+Amxr68nW5s8aVwjla1szlMwg4FgIBg4HwyEOIY4XgTx8gkWZJGnVXxvKq85d7uRnJI45ia/W24Sr8QrGAgGLgUDIY4hjhdBHC/lgoqfufkHA8FAMBAMXDMGQhxDHEMcg4FgIBgIBoKBYCAYmMJAiGOAMgWUa/70lL2d/9MBvqJQj4f4w5r6dQhtMRZ8nD8+kqPkKBg4HQZ2Io7Pf+pueeH1u+Xu5cMcvPvgk+W5jz9ZXvjxu/uD/rknnb/e5edFru0L/fwBQ/2tOvrnnotj+XeJOZ3x+ZQ5nfHnGPmCyEEWIXIca78zeIgtvjOrfn9DMcTxsHv9IfnI2sQ+GDhPDOxEHCGNkD2I374JhXTe63n9bnn2u58sz37nk+WZj+6vb18/fKLgDzdTbB3rFQtII/Nbfym6ry+PtQ4SzL44iENbkC2kh5BlC37dI3oZf4g/btnF53PIKWRol6dnI59HOa15WOufYwzBS++6ZA/4C9Hzx7vX4smPW1fC2cOmMUHnlk3l0p5nYUtekpdg4OEwsBNxhPQdQhpJJGQR8vnMh09PFiuQKAocPDFh3H8xYa1YUJCviTSyZ8gi+6VI1tjYp1BvzSu31bK+LeQW5TW7W/pGc7v4fA453ZU4jnwe5XQUP+bPMYZr16X+Qhp9StjizT2jww+KjPWwqawYXSOryqV9uOKU2Ca2wcB5YmAn4niMJD7/6t3y/Gt3XaJyDP2zOigakEZa1vCK1icWt1IsKLDseS1muxCINR294mxRfmziuObzKcd3JY4j30Y5Ha1n/hh5n7Gziww4mrkue3jDjpjLE8fzLES7YCGyyWEw8LgYGBJHngz6XUTbNmn3ZPBTd/evnH2dzVjv6eS97KvrxPGZjzy5J5b3tl6/W5772JPlyYtPB4lC4CvW1p+ZcwsROtBVn1hYoCw2yHr0dLf/NiuEtP4wtWuxwRMjijtjnNenmKxhjDn84glK++/8UvhcX/VWv2b0IL9GWiQO6m/bamvUZy12qpxxpXV8xuetvc/6rO26J32wxV9yiD1fDTNWc0VefMKFLl/101fPTLuWg7p2xmflR/qIsx+Y8LVi7Fgx1F9iQvzAtLHknGtAf7f8UYYWX70u63jbR44YtOO+Uai212RZ6x5mbLa2cv70/ToxSUyCgevBwJA48nqa7yFyQPogdC0AHKflVTRkDzn+mKYni1w7zjmk8X7da3f39vwDmp48hYgb/75/zGEhYr0EgCLmOP5QZCgcHBQj5lq/LTAURAqlxbIWyLqeeezRoo8ijk5tU2SRxy/maxHUljL6Riz0a0aPsmskAzvVZ/zVFq3rZ9p2D6xxH7Scz/jsmrW9z/o8k1NzTWu+aq7wWcyQJ2Plupm4KLOWA+dpZ3xWfktfG2f3wBrWHyuG5soPUMRODNEXQyN/3BNtXVfH2z5y7qfOYZ9rso6tySLjHvS1rkv/egpgcplcBgO7Y2BIHGtQIY9bxLF+b1HSx3rXsbZ3uE4CWv9quzemTzwBap/IOTdqLUQ+iaDIbRULCghrWr0SvPo0CiJH8apjroeIqAMZddqvT0TaMXVQcNXRtu0a5uuYOrDbO4iBOpWtY87Ntj0bjqm3+qfedkxftvbOWuXUrb5eq2w7p+2qwzwjC+bYA3J1LaSW8To26qOj1bO1puezY8a1bd0He4A81WvGtRV3jrluV39Yhw/oYa39dnzWn6pjyxflevHk+m7H8asdU3/rq+Npdy8yiVliFgxcFwaOShwrOCSLjEEMOefg+40cntNKFO+fNjZPI5lnXHJZbRzSt5hB7igeEMitYmExbW1uFZ8q63ps1HH7PT3tGnyl8CsLCW2JlHPqpa16sM85B0SnfYK3L4Go9moff1obPukyFiOf0Tez93av1Y9e37i0c+ABn+p4lV3DiU+R67pRH1tr5KW3tvrh/GxOjTPyHn5w4lx92qhjzrWtsnWcddhijnH7vXH2zrhHz5+qo9rp9d1jO6cPdXxNFpnW17ou/esqgsln8hkM7IaBkxDHmhSeIPZePSPzGMSx+rZVLHoFkrUQOV83V11t3/XYaOc47xWx3hqeFvFEE5KCXdZV+7N6sDkiLT37Pd+3xnr+GGdj0ZPp2R7tHT9669b8U7adJy74VMerrP4ztiZTx7f6oxy0a6sf7RznW/r80MHe2sNcoEMbdaxnq8rW+TY+2EJnOz7rD7rVUe30+sgRgzqn3XbPnrfyrHVNm+OqN/3dik3ilXgFA9eBgbMijr3X0r0xwcdTqPrazfGZtleItoqFxbTV7StMfGnn6rnrsVHH7VO88Kk+8euNKW/r0zvt99b0xljPOIe62laf26earRzna7lgT60N42wsev71xlq77d6Z38VnZVu92q7jVRbMsS/sVxn9qWP21+KDLQ7lRm31oye7pQ+s8vR3dM1oYybvylZfzC9zjHutteOz/lQd1U6v38MbsceX9kCWeNTvCKuz9dXxtNdR+JLH5DEY2B8DQ+LIX0bzmpjDP3rx3FfMkruaCF8x1zH6yHK045w/xh/HVD/aYkHBYYxDUuC5BM81EgmLk6SCecYkI4xz7nrtU6QtZMxLSCupYJwnjbQc6OKpDccuepTdIhnIsH98Qr92aVvfKbzI4bO6bRmve2DcmNFyfqy9o2vk80xOzZV7oCXe7MUxZcynJKjKKLsVH/S0r/LNr/GZ8Vlb6OPwvLboES/6ra1Wjn2s5X3kj/lFN3rRRb8dn/Wn6qh+2ie+7gNbNZ4tVl2jzrVYtb7WdenvX3ASu8QuGLh8DAyJo6Sw90ctkENAoEwFxD7EkfWn/jme6nNbLCgqFKLeYVFkPeskespSvJhDzrHasqbapg+BYh1yFG2Ke306xHnVgQx2KcBV10iPslskQxl0+Upc26099iLJcJ0ta9ribJxrDEY+z+4du1s+z+RUGfdAax4dIy/VJ/qtjLJb8dGWsa2tGJuR0RayHJ63LbkDM+RLW5y3cofE0PzqP3bot+PYnPUHHewLPRz1KeFWfCrG2j2q03Fk1W9uOXc+7eUXvOQwOQwGDsfAkDgmyIcHOTG8jRhKYJLv4+dbkmu7RY73jT8kUf22IY7Hz+W++cm65CIYOA8MhDj+2j+9FzAmBodigCdnkI36h0qH6sz64DIYCAaCgWDg3DAQ4hjiGOK8Bwb8Xh3f+fRJI8SRV7zndpHHnxSeYCAYCAaCgWNhIMRxD9JwrOBHz+VeyPW1Jt9L5XuCW9+nS64vN9fJXXIXDAQDwcBvYiDEMcQxT8iCgWAgGAgGgoFgIBiYwkCIY4AyBZR82vrNT1uJRWIRDAQDwUAwcKsYCHEMcQxxDAaCgWAgGAgGgoFgYAoDIY5nABR/386fAJn5qRH+epff4tv6geNz+zR0iT4/dAz9w5qHtnMK/fz2IZisvz1a7fJdUGQY2wfzVdex+7P+XFO+jh3D6MsTuGDgNjBws8TRAlB/SNjiQXvKCwDyxx9b+AcXM8TRH3Buf4x71m/2iL1TEs9DfZ7d2yXJicORzzP5mpEZ2dl3HrLIBx8w1dPBdca8eN0H8z29xxqb9Wc2X8fy6xg5RYcfSmvb3mfqj75zrfKLAb19kOtXXnnl/tcEkKs5xxYfDvyHDFobPX0Zuw2ykTxfT55vnjjWG5s3WNrHAjk39urTmh8UOovwmszWuCT1lHs91Oet/VzqHLkm5yP/Z/I1IzOys++8tslxTwdEYg3Xs5jv6X2IsS1/ZvN1LL+M6yHXqfc1fEefR+9DM3li3n225JF7jh8AeYPAfPWNtT5Z3orjseITPddDRpLLy8nlzRNHbm4WO2+w9UZ4ajCf6mbLDR5bj7nXU8f2HO1ZoEe+zeRrRmZkZ595nkBBJnwN3eoYXVenwnzr19r5lj+z+VrTvev4MXJq/Ld+Y5Sfk2Lf3gvx07361QPmyDPHzH1jK467xiHyl0Mqkqvrz9VNE0dujHw69lO1N9h6U+Rmiww3QYujN1Je1zDOp3Dk6HOj96aL/l0voq2brf4h49HTz5MEb/rKsQdkLUSOt23VV19dIQcxcO/IYYOnDtgjNsgwVp+Ezvg8owe72NdfcuZeqs8z/a2czu5LO+yPvYshx2db87QWQ/fovtsWOzMyyPXiTP5qvvR7l33hO35V0qEe7Yq/Om6ftfjmeduO8oV8i1X2xZi68M3Y4QtY6u0b+S1/RvnS3ozPx7pOsbmVL69BWv1rWzDc5sC8us7rz/NWR3u+FcdWNufXTzaS4+vJ8c0TR4ouN01A3d5guflz86PQIOencm+wVZ555Jyjj/yuF8vWzZbihx0OC1irX5/0WXmKgHus6ykGytCqr927RcP9IacPtBAnZSja6pnxeUaPuomp/rtOWzNtu682p7P70pbFdZ9cz9gin+4XbPTyNSPTs0XOwD5HS/p22VfFvXGxhZzht/hzvLZbmJ/Jl5hnH+ypt6+KQ3K1tm/82vJHzG1hfhefD71OjeNWvowP1yV742iJNWNgiw9ofCBmjeu8L+Cr6+izhpb96kdtmSdOdSz96yEPyeXt5vLmiSMFhRscN15vlLRcFBaJWlTrWJXnpsvBjZS16PSGu8sFNnuzRTeyrW7H127myivnXh23tbjWJ4yuMR7GouqQiKmntq6vY/RHevChFxeLV6tv61xb7qHad0yZ2X1Bjmqctuy3c7O2jF31qdU1kunZknBAFlp9M/uSJK35xTUBSWt11/Nebp3XZ3PDeDsm5uoTRPaFXB1TJy36sEvM6jj9GX/qfrWvntY/xtsxc3XodapN2rV84Ss5IBfYNSfs07gaC/GAPOscRz99rjkO9EjQq57qD+Psu46lf7tkI7m/ntzfPHEEzNxIucF5o7Qo9G583vCRkdBw86/r0cnaXjEeXTw9m701+tHOUTy46auHm3uvOLnevbZ6XM+8h6/mXWMxrGvVW8fsr82N9GAPf1ivLlr2xngdG/XdV5XTr333VXXt2h/tXX2tj47XdiTTs8X6Xmyr3q0+OusT5iq7Rc6qXC8nzvfm2n32ZFxfW0gRaz3W1q2No6sXQ/3RVm+9MmLsWNepNndtJYj4xVp85nrinsb9kHtGe90hA2msH5LU07vX9eKwq5+Rvx6ykVxeTy5DHMsram+C3tx7N762ACDjGBcGRbTVs8sFA+mjOI3WVJutLDd2fKAQ4A8+tsXd9e611SH5ZG17uGamiFa92qxj9Ed62gLm+jV9zvda9tLGVz377qtnZ3ZstHf1tD46XtuRTM8W64kJa6uumb55AWs9efAHjirR6MltYX4mX6xv8d3aYV47xMFY0LayyrXjnLuuzhl3x2Z8RvYY16k2d23NnXnv7dn7mB88e/tq9VQ/evJ1Pv3rIRLJ5W3lMsTx138AnMLiq8+WQPg6h4vDwuEYN0cKJGuZ57WVhUQ9u1xU6FfX1jptbMk4xxME/Kyv7VxvUVDWln20TxecszUWntOqt47ZX5sb6aHA4j/7UBet+6pjo762zB/y7ZjnVdea78isvSKs69f6s7a0v5Yv9I9ktFWJHPqIbe+J0WhfxH8Nq9iAjLQ568UBv9b06PNWvnxVXPFd7UhuauzEFPqrLP0Zf+oa4+7YjM/K1lY8132ou/pe19T+Wr7IQ0usJYXm3Rj24ixeyFGrx7cQPf/AVS++1ef0b4twJN/Xke8Qx18njt5IudlJ+Cyq3DC5gXtzrTdD+txMHUOOc/Tsc5FYPLCFLs4tJLT4xqGc597wWQORpXU9hYOj+oMufGRceVr1MO86bKmPVj3sud0n83VsxucZPcroC/EhL9WWfm21szlt9bb70oa4wR/HdmndV13TszXKF+tHMtqixQb5NsfmXT9G+0KeGEk8XGfrHlq9ztdWLPcwP5MvrgF84RAf2KePHePCvpFFJ9coBxhibNYfY1jl3atjMz4bf1p9NRfqodX3tetU2a18kWdiY96NNzolhcbQe537ZK023Jd61Msa9eCHe8Km+hibwYK20l4HwUgerzOPIY7lnxzkRsrNrhYSbpbc/BhnnpuuN0kuCm+w3Bg59waM/D4XDbrV6Y2X4lFtMd4e2rcoOI/PFGR1VJ8soMrSVjn6rDUuzFeCpJ9VJ34g55gy1YZ9fVbGNbStHuJS90a/lanrt/qzOa061myRb+JTC2xdN+rP7F0do3whtyWjLYq7OYU8Vbxra7Qv4o+Oei24lpZrBpk6ttbfwjxrRvlCBn/BptiixQdtsmevY1rOq7xytFv+GMMq38PGyOeKZXwllvhTrz9tbOVUma18sR98dP/Y69mqdtYwXWV6eowPc+3Rw5n+p71OgpG8Xmdeb5Y4BtCXD2iLVHI5l8tjxQsiArGAjPRiDymDNIQozOWlF8OMJXbBQDBwrhgIcSxPHM81SfHr6RsIT2YgJzwxS3yejk8vJscijj5hW3v1yJMtbPV8yNhcrhKnxCkYCAbOFQMhjiGOF1HgeYoFYeGVsAQI4sirs3O9uM7NL+N2qF+Q9t4rVfXypHGNVCqTNkUxGAgGgoHLxECIY4jjRRAvn3JBFnmixXe08ip0t5vOsYhjbva7xT3xSryCgWDgmjAQ4hjieBHE8ZouuuwlRSQYCAaCgWDgUjEQ4hjiGOIYDAQDwUAwEAwEA8HAFAZCHAOUKaBc6iej+H0dn+r5ikI9dv3jm/pVB/UwFnxcBz6Sx+QxGDgdBnYijs9/6m554fW75e7lwxy8++CT5bmPP1le+PG7+4P+uSedv97lJ0iu7Uv//JFD/T07+ueei2P5d4k5nfH5lDmd8ecY+YLsQRYhexz8sdQuevk+rGv9DcUQx8Pu47vEP7KJdTBwPRjYiThCGiF7EL99QQDpvNfz+t3y7Hc/WZ79zifLMx/dX9++fvjUwR9uptg61isokEbmt/6adF9fHmsdJJh9cRCHtiBbbA8hyxb8ukf0Mv4Qf9yyi8/nkFPI0C5Pz0Y+j3Ja87DWP8cYgpfedeke6g9Ti2fn2lb8belr1+T8eopecplcBgOHYWAn4gjpO4Q0kizIIuTzmQ+fnixWsFCIOHhiwrj/5upagaIgXxNpZM+QRfa7RuAorFvzNZ5rfda3xMjCvWZ3TdfM+C4+n0NOdyWOI59HOb3UGK5dl+xHPPHX9uSfmCLvh8J2z8qHOB5WPNq45jzxDAZuAwM7EcdjgOL5V++W51+72/uJ5TF8QAeFBdJIyzmvaP0nuW6loFBg2fNaTHchYWs6iO+5Esc1n085vitxHPk2yuloPfPHyPuMnV1kwNHadelXLSDV6iQOrOFfuXHMNsTxNoqb+U6bfAcDx8XAkDjyZNDvItq2Sbgng5+6u3/l7OtsxnpPJ+9lX10njs985Mk9sby39frd8tzHnixPXnx609z8R6+kWj/ruYUIHeiCQLXffbLAIOtRddivr8mQg5DWH6Z2LTYobhY1zutTTNYwhjx+4U9b+Phul+urXn2hndGDHHo46lr6Egf1t20rv3XO2taGcaV17YzPW3uf9VnbdU/6YIu/5BB75ME91FyRF/HCvK/66atnpl3LQV0747PyI33E2Q9M+FoxdqwY6i8xIX5g2lhyXgnelj/uiRZf14gjOluMYY81FWPq0781fcqlffq+m5gkJsFAMDAkjrye5nuIHJA+CF0LHMdpeRUN2UOOP6bpySLXjnMOabxf99rdvT3/gKYnb2HY9485LESslwBQxBzHHwocxYWDwsRc67dFiOJFobRY1gJZ1zOPPVr0UcTRqW2KLPI+RakFUVvK6Bux0K8ZPcqukQzsVJ/xV1u0rp9p2WPdA2vcBy3nMz67Zm3vsz7P5NRc05qvmit8FjPkyVi5biYuyrCGw/NeO+Oz67b0tXF2D9o/VgzNlR+giJ0Yoi+GRv64J9q6ro47h37IPF85wb4+aKuu2ZqrcumnQAYDwUAw8DQGhsSxBg3yuEUc6/cWJX2sdx1re4frJKD1r7Z7Y/rEE6D2iZxzo9ZC5HcbKXJbBYUCxJpWrwSvPo2CyFGM65jrISLqQEad9uvTmHZMHRRcdbRtu4b5OqYO7PYOYqBOZeuYc7Ntz4Zj6q3+qbcd05etvbNWOXWrr9cq285pu+owz8iCOfaAXF0LqWW8jo366Gj1bK3p+eyYcW1b98Ee+EBTrxnXVtw55rpd/WEdPqCHtfbb8Vl/qo6eL+r3wyR7bG3VdVtzVS79pwtGYpKYBAPBwFGJYwWUZJExiCHnHHy/kcNzWoni/dPG5mkk84xLLquNQ/oWG8gdhdsnFY63ui2m7TjyM4Xf9RStVgfnPT3tGnylKCoLCW2JlHPVRtWDfc45IDrtE7x9CUS1V/v409rwSZexGPmMvpm9I1f3Wv3o9ZVt58gnPtXxKrtGPHyKXNeN+tiawY96qh+OzebUOCPv4QcnztWnjTrmXNsqW8dZhy3mGLffG2fvjHv0/Kk6qh376Cf2EGKwxTXRtcDHeQAAIABJREFU2lKWdmuuyqWfAhkMBAPBwNMYOAlxrIHnCWLv1TMyj0Ecq29bBaVXIFkLkfN1c9XV9l2PjXaOc4t6neutoTjyZIVCiV3WVfuzerAzIi09+9W/mX7PH+NsLHoyPdujveNPb92an8q288QFn+p4ldV/xtZk6vhWf5SDdm31o53jfEufHzrYW3uYC3Roo471bFXZOt/GB1vobMdn/UG3Oqod++hh357T+vSx/WDFXOtHXZf+00UiMUlMgoFgoGLgrIhj77V0b8wN8BSqvnZzfKbtFaKtgmIxbXX7ChNf2rl67nps1HH7kpX6xK83prytT++031vTG2M94xzqalt97hXfVnYtF8S5tWGcjUXPv95Ya7PdO/O7+Kxsq1fbdbzKgjn2hf0qoz91zP5afLDFodyorX70ZLf0gVWe/o6uGW3M5F3Z6ov5ZY5xr7V2fNafqqPase812Lt2entt/VBP2hTHYCAYCAbGGBgSR/4ymtfEHP7Ri+e+Ypbc1YD7irmO0UeWox3n/DH+OKb60RYUij1jHJICzy1SrpFIUCw5JBXMcy4ZYZxz12ufIo0OX+taDCupYB1PGmk50MXTFo5d9Ci7RTKQYf/4hH7t0ra++3QHn9Vty/q6B8aNGS3nx9o7ukY+z+TUXLkHWuLNXhxTxnxKgqqMslvxQY85N6+2xmfGZ22hj8Pz2qJHvOi3tlq5rbyP/DG/6EYvuui347P+VB3VT/vqNY7mBqwqU1vl9a/OpT8uGolRYhQM3DYGhsRRUtj7oxbIIQBSpoJpH+LI+lP/HE/1uS0oFiAKX3vUosM6iZ5yFDF0I+dYbVlTbdOHQLEOOQo8xb0+MeG86kAGuxTgqmukR9ktkqEMunwlru3WHnuRXLrOljUtkTHONQYjn2f3jt0tn2dyqox7oDWPjpGX6hP9VkbZrfhoy9jWVozNyGgLWQ7P25bcgRnypS3OW7lDYmh+9R879NtxbM76gw72hR4OyHj1ufrbwyK2XWveOK860r/tYpj8J//BwBwGhsQxgZwLZOKUOEnwgoXjY0GSa7tFjnvxhyS61jbE8fh56sU+Y4lzMHBdGAhx/LV/ei+gTgwOxQBPziAk9Q+VDtWZ9cFlMBAMBAPBwLlhIMQxxDHEeQ8M8KqUJ1Z8j84njRBHXpme20Uef1J4goFgIBgIBo6FgRDHPUjDsYIfPZd7IddXn3wvle8J8j265PRyc5rcJXfBQDAQDIwxEOIY4hiyEwwEA8FAMBAMBAPBwBQGQhwDlCmg5FPY+FNYYpQYBQPBQDAQDFw7BkIcQxxDHIOBYCAYCAaCgWAgGJjCQIjjAwPF367zJ0BmfkaEv8zlt+jaH9p+rE8x5+bPY8XhVHb9/uSp7MXO3BOSfa7lW4utfyh2zvvO9TWH93POYXx73BzePHH0x4Ahag8BRsgfNypvVjPE0R9nbn9o+5j++YPIM+T0FP4ca2+77OtQmw9lS6wc6l+73qLuhxjy2vsB+XbdJZyDY65lseq/IlN9PzRf+1zL1X7bn/G5XdM7P3RfPZ37jomxfdfXdQ+1r4e6vqrv6T8usUn8Hzb+N08cKTDe7B6SqAFkCvYMcaSgPLQv3jy5OY8uslP4M/Jhdn6Xfc3qXJN7KFvqXbO77zjYk1Bho35oIsf76n3sdfguYYQIszdarjf6+mdcZzDvmrV29lrGVi+2sz6v2a/jx9xX1btP33vpPmvbNQ+1L/W29nL+sGQj8b2e+N40cfRHm/ntPQrP2r9teyzAzxabY9nb0uPN8xhFdMvOqedOua+HsqXeY8eOot5+cCH/4BISeWx7p9InAW7/GUK+YlH3a1yPgfnZaxk57LaxmPW5Xdc7P+a+evp3GQtxvB5ysEveI3tbeb9p4ugNF9DzhKL9Vz+4CTJGQfKJBuf1aeCMjBfVVrGxgCPj4bra1n+TFzn8qT86zZMM1/N0iQJV/XXPyrSttnbxBzvoIUbYq/++di8+jFWftDlqyQNrq8/YZt3svkbxQZf60Y28NjnH71lb6Grz1can/Tev+fCi/lE8dp1nHxztOvbr+Gjvrh3tC7mtfKlnRkbZtbb635Mxnu6tbV3j+FrelaMd2VQWOex7bju7XvleO7sv1pIv9oXd3nXa098bG+XLawU575mM1eudc/GmDddxvsu+XL/Wzl5fW/F55ZVX7uPGHpCrOa17od/WC8bq3tf8zPhtEa9Lz/dNE0cuci5skujNAaJgUpnzBk9B5+BmyKHcjIz61OV5bdHHDZNDnXWevmQO+2v+VD2Q4dZfdFQbEBnt0mqz6lnzx5soBYm1vh5EXj2upcVn7BEHYq/MTOvetaXPFCjW77OvXnzQhW791mda/Z611cbHvdf4OIYv2tX2TFx2kUFvte1a9oX9mb0jM7OvUb7QMyOjj2utOojdloyxZa9rmK8yvbxX/ejpxbLK0Eeu9W3G51ZP7xw91ee1fbX56l2nPf3tmH6vXYPIi11aY0gM6vXOXBs716Fjdl+tf73zmetrFB/3rV/sX//pe+24B9q1vfd8zFhI46Vh4GaJI59E602dT4WcS0RIpDcCbhgmlnnkIJqzMq5lnTccx3otxQDZds4bfv0Eiz/orGN1HQQQXW3x0kbdW11X+8rWMfrGBxvOtWOeVzvuwzUzrT5wk9+SV67a25IfxYcC4Hr34vnIFvuEuNcnsK7BrhhErzppKUa9/FeZffrYqbbwwcJaca+Pa3sf7Qvf1LGVrxmZ0T7Jcw/fvXXa28KGMmt7Vy82aywd1x/mewf6laHvukNafV7bF37iy9Z1OmNfO1s51Vb1pb3ekWlj57rqh/aqrjo/6s9eX9pei4/5ouV64eAaxT5xNY/qqf62ex/5nPmQyEvAwM0SRwlgvcjrp0eS542gTWTvZrEl4xzr0On5WusNs52fXc/e0OHRW6eNuv/WnufKem47o7cXwzV96u21EGNImDYp7L0Cpu6tfR0rPiNb+oovHj7Z9hwZ9NQ9szfG69gx+uYC3fWgEFb9h+4LXTP5mpGpfvX6xLEXw57saF+smZFBDpu9axnygQ4P5TzfynvP55mxkc/6UHWN1lRZ+zP5EmOuodWWY8i0sdtaR8xcu0u7ho32+hrFRwLK/QY/1YsvrG0fIlQf273XufRDEi8VAzdLHH3SwoVfD8iJyezdzJhDnhsC/RkZ9aEbec/X2rWbDevrK5/eeua1gy39a+1qY+amrGxrjziM9Gq/rl3TV2V6fW7gkD5u/OwT+2081L22r2PGZ2SLPFRs1T7+WYDQU/er3jp2jD654MMR+jkoeJCBVrf212I42pf6ZvI1I6O+tbaHg57saF+smZFBzmusZ6eO4Rs66xj9WZ/bdb3zkc/YGl2nPb29sVG+Zq53ZFp/ttat4bDnXx2bvb5m4mMeabHBfaR9+LC1h+pX+iGMl46BmyWO3Pi5+LnpekgmfZLljYCbpYlmjptH+ylzS8a16PMVh2O91kLQzvnao1fskfVGqf+M4dfWjbHKtvY8X/PH+Ky94mG9MuqiXdNXZWb65qvGQ929fe0Tn62itWUL/8kX+a7YqPsyN+0TP/dVZe2z1zV9yqy15IJjbd5x97W299G+1NO27qvmax+Zdo3XBYW8navn7quHDeWUWdu7csRx5lqWcLjOdtZn5bdafV7bl9fg1nW6pX9rrs2ptuoa/XOsjR149sOIMrSuW9tXle31Z68vfd6KD3nkA6s5J3/6J1bUU31Rpo7ZP+RaVkfakNDHwMBNEkcudG4EbaHxRsMNgmR4I6DlBsA4NzgObzIzMibWm6w3Hc4torT4xaGc59rSb3xHBp846GMDHczhE7LccCHHHNzwGNMXZdkL+3J/2prxB/3YQzfrLYbY147x8ZwWWdbVsVFf/2g52LO5qGu39uXcVnyIEfr12zgbl1lbyGFPH9Wj/+pp7RBD4tmLj084kHH9Li22ONbWzO59Zl/sU1yt5WtGZs3XOk5uiDMxqx8Gvc6UNf89zM/uXV3kE3va4Bz9ztsS7/Y+w9ysz+rZarf2xbqZ63RLv3Mz+RLPrqFlXcWz58jS9x6FTCWJo31VG2t9/fH6611fM/FBD37SuifO6760VX1xr3WM/qHXcqsv5yGQp8TATRJHChoXfI8McDPwU6U3Ai7yWpgqAZuRMaEQU+Wxjx2LTR1nrh7cfNSBbW5+dV5/kcFXiQct51VePbTcML35qW9Xf9ChPWLEDZp9asd9eU67djOtMm3fQq2f2GJf+lvlt/Y1io++ace25nzWFnL4h5/iB32cq4NY1b1Z4JBTxhYf0AN+HdulJRcca2t22ftoX3VP7KWXrxmZNV/bca5l9IlFbIJt3wwov4aNXfaOrq1rWVujdtbnkR7m1/bl2tF1qtxWO5Ovmeu9Yh5c7HuP2vLVuWoLTLAHc60M7Sg+7ou1yHMtoo9DPcp4Ttuz5fpDruVqI/2QxlNj4CaJ42yQezeCdu2MTLsm57nQg4FgIBgIBoKBYOASMRDi+DnrwJ0hhTMylwiM+LyOi8QmsQkGgoFgIBi4VQyEOIY4/sarllu9CLLvFIBgIBgIBoKBYGAOAyGOIY4hjhsYyI1k7kaSOCVOwUAwEAzcBgZCHEMaQhyDgWAgGAgGgoFgIBiYwkCIY4AyBZR8kryNT5LJc/IcDAQDwUAwsIWBEMcQxxDHYODsMeBPn9jyR2lbN7Z2zp9FcT2tP63SyuY8RTMYCAaCgXUM7EQcn//U3fLC63fL3cvrCmeCfffBJ8tzH3+yvPDjd/cH/Zl1jynDb8Lxu1u93358TL8Ote3v8VlQ628MHqr73NdfYk5nfD5lTmf8OQYOwCdkEbLHwW//7aKX391zrb9HGOJ42H18l/hHNrEOBq4HAzsRR0gjZA/ity8IIJ33el6/W5797ifLs9/5ZHnmo/vr29cPiZI/pkyxdaxXUCCNzCO3r81zWwcJZl/+EG1bkC22h5BlC37duz+eS1vHj9HfxedzyClkaJenZyOfRzmdifE5xhAc9a5L91N/AFs8O9e24m9LX7sm59dT9JLL5DIYOAwDOxFHSN8hpJFkQRYhn898+PRksYJFksgTE8b5FyYc6xUUCvI1kUb27L+gs0bgiAMxWZuv8Vzrs74lRhbuQ/Su2dvF53PI6a7EceTzKKdrcavj5xhDcNS7LvFbPPGvxiBDTJH3Q2HdW5Vf09fK5/ywIpP4JX7BwHVhYCfieIzkP//q3fL8a3dHf9K0q28UFkgjLWt5Res/V3YrBYUCy57XYkcciM8hBI/150oc1/Z9yvFdiePIt1FOR+uZP0beZ+zsIgOO1q5Lrl3mIdXqJA6M8U/OOWYr0VzTp1za6yp2yWfyGQwcBwND4siTQb+LaNsG/54Mfuru/pWzr7MZ6z2dvJd9dZ04PvORJ/fE8t7W63fLcx97sjx58enNcvMfvZJq/aznFiJ0oAsC1X73yQKDrEfVYb++JkMOQsqY867FBsXNosZ5fYo5+vdS0cd3u1xf9WqLdkYPcujhqGvpSxzU37at/NY5a1sbxpXWtTM+b+191mdt1z3pgy3+kkPs+WqYsZqr9t/A5emWPqhnpkVvG5923YzPrhnpI85+YCIGYF5ypf81NrWvjZE/zhMT4gfOjSXnleBt+aM9WvzAvzpmH51tDLHHGnxRzlb/1vQpl/bp+25ikpgEA8HAkDjyeprvIXJA+iB0LXAcp+VVNGQPOf6YpieLXDvOOaTxft1rd/f2/AOanryFYd8/5rAQsV7CSBFzHH8ocBQXDgoTc63fFiGKF4XSYlkLZF3PPPZo0UcRR6e2KbLI+xSlFkRtKaNvxEK/ZvQou0YysFN9xl9t0bp+pmWPdQ+scR+0nM/47Jq1vc/6PJNTc01rvmqu8FnMkCdj5bqZuCjDGg7Pe+2Mz67b0tfG2T1o/1gxNFd+gCJ2Yoi+GBr5455o67o67hz6IcB85QT7+qCtumZrrsqlnwIZDAQDwcDTGBgSxxo0yOMWcazfW5T0sd51rO0drpOA1r/a7o3pE0+AfFri2GxrIfK7jRS5rYJCAWJNq1+CV59GQeQoxnXM9RARdSCjTvv1aUw7pg4Krjratl3DfB1TB3Z7BzFQp7J1zLnZtmfDMfVW/9TbjunL1t5Zq5y61ddrlW3ntF11mGdkwRx7QK6uhdQyXsdGfXS0erbW9Hx2zLi2rftgD3ygqdeMayvuHHPdrv6wDh/Qw1r77fisP1VHzxf1+2GSPba26rqtuSqX/tMFIzFJTIKBYOCoxLECSrLIGMSQcw6+38jhOa1E8f5pY/M0knnGJZfVxiF9iw3kjsLtkwrHW90W03Yc+ZnC73qKVquD856edg2+UhSVhYS2RMq5aqPqwT7nHBCd9gnevgSi2qt9/Glt+KTLWIx8Rt/M3pGre61+9PrKtnPkE5/qeJVdIx4+Ra7rRn1szeBHPdUPx2ZzapyR9/CDE+fq00Ydc65tla3jrMMWc4zb742zd8Y9ev5UHdWOffQTewgx2OKaaG0pS7s1V+XST4EMBoKBYOBpDJyEONbA8wSx9+oZmccgjtW3rYLSK5Cshcj5urnqavuux0Y7x7lFvc711lAcebJCocQu66r9WT3YGZGWnv3q30y/549xNhY9mZ7t0d7xp7duzU9l23nigk91vMrqP2NrMnV8qz/KQbu2+tHOcb6lzw8d7K09zAU6tFHHeraqbJ1v44MtdLbjs/6gWx3Vjn30sG/PaX362H6wYq71o65L/+kikZgkJsFAMFAxcFbEsfdaujfmBngKVV+7OT7T9grRVkGxmLa6fYWJL+1cPXc9Nuq4fclKfeLXG1Pe1qd32u+t6Y2xnnEOdbWtPveKbyu7lgvi3Nowzsai519vrLXZ7p35XXxWttWr7TpeZcEc+8J+ldGfOmZ/LT7Y4lBu1FY/erJb+sAqT39H14w2ZvKubPXF/DLHuNdaOz7rT9VR7dj3GuxdO729tn6oJ22KYzAQDAQDYwwMiSN/Gc1rYg7/6MVzXzFL7mrAfcVcx+gjy9GOc/4YfxxT/WgLCsWeMQ5JgecWKddIJCiWHJIK5jmXjDDOueu1T5FGh691LYaVVLCOJ420HOjiaQvHLnqU3SIZyLB/fEK/dmlb3326g8/qtmV93QPjxoyW82PtHV0jn2dyaq7cAy3xZi+OKWM+JUFVRtmt+KDHnJtXW+Mz47O20MfheW3RI170W1ut3FbeR/6YX3SjF1302/FZf6qO6qd99RpHcwNWlamt8vpX59IfF43EKDEKBm4bA0PiKCns/VEL5BAAKVPBtA9xZP2pf46n+twWFAsQha89atFhnURPOYoYupFzrLasqbbpQ6BYhxwFnuJen5hwXnUgg10KcNU10qPsFslQBl2+Etd2a4+9SC5dZ8ualsgY5xqDkc+ze8fuls8zOVXGPdCaR8fIS/WJfiuj7FZ8tGVsayvGZmS0hSyH521L7sAM+dIW563cITE0v/qPHfrtODZn/UEH+0IPB2S8+lz97WER2641b5xXHenfdjFM/pP/YGAOA0PimEDOBTJxSpwkeMHC8bEgybXdIse9+EMSXWsb4nj8PPVin7HEORi4LgyEOP7aP70XUCcGh2KAJ2cQkvqHSofqzPrgMhgIBoKBYODcMBDiGOIY4rwHBnhVyhMrvkfnk0aII69Mz+0ijz8pPMFAMBAMBAPHwkCI4x6k4VjBj57LvZDrq0++l8r3BPkeXXJ6uTlN7pK7YCAYCAbGGAhxDHEM2QkGgoFgIBgIBoKBYGAKAyGOAcoUUPIpbPwpLDFKjIKBYCAYCAauHQMhjiGOIY7BQDAQDAQDwUAwEAxMYSDE8QyBwl/m8lt07Q9tX/unGPZ3y3u/hfy6R3/T0Z/G2fXnddSTNk93goFgIBg4LQZuljhSsNpiZTF7iD9yQCd/UDFDBv1x5vaHtm/h4rjFve+CjUMwUP/6258OApP1R+YP0b/LWq4DbPtHRu21uIuuc5Q9VU7Pce/x6bRFPPFOvE+NgRDH8sSRmz0FlfbYibBAzuimqN4iaSTmt7j3XbBxCC4hZ/6zfNj0XwR67N+e7H2IO2Sf57D2VDk9h73GhxCXYOC2MBDieIbEMRfhbV2EpyIZEMf2yZ7//F77T/idEoMhjreF91NiK7aCrWDg+BgIcRwQR37QeevfjwaUFF0KMgXQgzXMSQocb1tB7dPOOu+cLTZ4OoQ9X+kyVp9Otv+GMj9QrQ/qmW3rv/+LX5CM+lpz5I//mgo+VJvt+MzejQtx5amk8ea87n+Ur5HP+oLPxBj9xptzbLuXQ+NjXtxb22rHFt/woY2n86OWvXO0cuis41v7anOnrt74lh7X0bLvar/O0d8np1wn4uKcc9ruNefHL3KJaWIaDBwXAyGOG8SRgkVRgzxQ5PmR57bIWZSUQY7DJzjMc05hZC3kSxlaAQ0hcVxZ52wdp4U8+LSovmp0DF+16zr1zLTt3tWLLterd8sffCM2rqHFd2JhYZ/Zu3thnXtXj/tvfe7la+Sz+USn+swZts2Zc+Z9n/jMYsPYgSl8YF+O7dKyd452jTFhfGZfMzmd0aMf7KnnV8+fmZyCC8iwRP+cc2oM0h63sCWeiWcw8HAYuGniSMHqHRQaQGdBrU+Z2jGIBDoolFtAVU7dM7KtjLarDgspsjwN7BVhyA3jrb6tc/RSeOsTRvdgPEb+oP+VV165ty1JZAx/WjKpL9rwvLbOQQwc1wfO7etfb0yZtRgyTqywxXr77fix4oMN91V9Yrx3EMeak57M2hh752jnjQnjM/uayemMHv3oYdY5fds1p5JsfG1zd245da9p+5hPXBKXYOC8MHDTxNGnRRRuDp8aWcB7Ba0t8hRyCJaykJoeiWzXbV0IyrYyFtE6XmXbAqmcT+Y8n2ndDzo9JAzGZ+QPdiSzkj0IALrR1fOj7qedd0777bw+1/F2zchndKOHdeix3xtHF+Me+8QHG62P1f9j9vGXo9VZY2IM3RNtu6+ZnM7o0Q9lPa9tb66NV/W/XYsse0DPNea07jf98yquyUfyca0YuGni2BZRCwwtCZ8pWshRSHnCATniNR7rfH0qcNpi53ivVbad6xXIKqv/FkjXVxnHRq1kmL20h/EZ+aMNnz5xLgmpT5CUo93y1Tnt13X0Z/I18rmNITqx244fMz6jfbX73PecvXO06+sT4Jl9sX6U01k96EK25xdz++bUtb3cXVNO2WeOxCAYCAZOiYEQx3LjlRxITCQZleT0xtqE+eSyvp6VHPSeRrbrlW3HtV3Hq6xPgrBfZfSnjo36EAMIBTrXZEf+uM7vu9FCqFnnXNvW/azNmZ92Xn+28qVMXVttigHGkFkjGceMj/ZnsHHsV9USefc7sy/iMsrprB50kZO1ry6Yr5mcVqzqH/s795xWLKYfAhAMBAPnjoEQxw3iaPHxlTbFsH0CQsHlSSMtBySNJygcNfkUfNYyrjytBZF5ChyHRM9zZSyiVS820euYMuhgzgJeZZTdavHHfajLPbpOW57Ttv44hy7l/cMh50Z7Jw7odb3+GBf1zORLHa6hrT5ji1gxxpz9dvyY8UEXdtawoa9+b4+cOrZLy97FMvurT8clXTP70uYopyP8qEe8sy/84hw/mN8lp+yP9VxX2gYjbe7OKafGIG3IQjAQDFwKBkIcN4gjSaRwUWwt7BQ1iyzzFj3mlaEAWvgqENBlsVZeOQmN47WVxChTdTKHrGP4Vn2i38ooO2rxjb1QhPWnkpYZf7RBMUcHumr8mFePNmqL7/pfx+lDCNRvO8qXtpSnVT/9WZKB7DHjs4UNfcU34kcsHdulde/GURLZ5mO0L21u5RSZWT3Yr77hF2u1M5tTiLVY5ToTH+ecU/eYNqQhGAgGLgUDN0scLyVBx/DTonwMXdGRm9u5YSD4DibPDZPxJ5i8ZgyEOJYnjteYaJ7c8ISJJzDXuL/sKTfoEMdgIPeBYCAYOB0GQhyvjDjyuo5Xr7xGtKBCHHndlwvrdBdWYn26WIvzxPx0MU+sE+tg4HYxEOJ4ZcTR7+tBFvmuGN9J9LteudBv90K/5tyHOAbX14zv7C34PjcMhDheGXE8N4DFn9z0goFgIBgIBoKB68FAiGOIY15hBwPBQDAQDAQDwUAwMIWBEMcAZQoo+bR4PZ8WLzGX/oSQLa+nd9lH/QqHOhjbRUdkcw0EA8FAMPA5y07E8flP3S0vvH633L18GHjuPvhkee7jT5YXfvzu/qB/7sngr5L5jbj2R6fP3e+Rf/7WnsW0/k7jaO2lz19iTmd8PmVOZ/w5Bk7AJ2QRssfR/oj8yAbf83Wtv3Ma4njYfXwU88wnvsHAdWJgJ+IIaYTsQfz2BQSk817P63fLs9/9ZHn2O58sz3x0f337+iFR8seU/dkaxnsFxR8WRm5fm+e2DhLMvjiIQ1uQLbaHkGULft27P8j8EH+0s4vP55BTyNAuT89GPo9yWvOw1j/HGK5dl+6h/oC6eHaubcVf7zpvZXN+nYUveU1eg4H9MbATcYT0HUIaSRRkEfL5zIdPTxYrUCSOPDFh3H+zd61AUZCviTSyZ//ljzUCR2ElHmvzNZ5rfda3xMjCfYjeNXu7+HwOOd2VOI58HuV0LW51/BxjuHZd4rd48l/CIabI+6Gw7q3KhzjuXzjamOY8sQwGbgcDOxHHYwDj+Vfvludfu3v0p3YUFkgjLfviFS2FZ6tAHWP/56SDAsue13zahUCs6SCe50oc13w+5fiuxHHk2yino/XMHyPvM3Z2kdm6Lrl2mYdUq5M4MNb+c4rMSzRDHG+n0ImLtMl5MHA4BobEkSeDfhfRtg38PRn81N39K2dfZzPWezp5L/vqOnF85iNP7onlva3X75bnPvZkefLi0xvl5j96JdX6Wc8tROhAFwSq/e6TBQZZj6rDfn1NhhyEtP7gtmuxQXGzqHFen2KyhjHk8Qt/2sLHd7u7tqNIAAATgklEQVRcX/XqC+2MHuTQw1HX0pc4qL9tW/mtc9a2NowrrWtnfN7a+6zP2q570gdb/CWH2CMP7qHmiryIF+Z91U9fPTPtWg7q2hmflR/pI85+YMLXirFjxVB/iQnxA9PGkvNK8Lb8cU+0+LpG9NDZYgx7rKkYU5/+relTLu3T993EJDEJBoKBIXHk9TTfQ+SA9EHoWuA4TsuraMgecvwxTU8WuXacc0jj/brX7u7t+Qc0PXkLw75/zGEhYr0EgCLmOP5Q4CguHBQm5lq/LUIULwqlxbIWyLqeeezRoo8ijk5tU2SR9ylKLYjaUkbfiIV+zehRdo1kYKf6jL/aonX9TMse6x5Y4z5oOZ/x2TVre5/1eSan5prWfNVc4bOYIU/GynUzcVGGNRye99oZn123pa+Ns3vQ/rFiaK78AEXsxBB9MTTyxz3R1nV13Dn0Q+b5ygn29UFbdc3WXJVLPwUyGAgGgoGnMTAkjjVokMct4li/tyjpY73rWNs7XCcBrX+13RvTJ54AtU/knBu1FiK/20iR2yooFCDWtHolePVpFESOYlzHXA8RUQcy6rRfn8a0Y+qg4Kqjbds1zNcxdWC3dxADdSpbx5ybbXs2HFNv9U+97Zi+bO2dtcqpW329Vtl2TttVh3lGFsyxB+TqWkgt43Vs1EdHq2drTc9nx4xr27oP9sAHmnrNuLbizjHX7eoP6/ABPay1347P+lN19HxRvx8m2WNrq67bmqty6T9dMBKTxCQYCAaOShwroCSLjEEMOefg+40cntNKFO+fNjZPI5lnXHJZbRzSt9hA7ijcPqlwvNVtMW3HkZ8p/K6naLU6OO/padfgK0VRWUhoS6ScqzaqHuxzzgHRaZ/g7Usgqr3ax5/Whk+6jMXIZ/TN7B25utfqR6+vbDtHPvGpjlfZNeLhU+S6btTH1gx+1FP9cGw2p8YZeQ8/OHGuPm3UMefaVtk6zjpsMce4/d44e2fco+dP1VHt2Ec/sYcQgy2uidaWsrRbc1Uu/RTIYCAYCAaexsBJiGMNPE8Qe6+ekXkM4lh92yoovQLJWoicr5urrrbvemy0c5xb1Otcbw3FkScrFErssq7an9WDnRFp6dmv/s30e/4YZ2PRk+nZHu0df3rr1vxUtp0nLvhUx6us/jO2JlPHt/qjHLRrqx/tHOdb+vzQwd7aw1ygQxt1rGerytb5Nj7YQmc7PusPutVR7dhHD/v2nNanj+0HK+ZaP+q69J8uEolJYhIMBAMVA2dFHHuvpXtjboCnUPW1m+Mzba8QbRUUi2mr21eY+NLO1XPXY6OO25es1Cd+vTHlbX16p/3emt4Y6xnnUFfb6nOv+Laya7kgzq0N42wsev71xlqb7d6Z38VnZVu92q7jVRbMsS/sVxn9qWP21+KDLQ7lRm31oye7pQ+s8vR3dM1oYybvylZfzC9zjHutteOz/lQd1Y59r8HetdPba+uHetKmOAYDwUAwMMbAkDjyl9G8Jubwj1489xWz5K4G3FfMdYw+shztOOeP8ccx1Y+2oFDsGeOQFHhukXKNRIJiySGpYJ5zyQjjnLte+xRpdPha12JYSQXreNJIy4EunrZw7KJH2S2SgQz7xyf0a5e29d2nO/isblvW1z0wbsxoOT/W3tE18nkmp+bKPdASb/bimDLmUxJUZZTdig96zLl5tTU+Mz5rC30cntcWPeJFv7XVym3lfeSP+UU3etFFvx2f9afqqH7aV69xNDdgVZnaKq9/dS79cdFIjBKjYOC2MTAkjpLC3h+1QA4BkDIVTPsQR9af+ud4qs9tQbEAUfjaoxYd1kn0lKOIoRs5x2rLmmqbPgSKdchR4Cnu9YkJ51UHMtilAFddIz3KbpEMZdDlK3Ftt/bYi+TSdbasaYmMca4xGPk8u3fsbvk8k1Nl3AOteXSMvFSf6Lcyym7FR1vGtrZibEZGW8hyeN625A7MkC9tcd7KHRJD86v/2KHfjmNz1h90sC/0cEDGq8/V3x4Wse1a88Z51ZH+bRfD5D/5DwbmMDAkjgnkXCATp8RJghcsHB8LklzbLXLciz8k0bW2IY7Hz1Mv9hlLnIOB68JAiOOv/dN7AXVicCgGeHIGIal/qHSozqwPLoOBYCAYCAbODQMhjiGOIc57YIBXpTyx4nt0PmmEOPLK9Nwu8viTwhMMBAPBQDBwLAyEOO5BGo4V/Oi53Au5vvrke6l8T5Dv0SWnl5vT5C65CwaCgWBgjIEQxxDHkJ1gIBgIBoKBYCAYCAamMBDiGKBMASWfwsafwhKjxCgYCAaCgWDg2jEQ4hjiGOIYDAQDwUAwEAwEA8HAFAZCHAOUKaBc+yeoXffnH8Tsuu6x5PndSf54Z5+foPH7nMf0/RB/jumHum7FH/7qn9+5bH/E3zhcauvvgfpTS73fJr3UvcXvPME8NwzcNHHk5smPAftjyP7LEw+RJH+A+BQ37FPaOlaszs3nkT+nJo7HwKpYhyTtkreHII7Yn/VnlItd9rIlO+vPlo5jzs34I1HyX8nxZ6HWPiR4r0PumL4+pi6uDfbFQRzAa/2B+EPxI/6Nddvu+puio1h5b9EOZB8fdr1usTPau7baeGGbtSNf6/zIVpVN/7LJ8M0SR282XCB8OuXCpOWc/rGB7c1n14txHz9OaWsf/3przs3nkT/ecHt7OfbYsbCKHvD9yiuv7IRvY/EQ+5rxR/sPfe3sG59jx0V9M/4QPw5/P5TcOkbc1GWLzmsijewLssie1/BxKH4kROhRF9e/55V0GedDWnT7EAMb5LbmeBfd+rsWG+9jtOpFdiueyrXtyFYrn/PLJY83Sxz5NM/F0V70XKT1IjoWuE95UZ3S1iXGZ8bnUQy94c7oOlTmmFjlwxFFaRefjMUua2ZlZ/zR/lrxm7U1Izfjz4yeY8mM/JFQ0GJTec6J27H8OGc9XItbmD42fh46tuynrUFr94BRXkZ79z7GnvhQgb4Qx8sldCM8HGv+ZokjF0p7cfaCyg86c1NCnlchXMD1lQE6IJsQUF8DMeanei9c1veOarP+e7vIPqStarfX11f2zg3FGwzn7o11o/iMZHaJT8/POtbLBbmp/voUh/2xF2Jc52f9MR5rea9+cSP2NVodn+3jK/Zm5Ee2LArtByZ1g22LFHZ99UdfGdotrBJP19Y1vfEtf2ZzgS2ONayyV+bx+RB/XIs+819tO1/HRteOT5NYQ7/1cSs+2GMdcQJfyIppx5FRh37R6mtt25y2/rh+Lc7qQg8yyPfumciNYojMjB7kyEXv+pjFj37PtuwL3a38KD6zOFzbD7Gs+9yKz+zetUW+/LqDeKF1jy02am2ataWutJdPTG+SOHph9C7+CmouFm4GXFTI8mme83rx0neMC8+iy00XXdhirXLMc+6hvdaWeh7Clja32uqz+6Jlr+6t9bkXn5HMbHy2fHXOGNPiKwc3Ww4/TdMae/xt52f9aW2ZL2OjT7QWDOzV8Zn+LFbVNWML33t+osN94KsYcK/aaHPqGuSUQT/Xjee04qcSdcbX/JnNhX6CTWzgj7bwAzJMntv4s441s/7gq/nwniCWiLt7HflT9eAXvnK0WFTfWnyYx3/ssTfzYH4YR6Zivs2lNtzXlj8z+9K28cEvfKzY0JYy6OWoMZzRo+/orvodn8WP8rOtMW/lR/GZxeHafhjHNnZH8Zndu7bwndyj2/zQ9myJM2M+a6uNV84vl0CGOG78VbUXqqQDoLdjnnuRIePNsl4YXJhc9FWuzrOGC7c+zXSN9o9lq9rd6mufoqacPnBuX/96YzMyrNPWWny0v9Vqq+qQSK19rw/fe4Vg5E/PVi/v+gs5qbl1fNSyl55/W+tGtoxJjRP68A9b7K3qp8Az7tgMVv2uXSVl6OFQj+2aP86PcoGcMmtYtdjVHPTILbq2/NEOhVv/eq1ya/6IlRof7BL7OjbyR2wYb/a0hRn9an2e9cf1a/vyuti6J6hjK4YjPepg/72jYlvZOtbuf5dzY95bo621+MzgkL1ztPqNCeP2t+KMnP6s7V1b3gfBoPhxzcz1PmOr3U/OQxyfAvk5g8ILg4tqy09uEO0F3F6IXsBVjzK9MS/GOkdfW8x7WAxccyxbre21c/eh/VZOn+t4u2ZGhvXtuqpztt+LD2vxAf3q4ebIucesj66n7dlyD1Xu0D6xb/0/VCfrIXDsoepas0URxAdljRfyHi1WJaEWUAsTcuqpbc8f540rthxr25EMZAy/ta8/+tfqW/MHPXzAMwas7xGgkT+ub+2una/5gx5s4Rf5ZH9reUS3frV2Zv1x/VouenraNTMxHOnBPno5iA2H57SVUHGOvjWf21iMztGFzp7cyNYMDslje21iizFs0x/FR99G/lRbkFrOxY/x0hbnHu31jr2RLX1Ke7mE0dzd5BNHNs/FwKdzA9FrvWDqXHtx1ItZOWU8p3XMi7HO0bcYYbM9XHMsW63ttfORzzPxmZHB/sjWmo91vBcf5vEB/fTJObFG1mPWx5Et91DljtHHvxFWd7XjU7VaYMFZjZU6233NYJW1Pqmgb6Gp9tRP2/PHee17HThe2xkZYgjBYJ3+UMirHvtb/kCKmYc0orOXn5E/xHCXnK7508vXWh7Zm365T9tZf1y/lgv84bpSb7VZ14xiOKsH/V7H1Wbtj3yusjP9XsxdN2NrhMO1/UiQsTUbn5E/1Za4EWvma/Z6H9kyRmlDHH/LDeKSAOGrGS6SNb+5qLhAa7FrxzyvOryAemO9pxPI4Q83hvoqra6nfyxbrd61c/fhDaSV05+Z+GzJoFdba/FpbffO9afGEH3ksD6JqTaQ3boJV9lqU1t1zD3UMfsQlOqX4zPtDFarnhlb+EJB4CmDa41FHWPO12vKzWAVWWNPS7EkZupo254/yhjXtVwgp8waVpGxIBIf9sD+tdG2W/60ssanktCRP+a0rmn11vM1f8AutqqsBKAdR0a/qjz9WX9cvxZnr4vR9d7ab2O4ix5kt7Clz1v40Z+Za6cXc9dray0+yI1w2NuPH3TQj47Z+OjP2t5bW5Ja9ugeZq/3kS1jlDbE8bfcsC4JENzY/CTFxQLoObhIaNkLFxsXkK9BvLnWm5QXcN27F1Ad44aELmzypAIZWm+wzDPHwU2UeQ/1HMuW+tZabhjY1p7+6KvrZuIzI4O+UXy0udXqL63xNab4rg3m2SO+kXtvlt4oZ/zRVvUHm+S4jtG3UICfdm7mfAar6tnFlv7WvLovc27RqPuawar+EH914pvjvbbnD3LmDV3ttTOLVfRIvryO2WPPD8d6/jCmD/TRIcZYN+sPcsSUw1irT/tt2/OH9YxXWXU7TvwY48AWazw3965Z84d59JlLfXa99meud/RsxRBdM3q0iU8cnrftFn6q7Oy1sxbzmfhgb4RD9mLNQSf3J2zSshYds/EZ7b2NnTEQI9hChxg37/jFUeM3slVl079s8nizr6oBLjc9LgQuUi4UL04+3QlsLlDnuXiQ9+JFhguPdcrTckG1Y4yjy5uA9rjYXEufooYd5yvZOKYtbfZa/dcHW4pHKz+KD/IzMsptxae13Z4bH25+xhB91W/mzCct5xIJ9ll1buVLW1XeuNUx+tjHH4plOzd7PoPVXW2BY/ZcCwBjYNycWyja2Iyw6r7YM2vZf71unK9tzx/n13JhzPXXtuZcHbR1b+isc22/509d777Aj9fxLv7gY8Ue+sBk64fnPX9YU/OHLHrruFhlrD3q2i1/dtnX6HofxdD9jvQox/44PO+1a/ipsux/5jqtsXX9LvFhTY1Bi8M2X2AC/e31Mxufrb33Yue9k3i4v9nrfcuWutJeNmkkfzdNHAPgywdwzaE33DqW/naOKWAzpO5UcTyFP+CEPc/s6RT+zPihzLn5o19pt6+zXnx2wWFvfcZ2j3lidpyYhThu/BxPQHYckJ0qjiGOu+eLJ5k8QalP2U+Vr56dh/bHJ0O0Pfvt2EP709obnZ+bPyN/M9+/JnfFYeLYj2Pi8jhxCXEMcZwqoJdwgYY47ncT4TWUr1rPIc/H9sdXsH5Fga8v7LLPY/uzi+2e7Ln50/MxY09fi4fiMDF9OqaJyePEJMQxxHGnInrOF2qI4+PcRM4ZE/jG0x1eTYOPc3myeu4xi3/Hv5aCw+PHNDh9nJiGOIY4Xg1xzE3kcW4iiXviHgwEA8HA7WAgxDHEMcQxGAgGgoFgIBgIBoKBKQyEOAYoU0DJp8nb+TSZXCfXwUAwEAwEA2sYCHEMcQxxDAaCgWAgGAgGgoFgYAoDIY4ByhRQ1j55ZDyfSoOBYCAYCAaCgdvBQIhjiGOIYzAQDAQDwUAwEAwEA1MYCHEMUKaAkk+Tt/NpMrlOroOBYCAYCAbWMBDiGOIY4hgMBAPBQDAQDAQDwcAUBkIcA5QpoKx98sh4PpUGA8FAMBAMBAO3g4EQxxDHEMdgIBgIBoKBYCAYCAamMBDiGKBMASWfJm/n02RynVwHA8FAMBAMrGEgxDHEMcQxGAgGgoFgIBgIBoKBKQyEOAYoU0BZ++SR8XwqDQaCgWAgGAgGbgcDIY4hjiGOwUAwEAwEA8FAMBAMTGEgxDFAmQJKPk3ezqfJ5Dq5DgaCgWAgGFjDQIhjiGOIYzAQDAQDwUAwEAwEA1MYCHEMUKaAsvbJI+P5VBoMBAPBQDAQDNwOBv5/WaiAChc63R0AAAAASUVORK5CYII=" + } + }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When the server is up and running, you should see something like this:\n", + "\n", + "![image.png](attachment:image.png)\n", + "\n", + "You can now verify basic (server-side) functionality by running the embedded [Peaky](https://github.com/PeakyTests/Peaky) tests." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "csharp" + }, + "polyglot_notebook": { + "kernelName": "csharp" + } + }, + "outputs": [], + "source": [ + "#r \"nuget:Peaky.Client\"\n", + "\n", + "using Peaky.Client;\n", + "using System.Net.Http;\n", + "\n", + "var peakyClient = new PeakyClient(new Uri(\"https://localhost:7061/tests\"));\n", + "\n", + "var tests = (await peakyClient.GetTestsAsync()).Where(t => t.Tags.Any(tag => tag is \"self\"));\n", + "\n", + "foreach (var test in tests)\n", + "{\n", + " var result = await test.GetResultAsync();\n", + " result.Display();\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.4: Build the MS Learn mock server" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "pwsh" + }, + "polyglot_notebook": { + "kernelName": "pwsh" + } + }, + "outputs": [], + "source": [ + "Set-Location -Path $mockMsLearnServerPath\n", + "npm ci\n", + "npm run buildProd\n", + "Set-Location $tryDotnetRepoPath" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.5: Launch the MS Learn mock server\n", + "\n", + "This site hosts the Try .NET IFRAME and provides controls so you can see if things are working. It will launch in a separate terminal window. Closing that window will stop the server." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "pwsh" + }, + "polyglot_notebook": { + "kernelName": "pwsh" + } + }, + "outputs": [], + "source": [ + "Set-Location -Path $mockMsLearnServerPath\n", + "\n", + "Start-Process pwsh -ArgumentList \"-c npx http-server -p 7063\"\n", + "\n", + "Set-Location $tryDotnetRepoPath" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.6: Open the MS Learn mock site and interact with Try .NET" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "pwsh" + }, + "polyglot_notebook": { + "kernelName": "pwsh" + } + }, + "outputs": [], + "source": [ + "Start-Process \"http://127.0.0.1:7063/site/DocsHost.html?trydotnetUrl=https://localhost:7061/api/trydotnet.min.js&trydotnetOrigin=https://localhost:7061/\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Try .NET / Microsoft Learn flow diagram\n", + "\n", + "The diagram available through the link below provides a comprehensive view of the interaction between the Try .NET service and a host page (e.g., learn.microsoft.com).\n", + "\n", + "https://github.com/dotnet/interactive/tree/main/src/Microsoft.DotNet.Interactive.CSharpProject#try-net--microsoft-learn-flow\n", + "\n", + "The core of Try .NET is powered by the `CSharpProjectKernel`, which does most of the work powering the Try .NET service." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".NET (C#)", + "language": "C#", + "name": ".net-csharp" + }, + "language_info": { + "name": "polyglot-notebook" + }, + "polyglot_notebook": { + "kernelInfo": { + "defaultKernelName": "csharp", + "items": [ + { + "aliases": [], + "languageName": "csharp", + "name": "csharp" + } + ] + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Directory.Build.props b/Directory.Build.props index 5ec8bb64a..c4c081f23 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -10,19 +10,21 @@ false false - + false + $(NoWarn);NU5104 - 12.0.3 + 13.0.3 0.3.0 4.3.0 4.3.2 4.3.0 - 4.0.1 - 4.0.1 + 4.5.0 + 4.5.0 + 7.0.0 diff --git a/Directory.Build.targets b/Directory.Build.targets index 4b5b66061..f0739ac4e 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -2,21 +2,10 @@ - - - - - - - - - + + diff --git a/Directory.Packages.props b/Directory.Packages.props new file mode 100644 index 000000000..a795acae9 --- /dev/null +++ b/Directory.Packages.props @@ -0,0 +1,37 @@ + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..88adbf475 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,51 @@ +FROM mcr.microsoft.com/dotnet/sdk:9.0-azurelinux3.0 AS build-env +WORKDIR /App + +# Copy everything +COPY . ./ + +# Make sure we run bash +CMD ["bash"] + +# Make sure we get all the updates and tools we need to build +RUN tdnf install gawk -y +# This is Node v16. For 18, use nodejs18. +RUN tdnf install nodejs -y +RUN tdnf install npm -y +RUN tdnf clean all + +# Build javascript library +RUN /App/build-js.sh + +# Restore +RUN dotnet restore --configfile /App/NuGet.config /App/TryDotNet.sln + +# Build and publish a release +RUN dotnet publish -c Release -o out /App/src/Microsoft.TryDotNet + +# Build runtime image +FROM mcr.microsoft.com/dotnet/sdk:9.0-azurelinux3.0 +ARG TRY_DOT_NET_BUILD_ID +WORKDIR /App + +# Make sure we run bash +CMD ["bash"] + +# Make sure we get all the tools we need +RUN tdnf install procps -y +RUN tdnf clean all + +# Copy from build image +COPY --from=build-env /App/out . + +# Set up to run and expose app on port 80 +EXPOSE 80 +ENV ASPNETCORE_URLS=http://*:80/ + +# This is a workaround for the fact that the Try .NET website is not yet container-aware +ENV TRY_DOT_NET_REQUEST_SCHEME=https +ENV TRY_DOT_NET_BUILD_ID=$TRY_DOT_NET_BUILD_ID +ENV TRY_DOT_NET_MANUAL_BUILD_ID=2 + +# Run the Microsoft.TryDotNet website +ENTRYPOINT ["dotnet", "Microsoft.TryDotNet.dll"] diff --git a/DotNetTry.md b/DotNetTry.md index 55b45f9e0..1803ef712 100644 --- a/DotNetTry.md +++ b/DotNetTry.md @@ -3,16 +3,16 @@ ![Try_.NET Enabled](https://img.shields.io/badge/Try_.NET-Enabled-501078.svg) -[![Build Status](https://dev.azure.com/dnceng/public/_apis/build/status/dotnet/try/try-ci?branchName=master)](https://dev.azure.com/dnceng/public/_build/latest?definitionId=495&branchName=master) +[![Build Status](https://dev.azure.com/dnceng-public/public/_apis/build/status/dotnet/try/try-ci?branchName=main)](https://dev.azure.com/dnceng-public/public/_build?definitionId=62&branchName=main) **What is Try .NET?**: Try .NET is an interactive documentation generator for .NET Core. -## Experiences - Use Try .NET to create executable C# snippets for your websites, or interactive markdown files that users can run on their machine. +## Experiences + Use Try .NET to create executable C# snippets for your websites, or interactive markdown files that users can run on their machine. ### Online, powered by Blazor -Microsoft Docs uses Try .NET to create interactive documentation. Users can run and edit code all in the browser. +Microsoft Learn uses Try .NET to create interactive documentation. Users can run and edit code all in the browser. _**Please Note**: At the moment, the Try .NET online experience only works with C# documentation._ @@ -21,7 +21,7 @@ _**Please Note**: At the moment, the Try .NET online experience only works with ### Interactive .NET documentation Try .NET enables .NET developers to create interactive markdown files. -To make your markdown files interactive, you will need to use [.NET Core 3.0 SDK](https://dotnet.microsoft.com/download/dotnet-core/3.0), the dotnet try global tool and [Visual Studio](https://visualstudio.microsoft.com/) / [VS Code](https://code.visualstudio.com/) (or any other editor of your choice). +To make your markdown files interactive, you will need to use [.NET Core 3.0 SDK](https://dotnet.microsoft.com/download/dotnet-core/3.0), the dotnet try global tool and [Visual Studio](https://visualstudio.microsoft.com/) / [VS Code](https://code.visualstudio.com/) (or any other editor of your choice). diff --git a/FSharpWorkspaceShim/FSharpWorkspaceShim.fsproj b/FSharpWorkspaceShim/FSharpWorkspaceShim.fsproj deleted file mode 100644 index 9e7115f1d..000000000 --- a/FSharpWorkspaceShim/FSharpWorkspaceShim.fsproj +++ /dev/null @@ -1,28 +0,0 @@ - - - - netstandard2.0 - $(NoWarn);2003 - false - - - - - false - - - - - - - - - - - - - - - - - diff --git a/FSharpWorkspaceShim/Library.fs b/FSharpWorkspaceShim/Library.fs deleted file mode 100644 index 3a9808ce3..000000000 --- a/FSharpWorkspaceShim/Library.fs +++ /dev/null @@ -1,130 +0,0 @@ -namespace FSharpWorkspaceShim - -open System -open System.IO -open FSharp.Compiler.SourceCodeServices -open Microsoft.CodeAnalysis -open Microsoft.CodeAnalysis.Text - -module Shim = - - let private checker = FSharpChecker.Create() - - let private getIndex (text: string) (line: int) (column: int) = - let mutable index = -1 - let mutable currentLine = 0 - let mutable currentColumn = 0 - text.ToCharArray() - |> Array.iteri (fun i c -> - if line = currentLine && column = currentColumn then index <- i - match c with - | '\n' -> - currentLine <- currentLine + 1 - currentColumn <- 0 - | _ -> currentColumn <- currentColumn + 1) - index - - let private newlineProxy = System.String [|char 29|] - - // adapted from https://github.com/dotnet/fsharp/blob/master/src/fsharp/ErrorLogger.fs - let private normalizeErrorString (text : string) = - if isNull text then nullArg "text" - let text = text.Trim() - - let buf = System.Text.StringBuilder() - let mutable i = 0 - while i < text.Length do - let delta = - match text.[i] with - | '\r' when i + 1 < text.Length && text.[i + 1] = '\n' -> - // handle \r\n sequence - replace it with one single space - buf.Append newlineProxy |> ignore - 2 - | '\n' | '\r' -> - buf.Append newlineProxy |> ignore - 1 - | c -> - // handle remaining chars: control - replace with space, others - keep unchanged - let c = if Char.IsControl c then ' ' else c - buf.Append c |> ignore - 1 - i <- i + delta - buf.ToString() - - let private newlineifyErrorString (message:string) = message.Replace(newlineProxy, Environment.NewLine) - - // adapted from https://github.com/dotnet/fsharp/blob/master/vsintegration/src/FSharp.Editor/Common/RoslynHelpers.fs - let private convertError (error: FSharpErrorInfo) (location: Location) = - // Normalize the error message into the same format that we will receive it from the compiler. - // This ensures that IntelliSense and Compiler errors in the 'Error List' are de-duplicated. - // (i.e the same error does not appear twice, where the only difference is the line endings.) - let normalizedMessage = error.Message |> normalizeErrorString |> newlineifyErrorString - - let id = "FS" + error.ErrorNumber.ToString("0000") - let emptyString = LocalizableString.op_Implicit("") - let description = LocalizableString.op_Implicit(normalizedMessage) - let severity = if error.Severity = FSharpErrorSeverity.Error then DiagnosticSeverity.Error else DiagnosticSeverity.Warning - let customTags = - match error.ErrorNumber with - | 1182 -> WellKnownDiagnosticTags.Unnecessary - | _ -> null - let descriptor = new DiagnosticDescriptor(id, emptyString, description, error.Subcategory, severity, true, emptyString, String.Empty, customTags) - Diagnostic.Create(descriptor, location) - - let GetDiagnostics (projectPath: string) (files: string[]) (pathMapSource: string) (pathMapDest: string) = - async { - let projectOptions = { - ProjectFileName = projectPath - ProjectId = None - SourceFiles = files - OtherOptions = [||] - ReferencedProjects = [||] - IsIncompleteTypeCheckEnvironment = false - UseScriptResolutionRules = false - LoadTime = DateTime.Now - UnresolvedReferences = None - OriginalLoadReferences = [] - ExtraProjectInfo = None - Stamp = None - } - let ensureDirectorySeparator (path: string) = - if path.EndsWith(Path.DirectorySeparatorChar |> string) |> not then path + (string Path.DirectorySeparatorChar) - else path - let pathMapSource = ensureDirectorySeparator pathMapSource - let pathMapDest = ensureDirectorySeparator pathMapDest - let! results = checker.ParseAndCheckProject projectOptions - // adapted from from https://github.com/dotnet/fsharp/blob/master/vsintegration/src/FSharp.Editor/Diagnostics/DocumentDiagnosticAnalyzer.fs - let diagnostics = - results.Errors - |> Seq.choose (fun error -> - if error.StartLineAlternate = 0 || error.EndLineAlternate = 0 then - // F# error line numbers are one-based. Compiler returns 0 for global errors (reported by ProjectDiagnosticAnalyzer) - None - else - // Roslyn line numbers are zero-based - let linePositionSpan = LinePositionSpan(LinePosition(error.StartLineAlternate - 1, error.StartColumn), LinePosition(error.EndLineAlternate - 1, error.EndColumn)) - let text = File.ReadAllText(error.FileName) - let textSpan = - TextSpan.FromBounds( - getIndex text (error.StartLineAlternate - 1) error.StartColumn, - getIndex text (error.EndLineAlternate - 1) error.EndColumn) - - // F# compiler report errors at end of file if parsing fails. It should be corrected to match Roslyn boundaries - let correctedTextSpan = - if textSpan.End <= text.Length then - textSpan - else - let start = - min textSpan.Start (text.Length - 1) - |> max 0 - - TextSpan.FromBounds(start, text.Length) - - let filePath = - if error.FileName.StartsWith(pathMapSource) then String.Concat(pathMapDest, error.FileName.Substring(pathMapSource.Length)) - else error.FileName - let location = Location.Create(filePath, correctedTextSpan, linePositionSpan) - Some(convertError error location)) - |> Seq.toArray - return diagnostics - } |> Async.StartAsTask diff --git a/MLS.Agent.Tests/(Recipes)/EnvironmentExtensions.cs b/MLS.Agent.Tests/(Recipes)/EnvironmentExtensions.cs deleted file mode 100644 index 2892942ec..000000000 --- a/MLS.Agent.Tests/(Recipes)/EnvironmentExtensions.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Hosting; - -namespace Recipes -{ - public static class EnvironmentExtensions - { - public static bool IsTest(this IHostEnvironment hostingEnvironment) => - hostingEnvironment.EnvironmentName == "test"; - - public static IWebHostBuilder UseTestEnvironment(this IWebHostBuilder builder) => - builder.UseEnvironment("test"); - } -} diff --git a/MLS.Agent.Tests/(Recipes)/LogEvents.cs b/MLS.Agent.Tests/(Recipes)/LogEvents.cs deleted file mode 100644 index 90ee904d0..000000000 --- a/MLS.Agent.Tests/(Recipes)/LogEvents.cs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using MLS.Agent; -using WorkspaceServer; -using Xunit.Abstractions; - -namespace Pocket -{ - internal partial class LogEvents - { - public static IDisposable SubscribeToPocketLogger(this ITestOutputHelper output) => - Subscribe( - e => output.WriteLine(e.ToLogString()), - new[] - { - typeof(LogEvents).Assembly, - typeof(Startup).Assembly, - typeof(ICodeRunner).Assembly, - }); - } -} \ No newline at end of file diff --git a/MLS.Agent.Tests/AgentService.cs b/MLS.Agent.Tests/AgentService.cs deleted file mode 100644 index 56c88bf10..000000000 --- a/MLS.Agent.Tests/AgentService.cs +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Net.Http; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Hosting.Server.Features; -using Microsoft.AspNetCore.Http.Features; -using Microsoft.AspNetCore.TestHost; -using Microsoft.Extensions.DependencyInjection; -using MLS.Agent.CommandLine; -using MLS.Agent.Tools; -using Pocket; -using Recipes; -using WorkspaceServer; - -namespace MLS.Agent.Tests -{ - public class AgentService : IDisposable - { - private readonly IDirectoryAccessor _directoryAccessor; - private readonly StartupOptions _options; - private readonly CompositeDisposable _disposables = new CompositeDisposable(); - - private readonly HttpClient _client; - - public AgentService(StartupOptions options = null, IDirectoryAccessor directoryAccessor = null) - { - _directoryAccessor = directoryAccessor; - _options = options ?? new StartupOptions( - production: false, - languageService: false); - - var testServer = CreateTestServer(); - - _client = testServer.CreateClient(); - - _disposables.Add(testServer); - _disposables.Add(_client); - } - - public FakeBrowserLauncher BrowserLauncher { get; private set; } - - public void Dispose() => _disposables.Dispose(); - - private TestServer CreateTestServer() - { - //We need to set the feature collection to be not null, - //so that the ServerFeatures(like the urls to use) can be configured and used - var featureCollection = new FeatureCollection(); - featureCollection.Set(new ServerAddressesFeature()); - return new TestServer(CreateWebHostBuilder(), featureCollection); - } - - private IWebHostBuilder CreateWebHostBuilder() - { - var builder = new WebHostBuilder() - .ConfigureServices(c => - { - if (_directoryAccessor != null) - { - c.AddSingleton(_directoryAccessor); - } - c.AddSingleton(_options); - c.AddSingleton(sp => - { - BrowserLauncher = new FakeBrowserLauncher(); - return BrowserLauncher; - }); - }) - .UseTestEnvironment() - .UseStartup() - .ConfigureUrl(_options.Mode, _options.Port); - - return builder; - } - - public Task SendAsync(HttpRequestMessage request) => - _client.SendAsync(request); - } -} \ No newline at end of file diff --git a/MLS.Agent.Tests/AgentServiceExtensions.cs b/MLS.Agent.Tests/AgentServiceExtensions.cs deleted file mode 100644 index 913728549..000000000 --- a/MLS.Agent.Tests/AgentServiceExtensions.cs +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.Net.Http; -using System.Threading.Tasks; - -namespace MLS.Agent.Tests -{ - public static class AgentServiceExtensions - { - public static Task GetAsync( - this AgentService service, - string uri, - string referer = null) - { - var message = new HttpRequestMessage(HttpMethod.Get, uri); - if (referer != null) - { - message.Headers.Add("referer", referer); - } - - return service.SendAsync(message); - } - } -} \ No newline at end of file diff --git a/MLS.Agent.Tests/ApiContracts/ApiInputContractChangeTests.cs b/MLS.Agent.Tests/ApiContracts/ApiInputContractChangeTests.cs deleted file mode 100644 index 3cf68fabe..000000000 --- a/MLS.Agent.Tests/ApiContracts/ApiInputContractChangeTests.cs +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.Threading.Tasks; -using FluentAssertions; -using Microsoft.DotNet.Try.Protocol; -using Recipes; -using Xunit; -using Xunit.Abstractions; - -namespace MLS.Agent.Tests.ApiContracts -{ - public class ApiInputContractChangeTests : ApiViaHttpTestsBase - { - public ApiInputContractChangeTests(ITestOutputHelper output) : base(output) - { - } - - [Theory] - [InlineData("console")] - [InlineData("script")] - public async Task Changing_the_completion_request_format_does_not_change_the_response(string workspaceType) - { - var oldFormatRequest = - $@"{{ - ""workspace"": {{ - ""workspaceType"": ""{workspaceType}"", - ""files"": [], - ""buffers"": [ - {{ - ""id"": ""file.cs"", - ""content"": ""using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\npublic class Program\n{{\n public static void Main()\n {{\n foreach (var i in Fibonacci().Take(20))\n {{\n Console.\n }}\n }}\n\n private static IEnumerable Fibonacci()\n {{\n int current = 1, next = 1;\n\n while (true) \n {{\n yield return current;\n next = current + (current = next);\n }}\n }}\n}}\n"", - ""position"": 0 - }} - ], - ""usings"": [] - }}, - ""activeBufferId"": ""file.cs"", - ""position"": 187 -}}"; - - var newFormatRequest = - $@"{{ - ""workspace"": {{ - ""workspaceType"": ""{workspaceType}"", - ""files"": [], - ""buffers"": [ - {{ - ""id"": ""file.cs"", - ""content"": ""using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\npublic class Program\n{{\n public static void Main()\n {{\n foreach (var i in Fibonacci().Take(20))\n {{\n Console.\n }}\n }}\n\n private static IEnumerable Fibonacci()\n {{\n int current = 1, next = 1;\n\n while (true) \n {{\n yield return current;\n next = current + (current = next);\n }}\n }}\n}}\n"", - ""position"": 187 - }} - ], - ""usings"": [] - }}, - ""activeBufferId"": ""file.cs"" -}}"; - - var responseToOldFormatRequest = await CallCompletion(oldFormatRequest); - var responseToNewFormatRequest = await CallCompletion(newFormatRequest); - - responseToNewFormatRequest.Should().BeSuccessful(); - - responseToNewFormatRequest.Should().BeEquivalentTo(responseToOldFormatRequest); - - var resultOfOldFormatRequest = await responseToOldFormatRequest.DeserializeAs(); - var resultOfNewFormatRequest = await responseToNewFormatRequest.DeserializeAs(); - - resultOfNewFormatRequest.Items.Should().Contain(i => i.DisplayText == "WriteLine"); - - resultOfOldFormatRequest.Should().BeEquivalentTo(resultOfNewFormatRequest); - } - - [Theory] - [InlineData("console")] - [InlineData("script")] - public async Task Changing_the_signature_help_request_format_does_not_change_the_response(string workspaceType) - { - var oldFormatRequest = - $@"{{ - ""workspace"": {{ - ""workspaceType"": ""{workspaceType}"", - ""files"": [], - ""buffers"": [ - {{ - ""id"": ""file.cs"", - ""content"": ""using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\npublic class Program\n{{\n public static void Main()\n {{\n foreach (var i in Fibonacci().Take(20))\n {{\n Console.WriteLine()\n }}\n }}\n\n private static IEnumerable Fibonacci()\n {{\n int current = 1, next = 1;\n\n while (true) \n {{\n yield return current;\n next = current + (current = next);\n }}\n }}\n}}\n"", - ""position"": 0 - }} - ], - ""usings"": [] - }}, - ""activeBufferId"": ""file.cs"", - ""position"": 197 -}}"; - - var newFormatRequest = - $@"{{ - ""workspace"": {{ - ""workspaceType"": ""{workspaceType}"", - ""files"": [], - ""buffers"": [ - {{ - ""id"": ""file.cs"", - ""content"": ""using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\npublic class Program\n{{\n public static void Main()\n {{\n foreach (var i in Fibonacci().Take(20))\n {{\n Console.WriteLine()\n }}\n }}\n\n private static IEnumerable Fibonacci()\n {{\n int current = 1, next = 1;\n\n while (true) \n {{\n yield return current;\n next = current + (current = next);\n }}\n }}\n}}\n"", - ""position"": 197 - }} - ], - ""usings"": [] - }}, - ""activeBufferId"": ""file.cs"" -}}"; - - var responseToOldFormatRequest = await CallSignatureHelp(oldFormatRequest); - var responseToNewFormatRequest = await CallSignatureHelp(newFormatRequest); - - responseToNewFormatRequest.Should().BeSuccessful(); - - responseToNewFormatRequest.Should().BeEquivalentTo(responseToOldFormatRequest); - - var resultOfOldFormatRequest = await responseToOldFormatRequest.DeserializeAs(); - var resultOfNewFormatRequest = await responseToNewFormatRequest.DeserializeAs(); - - resultOfNewFormatRequest.Signatures.Should().Contain(i => i.Label == "void Console.WriteLine()"); - - resultOfOldFormatRequest.Should().BeEquivalentTo(resultOfNewFormatRequest); - } - - [Theory] - [InlineData("console")] - [InlineData("script")] - public async Task Changing_the_run_request_format_does_not_change_the_response(string workspaceType) - { - var oldFormatRequest = - $@"{{ - ""workspace"": {{ - ""workspaceType"": ""{workspaceType}"", - ""files"": [], - ""buffers"": [ - {{ - ""id"": ""Program.cs"", - ""content"": ""using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\npublic class Program\n{{\n public static void Main()\n {{\n foreach (var i in Fibonacci().Take(10))\n {{\n Console.WriteLine(i);\n }}\n }}\n\n private static IEnumerable Fibonacci()\n {{\n int current = 1, next = 1;\n\n while (true) \n {{\n yield return current;\n next = current + (current = next);\n }}\n }}\n}}\n"", - ""position"": 0 - }} - ], - ""usings"": [] - }}, - ""activeBufferId"": """", - ""position"": 197 -}}"; - - var newFormatRequest = - $@"{{ - ""workspace"": {{ - ""workspaceType"": ""{workspaceType}"", - ""files"": [], - ""buffers"": [ - {{ - ""id"": ""Program.cs"", - ""content"": ""using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\npublic class Program\n{{\n public static void Main()\n {{\n foreach (var i in Fibonacci().Take(10))\n {{\n Console.WriteLine(i);\n }}\n }}\n\n private static IEnumerable Fibonacci()\n {{\n int current = 1, next = 1;\n\n while (true) \n {{\n yield return current;\n next = current + (current = next);\n }}\n }}\n}}\n"", - ""position"": 197 - }} - ], - ""usings"": [] - }}, - ""activeBufferId"": """" -}}"; - - var responseToOldFormatRequest = await CallRun(oldFormatRequest); - var responseToNewFormatRequest = await CallRun(newFormatRequest); - - responseToNewFormatRequest.Should().BeSuccessful(); - - responseToNewFormatRequest.Should().BeEquivalentTo(responseToOldFormatRequest); - - var resultOfOldFormatRequest = await responseToOldFormatRequest.DeserializeAs(); - var resultOfNewFormatRequest = await responseToNewFormatRequest.DeserializeAs(); - - resultOfNewFormatRequest.Output.Should().BeEquivalentTo( - "1", - "1", - "2", - "3", - "5", - "8", - "13", - "21", - "34", - "55", - ""); - - resultOfOldFormatRequest.Should().BeEquivalentTo(resultOfNewFormatRequest); - } - } -} diff --git a/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.The_Compile_contract_for_compiling_code_has_not_been_broken.approved.json b/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.The_Compile_contract_for_compiling_code_has_not_been_broken.approved.json deleted file mode 100644 index 77efb33a4..000000000 --- a/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.The_Compile_contract_for_compiling_code_has_not_been_broken.approved.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "requestId": "TestRun", - "base64assembly": "", - "succeeded": true, - "diagnostics": [] -} \ No newline at end of file diff --git a/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.The_Compile_contract_for_noncompiling_code_has_not_been_broken.approved.json b/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.The_Compile_contract_for_noncompiling_code_has_not_been_broken.approved.json deleted file mode 100644 index 09d30d99e..000000000 --- a/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.The_Compile_contract_for_noncompiling_code_has_not_been_broken.approved.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "requestId": "TestRun", - "base64assembly": null, - "succeeded": false, - "diagnostics": [ - { - "start": 136, - "end": 142, - "message": "ViewportCode.cs(9,30): error CS0161: 'Sample.Method()': not all code paths return a value", - "severity": 3, - "id": "CS0161", - "location": "ViewportCode.cs(9,30): error CS0161" - }, - { - "start": 184, - "end": 189, - "message": "ViewportCode.cs(12,13): error CS0103: The name 'doesn' does not exist in the current context", - "severity": 3, - "id": "CS0103", - "location": "ViewportCode.cs(12,13): error CS0103" - }, - { - "start": 189, - "end": 189, - "message": "ViewportCode.cs(12,18): error CS1010: Newline in constant", - "severity": 3, - "id": "CS1010", - "location": "ViewportCode.cs(12,18): error CS1010" - }, - { - "start": 189, - "end": 189, - "message": "ViewportCode.cs(12,18): error CS1012: Too many characters in character literal", - "severity": 3, - "id": "CS1012", - "location": "ViewportCode.cs(12,18): error CS1012" - }, - { - "start": 189, - "end": 199, - "message": "ViewportCode.cs(12,18): error CS1002: ; expected", - "severity": 3, - "id": "CS1002", - "location": "ViewportCode.cs(12,18): error CS1002" - }, - { - "start": 199, - "end": 199, - "message": "ViewportCode.cs(12,28): error CS1002: ; expected", - "severity": 3, - "id": "CS1002", - "location": "ViewportCode.cs(12,28): error CS1002" - } - ], - "projectDiagnostics": [ - { - "start": 136, - "end": 142, - "message": "'Sample.Method()': not all code paths return a value", - "severity": 3, - "id": "CS0161", - "location": "ViewportCode.cs(9,30): error CS0161" - }, - { - "start": 184, - "end": 189, - "message": "The name 'doesn' does not exist in the current context", - "severity": 3, - "id": "CS0103", - "location": "ViewportCode.cs(12,13): error CS0103" - }, - { - "start": 189, - "end": 189, - "message": "Newline in constant", - "severity": 3, - "id": "CS1010", - "location": "ViewportCode.cs(12,18): error CS1010" - }, - { - "start": 189, - "end": 189, - "message": "Too many characters in character literal", - "severity": 3, - "id": "CS1012", - "location": "ViewportCode.cs(12,18): error CS1012" - }, - { - "start": 189, - "end": 199, - "message": "; expected", - "severity": 3, - "id": "CS1002", - "location": "ViewportCode.cs(12,18): error CS1002" - }, - { - "start": 199, - "end": 199, - "message": "; expected", - "severity": 3, - "id": "CS1002", - "location": "ViewportCode.cs(12,28): error CS1002" - } - ] -} \ No newline at end of file diff --git a/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.The_Completions_contract_for_noncompiling_code_has_not_been_broken.approved.json b/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.The_Completions_contract_for_noncompiling_code_has_not_been_broken.approved.json deleted file mode 100644 index 1c850433e..000000000 --- a/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.The_Completions_contract_for_noncompiling_code_has_not_been_broken.approved.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "items": [ - { - "displayText": "extern", - "kind": "Keyword", - "filterText": "extern", - "sortText": "extern", - "insertText": "extern", - "documentation": "" - }, - { - "displayText": "using", - "kind": "Keyword", - "filterText": "using", - "sortText": "using", - "insertText": "using", - "documentation": "" - } - ] -} \ No newline at end of file diff --git a/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.The_Completions_contract_has_not_been_broken.approved.json b/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.The_Completions_contract_has_not_been_broken.approved.json deleted file mode 100644 index 91e9197b7..000000000 --- a/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.The_Completions_contract_has_not_been_broken.approved.json +++ /dev/null @@ -1,570 +0,0 @@ -{ - "items": [ - { - "displayText": "BackgroundColor", - "kind": "Property", - "filterText": "BackgroundColor", - "sortText": "BackgroundColor", - "insertText": "BackgroundColor", - "documentation": { - "value": "Gets or sets the background color of the console.", - "isTrusted": false - } - }, - { - "displayText": "Beep", - "kind": "Method", - "filterText": "Beep", - "sortText": "Beep", - "insertText": "Beep", - "documentation": { - "value": "Plays the sound of a beep through the console speaker.", - "isTrusted": false - } - }, - { - "displayText": "BufferHeight", - "kind": "Property", - "filterText": "BufferHeight", - "sortText": "BufferHeight", - "insertText": "BufferHeight", - "documentation": { - "value": "Gets or sets the height of the buffer area.", - "isTrusted": false - } - }, - { - "displayText": "BufferWidth", - "kind": "Property", - "filterText": "BufferWidth", - "sortText": "BufferWidth", - "insertText": "BufferWidth", - "documentation": { - "value": "Gets or sets the width of the buffer area.", - "isTrusted": false - } - }, - { - "displayText": "CancelKeyPress", - "kind": "Event", - "filterText": "CancelKeyPress", - "sortText": "CancelKeyPress", - "insertText": "CancelKeyPress", - "documentation": { - "value": "Occurs when the System.ConsoleModifiers.Control modifier key (Ctrl) and either the System.ConsoleKey.C console key (C) or the Break key are pressed simultaneously (Ctrl+C or Ctrl+Break).", - "isTrusted": false - } - }, - { - "displayText": "CapsLock", - "kind": "Property", - "filterText": "CapsLock", - "sortText": "CapsLock", - "insertText": "CapsLock", - "documentation": { - "value": "Gets a value indicating whether the CAPS LOCK keyboard toggle is turned on or turned off.", - "isTrusted": false - } - }, - { - "displayText": "Clear", - "kind": "Method", - "filterText": "Clear", - "sortText": "Clear", - "insertText": "Clear", - "documentation": { - "value": "Clears the console buffer and corresponding console window of display information.", - "isTrusted": false - } - }, - { - "displayText": "CursorLeft", - "kind": "Property", - "filterText": "CursorLeft", - "sortText": "CursorLeft", - "insertText": "CursorLeft", - "documentation": { - "value": "Gets or sets the column position of the cursor within the buffer area.", - "isTrusted": false - } - }, - { - "displayText": "CursorSize", - "kind": "Property", - "filterText": "CursorSize", - "sortText": "CursorSize", - "insertText": "CursorSize", - "documentation": { - "value": "Gets or sets the height of the cursor within a character cell.", - "isTrusted": false - } - }, - { - "displayText": "CursorTop", - "kind": "Property", - "filterText": "CursorTop", - "sortText": "CursorTop", - "insertText": "CursorTop", - "documentation": { - "value": "Gets or sets the row position of the cursor within the buffer area.", - "isTrusted": false - } - }, - { - "displayText": "CursorVisible", - "kind": "Property", - "filterText": "CursorVisible", - "sortText": "CursorVisible", - "insertText": "CursorVisible", - "documentation": { - "value": "Gets or sets a value indicating whether the cursor is visible.", - "isTrusted": false - } - }, - { - "displayText": "Equals", - "kind": "Method", - "filterText": "Equals", - "sortText": "Equals", - "insertText": "Equals", - "documentation": { - "value": "Determines whether the specified object instances are considered equal.", - "isTrusted": false - } - }, - { - "displayText": "Error", - "kind": "Property", - "filterText": "Error", - "sortText": "Error", - "insertText": "Error", - "documentation": { - "value": "Gets the standard error output stream.", - "isTrusted": false - } - }, - { - "displayText": "ForegroundColor", - "kind": "Property", - "filterText": "ForegroundColor", - "sortText": "ForegroundColor", - "insertText": "ForegroundColor", - "documentation": { - "value": "Gets or sets the foreground color of the console.", - "isTrusted": false - } - }, - { - "displayText": "In", - "kind": "Property", - "filterText": "In", - "sortText": "In", - "insertText": "In", - "documentation": { - "value": "Gets the standard input stream.", - "isTrusted": false - } - }, - { - "displayText": "InputEncoding", - "kind": "Property", - "filterText": "InputEncoding", - "sortText": "InputEncoding", - "insertText": "InputEncoding", - "documentation": { - "value": "Gets or sets the encoding the console uses to read input.", - "isTrusted": false - } - }, - { - "displayText": "IsErrorRedirected", - "kind": "Property", - "filterText": "IsErrorRedirected", - "sortText": "IsErrorRedirected", - "insertText": "IsErrorRedirected", - "documentation": { - "value": "Gets a value that indicates whether the error output stream has been redirected from the standard error stream.", - "isTrusted": false - } - }, - { - "displayText": "IsInputRedirected", - "kind": "Property", - "filterText": "IsInputRedirected", - "sortText": "IsInputRedirected", - "insertText": "IsInputRedirected", - "documentation": { - "value": "Gets a value that indicates whether input has been redirected from the standard input stream.", - "isTrusted": false - } - }, - { - "displayText": "IsOutputRedirected", - "kind": "Property", - "filterText": "IsOutputRedirected", - "sortText": "IsOutputRedirected", - "insertText": "IsOutputRedirected", - "documentation": { - "value": "Gets a value that indicates whether output has been redirected from the standard output stream.", - "isTrusted": false - } - }, - { - "displayText": "KeyAvailable", - "kind": "Property", - "filterText": "KeyAvailable", - "sortText": "KeyAvailable", - "insertText": "KeyAvailable", - "documentation": { - "value": "Gets a value indicating whether a key press is available in the input stream.", - "isTrusted": false - } - }, - { - "displayText": "LargestWindowHeight", - "kind": "Property", - "filterText": "LargestWindowHeight", - "sortText": "LargestWindowHeight", - "insertText": "LargestWindowHeight", - "documentation": { - "value": "Gets the largest possible number of console window rows, based on the current font and screen resolution.", - "isTrusted": false - } - }, - { - "displayText": "LargestWindowWidth", - "kind": "Property", - "filterText": "LargestWindowWidth", - "sortText": "LargestWindowWidth", - "insertText": "LargestWindowWidth", - "documentation": { - "value": "Gets the largest possible number of console window columns, based on the current font and screen resolution.", - "isTrusted": false - } - }, - { - "displayText": "MoveBufferArea", - "kind": "Method", - "filterText": "MoveBufferArea", - "sortText": "MoveBufferArea", - "insertText": "MoveBufferArea", - "documentation": { - "value": "Copies a specified source area of the screen buffer to a specified destination area.", - "isTrusted": false - } - }, - { - "displayText": "NumberLock", - "kind": "Property", - "filterText": "NumberLock", - "sortText": "NumberLock", - "insertText": "NumberLock", - "documentation": { - "value": "Gets a value indicating whether the NUM LOCK keyboard toggle is turned on or turned off.", - "isTrusted": false - } - }, - { - "displayText": "OpenStandardError", - "kind": "Method", - "filterText": "OpenStandardError", - "sortText": "OpenStandardError", - "insertText": "OpenStandardError", - "documentation": { - "value": "Acquires the standard error stream.", - "isTrusted": false - } - }, - { - "displayText": "OpenStandardInput", - "kind": "Method", - "filterText": "OpenStandardInput", - "sortText": "OpenStandardInput", - "insertText": "OpenStandardInput", - "documentation": { - "value": "Acquires the standard input stream.", - "isTrusted": false - } - }, - { - "displayText": "OpenStandardOutput", - "kind": "Method", - "filterText": "OpenStandardOutput", - "sortText": "OpenStandardOutput", - "insertText": "OpenStandardOutput", - "documentation": { - "value": "Acquires the standard output stream.", - "isTrusted": false - } - }, - { - "displayText": "Out", - "kind": "Property", - "filterText": "Out", - "sortText": "Out", - "insertText": "Out", - "documentation": { - "value": "Gets the standard output stream.", - "isTrusted": false - } - }, - { - "displayText": "OutputEncoding", - "kind": "Property", - "filterText": "OutputEncoding", - "sortText": "OutputEncoding", - "insertText": "OutputEncoding", - "documentation": { - "value": "Gets or sets the encoding the console uses to write output.", - "isTrusted": false - } - }, - { - "displayText": "Read", - "kind": "Method", - "filterText": "Read", - "sortText": "Read", - "insertText": "Read", - "documentation": { - "value": "Reads the next character from the standard input stream.", - "isTrusted": false - } - }, - { - "displayText": "ReadKey", - "kind": "Method", - "filterText": "ReadKey", - "sortText": "ReadKey", - "insertText": "ReadKey", - "documentation": { - "value": "Obtains the next character or function key pressed by the user. The pressed key is displayed in the console window.", - "isTrusted": false - } - }, - { - "displayText": "ReadLine", - "kind": "Method", - "filterText": "ReadLine", - "sortText": "ReadLine", - "insertText": "ReadLine", - "documentation": { - "value": "Reads the next line of characters from the standard input stream.", - "isTrusted": false - } - }, - { - "displayText": "ReferenceEquals", - "kind": "Method", - "filterText": "ReferenceEquals", - "sortText": "ReferenceEquals", - "insertText": "ReferenceEquals", - "documentation": { - "value": "Determines whether the specified System.Object instances are the same instance.", - "isTrusted": false - } - }, - { - "displayText": "ResetColor", - "kind": "Method", - "filterText": "ResetColor", - "sortText": "ResetColor", - "insertText": "ResetColor", - "documentation": { - "value": "Sets the foreground and background console colors to their defaults.", - "isTrusted": false - } - }, - { - "displayText": "SetBufferSize", - "kind": "Method", - "filterText": "SetBufferSize", - "sortText": "SetBufferSize", - "insertText": "SetBufferSize", - "documentation": { - "value": "Sets the height and width of the screen buffer area to the specified values.", - "isTrusted": false - } - }, - { - "displayText": "SetCursorPosition", - "kind": "Method", - "filterText": "SetCursorPosition", - "sortText": "SetCursorPosition", - "insertText": "SetCursorPosition", - "documentation": { - "value": "Sets the position of the cursor.", - "isTrusted": false - } - }, - { - "displayText": "SetError", - "kind": "Method", - "filterText": "SetError", - "sortText": "SetError", - "insertText": "SetError", - "documentation": { - "value": "Sets the System.Console.Error property to the specified System.IO.TextWriter object.", - "isTrusted": false - } - }, - { - "displayText": "SetIn", - "kind": "Method", - "filterText": "SetIn", - "sortText": "SetIn", - "insertText": "SetIn", - "documentation": { - "value": "Sets the System.Console.In property to the specified System.IO.TextReader object.", - "isTrusted": false - } - }, - { - "displayText": "SetOut", - "kind": "Method", - "filterText": "SetOut", - "sortText": "SetOut", - "insertText": "SetOut", - "documentation": { - "value": "Sets the System.Console.Out property to target the System.IO.TextWriter object.", - "isTrusted": false - } - }, - { - "displayText": "SetWindowPosition", - "kind": "Method", - "filterText": "SetWindowPosition", - "sortText": "SetWindowPosition", - "insertText": "SetWindowPosition", - "documentation": { - "value": "Sets the position of the console window relative to the screen buffer.", - "isTrusted": false - } - }, - { - "displayText": "SetWindowSize", - "kind": "Method", - "filterText": "SetWindowSize", - "sortText": "SetWindowSize", - "insertText": "SetWindowSize", - "documentation": { - "value": "Sets the height and width of the console window to the specified values.", - "isTrusted": false - } - }, - { - "displayText": "Title", - "kind": "Property", - "filterText": "Title", - "sortText": "Title", - "insertText": "Title", - "documentation": { - "value": "Gets or sets the title to display in the console title bar.", - "isTrusted": false - } - }, - { - "displayText": "TreatControlCAsInput", - "kind": "Property", - "filterText": "TreatControlCAsInput", - "sortText": "TreatControlCAsInput", - "insertText": "TreatControlCAsInput", - "documentation": { - "value": "Gets or sets a value indicating whether the combination of the System.ConsoleModifiers.Control modifier key and System.ConsoleKey.C console key (Ctrl+C) is treated as ordinary input or as an interruption that is handled by the operating system.", - "isTrusted": false - } - }, - { - "displayText": "WindowHeight", - "kind": "Property", - "filterText": "WindowHeight", - "sortText": "WindowHeight", - "insertText": "WindowHeight", - "documentation": { - "value": "Gets or sets the height of the console window area.", - "isTrusted": false - } - }, - { - "displayText": "WindowLeft", - "kind": "Property", - "filterText": "WindowLeft", - "sortText": "WindowLeft", - "insertText": "WindowLeft", - "documentation": { - "value": "Gets or sets the leftmost position of the console window area relative to the screen buffer.", - "isTrusted": false - } - }, - { - "displayText": "WindowTop", - "kind": "Property", - "filterText": "WindowTop", - "sortText": "WindowTop", - "insertText": "WindowTop", - "documentation": { - "value": "Gets or sets the top position of the console window area relative to the screen buffer.", - "isTrusted": false - } - }, - { - "displayText": "WindowWidth", - "kind": "Property", - "filterText": "WindowWidth", - "sortText": "WindowWidth", - "insertText": "WindowWidth", - "documentation": { - "value": "Gets or sets the width of the console window.", - "isTrusted": false - } - }, - { - "displayText": "Write", - "kind": "Method", - "filterText": "Write", - "sortText": "Write", - "insertText": "Write", - "documentation": { - "value": "Writes the text representation of the specified Boolean value to the standard output stream.", - "isTrusted": false - } - }, - { - "displayText": "WriteLine", - "kind": "Method", - "filterText": "WriteLine", - "sortText": "WriteLine", - "insertText": "WriteLine", - "documentation": { - "value": "Writes the current line terminator to the standard output stream.", - "isTrusted": false - } - } - ], - "requestId": "TestRun", - "diagnostics": [ - { - "start": 194, - "end": 194, - "message": "ViewportCode.cs(12,23): error CS1002: ; expected", - "severity": 3, - "id": "CS1002", - "location": "ViewportCode.cs(12,23): error CS1002" - }, - { - "start": 192, - "end": 194, - "message": "ViewportCode.cs(12,21): error CS0117: 'Console' does not contain a definition for 'Ou'", - "severity": 3, - "id": "CS0117", - "location": "ViewportCode.cs(12,21): error CS0117" - }, - { - "start": 136, - "end": 142, - "message": "ViewportCode.cs(9,30): error CS0161: 'Sample.Method()': not all code paths return a value", - "severity": 3, - "id": "CS0161", - "location": "ViewportCode.cs(9,30): error CS0161" - } - ] -} \ No newline at end of file diff --git a/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.The_Run_contract_for_compiling_code_has_not_been_broken.approved.json b/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.The_Run_contract_for_compiling_code_has_not_been_broken.approved.json deleted file mode 100644 index 6dc9d3637..000000000 --- a/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.The_Run_contract_for_compiling_code_has_not_been_broken.approved.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "requestId": "TestRun", - "succeeded": true, - "output": [ - "Hello world!", - "" - ], - "exception": null, - "diagnostics": [] -} \ No newline at end of file diff --git a/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.The_Run_contract_for_noncompiling_code_has_not_been_broken.approved.json b/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.The_Run_contract_for_noncompiling_code_has_not_been_broken.approved.json deleted file mode 100644 index 90a3ff76c..000000000 --- a/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.The_Run_contract_for_noncompiling_code_has_not_been_broken.approved.json +++ /dev/null @@ -1,113 +0,0 @@ -{ - "requestId": "TestRun", - "succeeded": false, - "output": [ - "ViewportCode.cs(12,18): error CS1002: ; expected", - "ViewportCode.cs(12,18): error CS1010: Newline in constant", - "ViewportCode.cs(12,18): error CS1012: Too many characters in character literal", - "ViewportCode.cs(12,28): error CS1002: ; expected", - "ViewportCode.cs(12,13): error CS0103: The name 'doesn' does not exist in the current context", - "ViewportCode.cs(9,30): error CS0161: 'Sample.Method()': not all code paths return a value" - ], - "exception": null, - "diagnostics": [ - { - "start": 136, - "end": 142, - "message": "ViewportCode.cs(9,30): error CS0161: 'Sample.Method()': not all code paths return a value", - "severity": 3, - "id": "CS0161", - "location": "ViewportCode.cs(9,30): error CS0161" - }, - { - "start": 184, - "end": 189, - "message": "ViewportCode.cs(12,13): error CS0103: The name 'doesn' does not exist in the current context", - "severity": 3, - "id": "CS0103", - "location": "ViewportCode.cs(12,13): error CS0103" - }, - { - "start": 189, - "end": 189, - "message": "ViewportCode.cs(12,18): error CS1010: Newline in constant", - "severity": 3, - "id": "CS1010", - "location": "ViewportCode.cs(12,18): error CS1010" - }, - { - "start": 189, - "end": 189, - "message": "ViewportCode.cs(12,18): error CS1012: Too many characters in character literal", - "severity": 3, - "id": "CS1012", - "location": "ViewportCode.cs(12,18): error CS1012" - }, - { - "start": 189, - "end": 199, - "message": "ViewportCode.cs(12,18): error CS1002: ; expected", - "severity": 3, - "id": "CS1002", - "location": "ViewportCode.cs(12,18): error CS1002" - }, - { - "start": 199, - "end": 199, - "message": "ViewportCode.cs(12,28): error CS1002: ; expected", - "severity": 3, - "id": "CS1002", - "location": "ViewportCode.cs(12,28): error CS1002" - } - ], - "projectDiagnostics": [ - { - "start": 136, - "end": 142, - "message": "'Sample.Method()': not all code paths return a value", - "severity": 3, - "id": "CS0161", - "location": "ViewportCode.cs(9,30): error CS0161" - }, - { - "start": 184, - "end": 189, - "message": "The name 'doesn' does not exist in the current context", - "severity": 3, - "id": "CS0103", - "location": "ViewportCode.cs(12,13): error CS0103" - }, - { - "start": 189, - "end": 189, - "message": "Newline in constant", - "severity": 3, - "id": "CS1010", - "location": "ViewportCode.cs(12,18): error CS1010" - }, - { - "start": 189, - "end": 189, - "message": "Too many characters in character literal", - "severity": 3, - "id": "CS1012", - "location": "ViewportCode.cs(12,18): error CS1012" - }, - { - "start": 189, - "end": 199, - "message": "; expected", - "severity": 3, - "id": "CS1002", - "location": "ViewportCode.cs(12,18): error CS1002" - }, - { - "start": 199, - "end": 199, - "message": "; expected", - "severity": 3, - "id": "CS1002", - "location": "ViewportCode.cs(12,28): error CS1002" - } - ] -} \ No newline at end of file diff --git a/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.The_instrumentation_contract_has_not_been_broken.approved.json b/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.The_instrumentation_contract_has_not_been_broken.approved.json deleted file mode 100644 index 86f018be3..000000000 --- a/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.The_instrumentation_contract_has_not_been_broken.approved.json +++ /dev/null @@ -1,150 +0,0 @@ -{ - "requestId": "TestRun", - "succeeded": true, - "output": [], - "exception": null, - "diagnostics": [], - "instrumentation": [ - { - "filePosition": { - "line": 10, - "character": 12, - "file": "Program.cs" - }, - "locals": [], - "output": { - "start": 0, - "end": 0 - } - }, - { - "filePosition": { - "line": 10, - "character": 23, - "file": "Program.cs" - }, - "locals": [ - { - "name": "a", - "value": "1", - "declaredAt": { - "start": 146, - "end": 147 - } - } - ], - "output": { - "start": 0, - "end": 0 - } - }, - { - "filePosition": { - "line": 10, - "character": 34, - "file": "Program.cs" - }, - "locals": [ - { - "name": "b", - "value": "2", - "declaredAt": { - "start": 157, - "end": 158 - } - }, - { - "name": "a", - "value": "1", - "declaredAt": { - "start": 146, - "end": 147 - } - } - ], - "output": { - "start": 0, - "end": 0 - } - }, - { - "filePosition": { - "line": 10, - "character": 41, - "file": "Program.cs" - }, - "locals": [ - { - "name": "b", - "value": "2", - "declaredAt": { - "start": 157, - "end": 158 - } - }, - { - "name": "a", - "value": "3", - "declaredAt": { - "start": 146, - "end": 147 - } - } - ], - "output": { - "start": 0, - "end": 0 - } - } - ], - "variableLocations": [ - { - "name": "b", - "locations": [ - { - "startLine": 10, - "startColumn": 41, - "endLine": 10, - "endColumn": 42 - }, - { - "startLine": 10, - "startColumn": 27, - "endLine": 10, - "endColumn": 28 - } - ], - "declaredAt": { - "start": 157, - "end": 158 - } - }, - { - "name": "a", - "locations": [ - { - "startLine": 10, - "startColumn": 34, - "endLine": 10, - "endColumn": 35 - }, - { - "startLine": 10, - "startColumn": 45, - "endLine": 10, - "endColumn": 46 - }, - { - "startLine": 10, - "startColumn": 16, - "endLine": 10, - "endColumn": 17 - } - ], - "declaredAt": { - "start": 146, - "end": 147 - } - } - ] -} \ No newline at end of file diff --git a/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.The_run_contract_with_no_instrumentation_has_not_been_broken.approved.json b/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.The_run_contract_with_no_instrumentation_has_not_been_broken.approved.json deleted file mode 100644 index 75429ec44..000000000 --- a/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.The_run_contract_with_no_instrumentation_has_not_been_broken.approved.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "requestId": "TestRun", - "succeeded": true, - "output": [], - "exception": null, - "diagnostics": [] -} \ No newline at end of file diff --git a/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.The_signature_help_contract_has_not_been_broken.approved.json b/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.The_signature_help_contract_has_not_been_broken.approved.json deleted file mode 100644 index 940590b80..000000000 --- a/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.The_signature_help_contract_has_not_been_broken.approved.json +++ /dev/null @@ -1,403 +0,0 @@ -{ - "signatures": [ - { - "name": "Write", - "label": "void Console.Write(bool value)", - "documentation": { - "value": "Writes the text representation of the specified Boolean value to the standard output stream.", - "isTrusted": false - }, - "parameters": [ - { - "name": "value", - "label": "bool value", - "documentation": { - "value": "**value**: The value to write.", - "isTrusted": false - } - } - ] - }, - { - "name": "Write", - "label": "void Console.Write(char value)", - "documentation": { - "value": "Writes the specified Unicode character value to the standard output stream.", - "isTrusted": false - }, - "parameters": [ - { - "name": "value", - "label": "char value", - "documentation": { - "value": "**value**: The value to write.", - "isTrusted": false - } - } - ] - }, - { - "name": "Write", - "label": "void Console.Write(char[] buffer)", - "documentation": { - "value": "Writes the specified array of Unicode characters to the standard output stream.", - "isTrusted": false - }, - "parameters": [ - { - "name": "buffer", - "label": "char[] buffer", - "documentation": { - "value": "**buffer**: A Unicode character array.", - "isTrusted": false - } - } - ] - }, - { - "name": "Write", - "label": "void Console.Write(char[] buffer, int index, int count)", - "documentation": { - "value": "Writes the specified subarray of Unicode characters to the standard output stream.", - "isTrusted": false - }, - "parameters": [ - { - "name": "buffer", - "label": "char[] buffer", - "documentation": { - "value": "**buffer**: An array of Unicode characters.", - "isTrusted": false - } - }, - { - "name": "index", - "label": "int index", - "documentation": { - "value": "**index**: The starting position in buffer .", - "isTrusted": false - } - }, - { - "name": "count", - "label": "int count", - "documentation": { - "value": "**count**: The number of characters to write.", - "isTrusted": false - } - } - ] - }, - { - "name": "Write", - "label": "void Console.Write(decimal value)", - "documentation": { - "value": "Writes the text representation of the specified System.Decimal value to the standard output stream.", - "isTrusted": false - }, - "parameters": [ - { - "name": "value", - "label": "decimal value", - "documentation": { - "value": "**value**: The value to write.", - "isTrusted": false - } - } - ] - }, - { - "name": "Write", - "label": "void Console.Write(double value)", - "documentation": { - "value": "Writes the text representation of the specified double-precision floating-point value to the standard output stream.", - "isTrusted": false - }, - "parameters": [ - { - "name": "value", - "label": "double value", - "documentation": { - "value": "**value**: The value to write.", - "isTrusted": false - } - } - ] - }, - { - "name": "Write", - "label": "void Console.Write(int value)", - "documentation": { - "value": "Writes the text representation of the specified 32-bit signed integer value to the standard output stream.", - "isTrusted": false - }, - "parameters": [ - { - "name": "value", - "label": "int value", - "documentation": { - "value": "**value**: The value to write.", - "isTrusted": false - } - } - ] - }, - { - "name": "Write", - "label": "void Console.Write(long value)", - "documentation": { - "value": "Writes the text representation of the specified 64-bit signed integer value to the standard output stream.", - "isTrusted": false - }, - "parameters": [ - { - "name": "value", - "label": "long value", - "documentation": { - "value": "**value**: The value to write.", - "isTrusted": false - } - } - ] - }, - { - "name": "Write", - "label": "void Console.Write(object value)", - "documentation": { - "value": "Writes the text representation of the specified object to the standard output stream.", - "isTrusted": false - }, - "parameters": [ - { - "name": "value", - "label": "object value", - "documentation": { - "value": "**value**: The value to write, or null.", - "isTrusted": false - } - } - ] - }, - { - "name": "Write", - "label": "void Console.Write(float value)", - "documentation": { - "value": "Writes the text representation of the specified single-precision floating-point value to the standard output stream.", - "isTrusted": false - }, - "parameters": [ - { - "name": "value", - "label": "float value", - "documentation": { - "value": "**value**: The value to write.", - "isTrusted": false - } - } - ] - }, - { - "name": "Write", - "label": "void Console.Write(string value)", - "documentation": { - "value": "Writes the specified string value to the standard output stream.", - "isTrusted": false - }, - "parameters": [ - { - "name": "value", - "label": "string value", - "documentation": { - "value": "**value**: The value to write.", - "isTrusted": false - } - } - ] - }, - { - "name": "Write", - "label": "void Console.Write(string format, object arg0)", - "documentation": { - "value": "Writes the text representation of the specified object to the standard output stream using the specified format information.", - "isTrusted": false - }, - "parameters": [ - { - "name": "format", - "label": "string format", - "documentation": { - "value": "**format**: A composite format string.", - "isTrusted": false - } - }, - { - "name": "arg0", - "label": "object arg0", - "documentation": { - "value": "**arg0**: An object to write using format .", - "isTrusted": false - } - } - ] - }, - { - "name": "Write", - "label": "void Console.Write(string format, object arg0, object arg1)", - "documentation": { - "value": "Writes the text representation of the specified objects to the standard output stream using the specified format information.", - "isTrusted": false - }, - "parameters": [ - { - "name": "format", - "label": "string format", - "documentation": { - "value": "**format**: A composite format string.", - "isTrusted": false - } - }, - { - "name": "arg0", - "label": "object arg0", - "documentation": { - "value": "**arg0**: The first object to write using format .", - "isTrusted": false - } - }, - { - "name": "arg1", - "label": "object arg1", - "documentation": { - "value": "**arg1**: The second object to write using format .", - "isTrusted": false - } - } - ] - }, - { - "name": "Write", - "label": "void Console.Write(string format, object arg0, object arg1, object arg2)", - "documentation": { - "value": "Writes the text representation of the specified objects to the standard output stream using the specified format information.", - "isTrusted": false - }, - "parameters": [ - { - "name": "format", - "label": "string format", - "documentation": { - "value": "**format**: A composite format string.", - "isTrusted": false - } - }, - { - "name": "arg0", - "label": "object arg0", - "documentation": { - "value": "**arg0**: The first object to write using format .", - "isTrusted": false - } - }, - { - "name": "arg1", - "label": "object arg1", - "documentation": { - "value": "**arg1**: The second object to write using format .", - "isTrusted": false - } - }, - { - "name": "arg2", - "label": "object arg2", - "documentation": { - "value": "**arg2**: The third object to write using format .", - "isTrusted": false - } - } - ] - }, - { - "name": "Write", - "label": "void Console.Write(string format, params object[] arg)", - "documentation": { - "value": "Writes the text representation of the specified array of objects to the standard output stream using the specified format information.", - "isTrusted": false - }, - "parameters": [ - { - "name": "format", - "label": "string format", - "documentation": { - "value": "**format**: A composite format string.", - "isTrusted": false - } - }, - { - "name": "arg", - "label": "params object[] arg", - "documentation": { - "value": "**arg**: An array of objects to write using format .", - "isTrusted": false - } - } - ] - }, - { - "name": "Write", - "label": "void Console.Write(uint value)", - "documentation": { - "value": "Writes the text representation of the specified 32-bit unsigned integer value to the standard output stream.", - "isTrusted": false - }, - "parameters": [ - { - "name": "value", - "label": "uint value", - "documentation": { - "value": "**value**: The value to write.", - "isTrusted": false - } - } - ] - }, - { - "name": "Write", - "label": "void Console.Write(ulong value)", - "documentation": { - "value": "Writes the text representation of the specified 64-bit unsigned integer value to the standard output stream.", - "isTrusted": false - }, - "parameters": [ - { - "name": "value", - "label": "ulong value", - "documentation": { - "value": "**value**: The value to write.", - "isTrusted": false - } - } - ] - } - ], - "activeSignature": 0, - "activeParameter": 0, - "requestId": "TestRun", - "diagnostics": [ - { - "start": 192, - "end": 197, - "message": "ViewportCode.cs(12,21): error CS1501: No overload for method 'Write' takes 0 arguments", - "severity": 3, - "id": "CS1501", - "location": "ViewportCode.cs(12,21): error CS1501" - }, - { - "start": 136, - "end": 142, - "message": "ViewportCode.cs(9,30): error CS0161: 'Sample.Method()': not all code paths return a value", - "severity": 3, - "id": "CS0161", - "location": "ViewportCode.cs(9,30): error CS0161" - } - ] -} \ No newline at end of file diff --git a/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.cs b/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.cs deleted file mode 100644 index ed6542a3e..000000000 --- a/MLS.Agent.Tests/ApiContracts/ApiOutputContractTests.cs +++ /dev/null @@ -1,283 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using Assent; -using FluentAssertions; -using Microsoft.DotNet.Try.Project; -using Microsoft.DotNet.Try.Protocol; -using Microsoft.DotNet.Try.Protocol.Tests; -using Recipes; -using Xunit; -using Xunit.Abstractions; - -namespace MLS.Agent.Tests.ApiContracts -{ - public class ApiOutputContractTests : ApiViaHttpTestsBase - { - private readonly Configuration configuration; - - public ApiOutputContractTests(ITestOutputHelper output) : base(output) - { - configuration = new Configuration() - .UsingExtension("json"); - - configuration = configuration.SetInteractive(true); - } - - [Fact] - public async Task The_Run_contract_for_compiling_code_has_not_been_broken() - { - var viewport = ViewportCode(); - - var requestJson = new WorkspaceRequest( - new Workspace( - workspaceType: "console", - buffers: new[] - { - EntrypointCode(), - viewport - }), - activeBufferId: viewport.Id, - requestId: "TestRun"); - - var response = await CallRun(requestJson.ToJson()); - - var result = await response.Content.ReadAsStringAsync(); - - this.Assent(result.FormatJson(), configuration); - } - - [Fact] - public async Task The_Run_contract_for_noncompiling_code_has_not_been_broken() - { - var viewport = ViewportCode("doesn't compile"); - - var request = new WorkspaceRequest( - new Workspace( - workspaceType: "console", - buffers: new[] - { - EntrypointCode(), - viewport - }), - activeBufferId: viewport.Id, - requestId: "TestRun"); - - var requestBody = request.ToJson(); - - var response = await CallRun(requestBody); - - var result = await response.Content.ReadAsStringAsync(); - - this.Assent(RemoveMachineSpecificPaths(result).FormatJson(), configuration); - } - - [Fact] - public async Task The_Compile_contract_for_compiling_code_has_not_been_broken() - { - var viewport = ViewportCode(); - - var requestJson = new WorkspaceRequest( - new Workspace( - workspaceType: "console", - buffers: new[] - { - EntrypointCode(), - viewport - }), - activeBufferId: viewport.Id, - requestId: "TestRun"); - - var response = await CallCompile(requestJson.ToJson()); - - var result = await response.Content.ReadAsStringAsync(); - - var compileResult = result.FromJsonTo(); - - compileResult.Base64Assembly.Should().NotBeNullOrWhiteSpace(); - compileResult = new CompileResult( - compileResult.Succeeded, - "", - compileResult.GetFeature(), - compileResult.RequestId); - - result = compileResult.ToJson().FormatJson(); - - this.Assent(result, configuration); - } - - [Fact] - public async Task The_Compile_contract_for_noncompiling_code_has_not_been_broken() - { - var viewport = ViewportCode("doesn't compile"); - - var request = new WorkspaceRequest( - new Workspace( - workspaceType: "console", - buffers: new[] - { - EntrypointCode(), - viewport - }), - activeBufferId: viewport.Id, - requestId: "TestRun"); - - var requestBody = request.ToJson(); - - var response = await CallCompile(requestBody); - - var result = await response.Content.ReadAsStringAsync(); - - this.Assent(RemoveMachineSpecificPaths(result).FormatJson(), configuration); - } - - [Fact] - public async Task The_Completions_contract_has_not_been_broken() - { - var viewport = ViewportCode("Console.Ou$$"); - - var requestJson = new WorkspaceRequest( - new Workspace( - workspaceType: "console", - buffers: new[] - { - EntrypointCode(), - viewport - }), - activeBufferId: viewport.Id, - requestId: "TestRun").ToJson(); - - var response = await CallCompletion(requestJson); - - var result = await response.Content.ReadAsStringAsync(); - - this.Assent(result.FormatJson(), configuration); - } - - [Fact] - public async Task The_signature_help_contract_has_not_been_broken() - { - var viewport = ViewportCode("Console.Write($$);"); - - var requestJson = new WorkspaceRequest( - new Workspace( - workspaceType: "console", - buffers: new[] - { - EntrypointCode(), - viewport - }), - activeBufferId: viewport.Id, - requestId: "TestRun").ToJson(); - - var response = await CallSignatureHelp(requestJson); - - var result = await response.Content.ReadAsStringAsync(); - - this.Assent(result.FormatJson(), configuration); - } - - [Fact(Skip = "Needs moved onto Package2")] - public async Task The_instrumentation_contract_has_not_been_broken() - { - var requestJson = new WorkspaceRequest( - new Workspace( - workspaceType: "console", - buffers: new[] - { - EntrypointCode("int a = 1; int b = 2; a = 3; b = a;") - }, - includeInstrumentation: true), - requestId: "TestRun" - ).ToJson(); - - var response = await CallRun(requestJson); - - var result = await response.Content.ReadAsStringAsync(); - - this.Assent(RemoveMachineSpecificPaths(result).FormatJson(), configuration); - } - - [Fact] - public async Task The_run_contract_with_no_instrumentation_has_not_been_broken() - { - var requestJson = new WorkspaceRequest( - new Workspace( - workspaceType: "console", - buffers: new[] - { - EntrypointCode("int a = 1; int b = 2; a = 3; b = a;") - }, - includeInstrumentation: false), - requestId: "TestRun" - ).ToJson(); - - var response = await CallRun(requestJson); - - var result = await response.Content.ReadAsStringAsync(); - - this.Assent(RemoveMachineSpecificPaths(result).FormatJson(), configuration); - } - - private static Buffer EntrypointCode(string mainContent = @"Console.WriteLine(Sample.Method());$$") - { - var input = $@" -using System; -using System.Linq; - -namespace Example -{{ - public class Program - {{ - public static void Main() - {{ - {mainContent} - }} - }} -}}".EnforceLF(); - - MarkupTestFile.GetPosition(input, out var output, out var position); - - return new Buffer( - "Program.cs", - output, - position ?? 0); - } - - private static string RemoveMachineSpecificPaths(string result) - { - var regex = new Regex($@"(""location"":\s*"")([^""]*[\\/]+)?([^""]*"")"); - - return regex.Replace(result, "$1$3"); - } - - private static Buffer ViewportCode(string methodContent = @"return ""Hello world!"";$$ ") - { - var input = $@" -using System.Collections.Generic; -using System; - -namespace Example -{{ - public static class Sample - {{ - public static object Method() - {{ -#region viewport - {methodContent} -#endregion - }} - }} -}}".EnforceLF(); - - MarkupTestFile.GetPosition(input, out var output, out var position); - - return new Buffer( - "ViewportCode.cs", - output, - position ?? 0); - } - } -} \ No newline at end of file diff --git a/MLS.Agent.Tests/ApiViaHttpTests.cs b/MLS.Agent.Tests/ApiViaHttpTests.cs deleted file mode 100644 index ffade7186..000000000 --- a/MLS.Agent.Tests/ApiViaHttpTests.cs +++ /dev/null @@ -1,1059 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.IO; -using System.Linq; -using System.Net; -using System.Net.Http; -using System.Text; -using System.Threading.Tasks; -using Clockwise; -using FluentAssertions; -using Pocket; -using Recipes; -using WorkspaceServer.Models.Execution; -using WorkspaceServer.Tests; -using Xunit; -using Xunit.Abstractions; -using static Pocket.Logger; -using MLS.Agent.CommandLine; -using FluentAssertions.Extensions; -using Microsoft.DotNet.Try.Protocol; -using Microsoft.DotNet.Try.Protocol.ClientApi; -using Microsoft.DotNet.Try.Protocol.Tests; -using Buffer = Microsoft.DotNet.Try.Protocol.Buffer; -using HtmlAgilityPack; -using System.Web; -using Microsoft.DotNet.Interactive.Utility; -using MLS.Agent.Controllers; -using CodeManipulation = WorkspaceServer.Tests.CodeManipulation; -using SourceFile = Microsoft.DotNet.Try.Protocol.ClientApi.SourceFile; -using MLS.Agent.Tools; -using MLS.Agent.Tools.Tests; -using WorkspaceServer.Packaging; -using Package = Microsoft.DotNet.Try.Protocol.Package; - -namespace MLS.Agent.Tests -{ - public class ApiViaHttpTests : ApiViaHttpTestsBase - { - public ApiViaHttpTests(ITestOutputHelper output) : base(output) - { - } - - [Fact] - public async Task The_workspace_snippet_endpoint_compiles_code_using_scripting_when_a_workspace_type_is_specified_as_script() - { - await Default.ConsoleWorkspace(); - - var output = Guid.NewGuid().ToString(); - - var requestJson = new WorkspaceRequest( - Workspace.FromSource( - source: $@"Console.WriteLine(""{output}"");".EnforceLF(), - workspaceType: "script" - ), - requestId: "TestRun").ToJson(); - - var response = await CallRun(requestJson); - - var result = await response - .EnsureSuccess() - .DeserializeAs(); - - VerifySucceeded(result); - - result.ShouldSucceedWithOutput(output); - } - - [Fact] - public async Task The_compile_endpoint_returns_bad_request_if_workspace_type_is_scripting() - { - await Default.ConsoleWorkspace(); - - var output = Guid.NewGuid().ToString(); - - var requestJson = new WorkspaceRequest( - Workspace.FromSource( - source: $@"Console.WriteLine(""{output}"");".EnforceLF(), - workspaceType: "script" - ), - requestId: "TestRun").ToJson(); - - var response = await CallCompile(requestJson); - - response.StatusCode.Should().Be(HttpStatusCode.BadRequest); - } - - [Fact] - public async Task The_workspace_endpoint_compiles_code_using_dotnet_when_a_non_script_workspace_type_is_specified() - { - await Default.ConsoleWorkspace(); - - var output = Guid.NewGuid().ToString(); - var requestJson = Create.SimpleWorkspaceRequestAsJson(output, "console"); - - var response = await CallRun(requestJson); - - var result = await response - .EnsureSuccess() - .DeserializeAs(); - - VerifySucceeded(result); - - result.ShouldSucceedWithOutput(output); - } - - [Fact] - public async Task The_workspace_endpoint_will_prevent_compiling_if_is_in_language_service_mode() - { - var output = Guid.NewGuid().ToString(); - var package = await PackageUtilities.Copy(await Default.ConsoleWorkspace()); - - var requestJson = Create.SimpleWorkspaceRequestAsJson(output, package.Name); - - var response = await CallRun(requestJson, options: new StartupOptions(true, true, string.Empty)); - - response.Should().BeNotFound(); - } - - [Fact] - public async Task When_a_non_script_workspace_type_is_specified_then_code_fragments_cannot_be_compiled_successfully() - { - await Default.ConsoleWorkspace(); - var requestJson = - new WorkspaceRequest( - Workspace.FromSource( - @"Console.WriteLine(""hello!"");", - workspaceType: "console", - id: "Program.cs")).ToJson(); - - var response = await CallRun(requestJson); - - var result = await response - .EnsureSuccess() - .DeserializeAs(); - - result.ShouldFailWithOutput( - "*Program.cs(1,1): error CS8400: Feature 'top-level statements' is not available in C# 8.0. Please use language version 9.0 or greater.*" - ); - } - - [Fact] - public async Task When_they_run_a_snippet_then_they_get_diagnostics_for_the_first_line() - { - await Default.ConsoleWorkspace(); - var output = Guid.NewGuid().ToString(); - - using (var agent = new AgentService()) - { - var json = - new WorkspaceRequest( - Workspace.FromSource( - $@"Console.WriteLine(""{output}""".EnforceLF(), - workspaceType: "script"), - requestId: "TestRun") - .ToJson(); - - var request = new HttpRequestMessage( - HttpMethod.Post, - @"/workspace/run") - { - Content = new StringContent( - json, - Encoding.UTF8, - "application/json") - }; - - var response = await agent.SendAsync(request); - - var result = await response - .EnsureSuccess() - .DeserializeAs(); - - var diagnostics = result.GetFeature(); - - diagnostics.Should().Contain(d => - d.Start == 56 && - d.End == 56 && - d.Message == "(1,57): error CS1026: ) expected" && - d.Id == "CS1026"); - } - } - - [Theory] - [InlineData("{}")] - [InlineData("{ \"workspace\" : { } }")] - [InlineData( /* buffers array is empty */ - "{\r\n \"workspace\": {\r\n \"workspaceType\": \"console\",\r\n \"files\": [],\r\n \"buffers\": [],\r\n \"usings\": []\r\n },\r\n \"activeBufferId\": \"\"\r\n}")] - [InlineData( /* no buffers property */ - "{\r\n \"workspace\": {\r\n \"workspaceType\": \"console\",\r\n \"files\": [],\r\n \"usings\": []\r\n },\r\n \"activeBufferId\": \"\"\r\n}")] - public async Task Sending_payload_that_deserialize_to_invalid_workspace_objects_results_in_BadRequest(string workspaceRequestBody) - { - var response = await CallRun(workspaceRequestBody); - - response.StatusCode.Should().Be(HttpStatusCode.BadRequest); - } - - [Theory] - [InlineData("{")] - [InlineData("")] - [InlineData("garbage 1235")] - public async Task Sending_payloads_that_cannot_be_deserialized_results_in_BadRequest(string content) - { - var response = await CallRun(content); - - response.StatusCode.Should().Be(HttpStatusCode.BadRequest); - } - - [Fact] - public async Task A_script_snippet_workspace_can_be_used_to_get_completions() - { - await Default.ConsoleWorkspace(); - - var (processed, position) = CodeManipulation.ProcessMarkup("Console.$$"); - using (var agent = new AgentService(StartupOptions.FromCommandLine("hosted"))) - { - var json = new WorkspaceRequest( - requestId: "TestRun", - activeBufferId: "default.cs", - workspace: Workspace.FromSource( - processed, - "script", - id: "default.cs", - position: position)) - .ToJson(); - - var request = new HttpRequestMessage( - HttpMethod.Post, - @"/workspace/completion") - { - Content = new StringContent( - json, - Encoding.UTF8, - "application/json") - }; - - var response = await agent.SendAsync(request); - - var result = await response - .EnsureSuccess() - .DeserializeAs(); - - result.Items.Should().ContainSingle(item => item.DisplayText == "WriteLine"); - } - } - - [Fact] - public async Task A_script_snippet_workspace_can_be_used_to_get_signature_help() - { - await Default.ConsoleWorkspace(); - var log = new LogEntryList(); - var (processed, position) = CodeManipulation.ProcessMarkup("Console.WriteLine($$)"); - using (LogEvents.Subscribe(log.Add)) - using (var agent = new AgentService()) - { - var json = new WorkspaceRequest( - requestId: "TestRun", - activeBufferId: "default.cs", - workspace: Workspace.FromSource( - processed, - "script", - id: "default.cs", - position: position)) - .ToJson(); - - var request = new HttpRequestMessage(HttpMethod.Post, @"/workspace/signaturehelp") - { - Content = new StringContent( - json, - Encoding.UTF8, - "application/json") - }; - - var response = await agent.SendAsync(request); - - var result = await response - .EnsureSuccess() - .DeserializeAs(); - result.Signatures.Should().NotBeNullOrEmpty(); - result.Signatures.Should().Contain(signature => signature.Label == "void Console.WriteLine(string format, params object[] arg)"); - } - } - - [Fact] - public async Task A_script_snippet_workspace_can_be_used_to_get_diagnostics() - { - await Default.ConsoleWorkspace(); - var log = new LogEntryList(); - var (processed, position) = CodeManipulation.ProcessMarkup("adddd"); - using (LogEvents.Subscribe(log.Add)) - using (var agent = new AgentService()) - { - var json = new WorkspaceRequest( - requestId: "TestRun", - activeBufferId: "default.cs", - workspace: Workspace.FromSource( - processed, - "script", - id: "default.cs", - position: position)) - .ToJson(); - - var request = new HttpRequestMessage(HttpMethod.Post, @"/workspace/diagnostics") - { - Content = new StringContent( - json, - Encoding.UTF8, - "application/json") - }; - - var response = await agent.SendAsync(request); - - var result = await response - .EnsureSuccess() - .DeserializeAs(); - result.Diagnostics.Should().NotBeNullOrEmpty(); - result.Diagnostics.Should().Contain(signature => signature.Message == "default.cs(1,1): error CS0103: The name \'adddd\' does not exist in the current context"); - } - } - - [Fact] - public async Task A_console_workspace_can_be_used_to_get_signature_help() - { - await Default.ConsoleWorkspace(); - #region bufferSources - - var program = @"using System; -using System.Linq; - -namespace FibonacciTest -{ - public class Program - { - public static void Main() - { - foreach (var i in FibonacciGenerator.Fibonacci().Take(20)) - { - Console.WriteLine(i); - } - } - } -}".EnforceLF(); - var generator = @"using System.Collections.Generic; -using System; -namespace FibonacciTest -{ - public static class FibonacciGenerator - { - public static IEnumerable Fibonacci() - { - int current = 1, next = 1; - while (true) - { - yield return current; - next = current + (current = next); - Console.WriteLine($$); - } - } - } -}".EnforceLF(); - #endregion - var (processed, position) = CodeManipulation.ProcessMarkup(generator); - var log = new LogEntryList(); - using (LogEvents.Subscribe(log.Add)) - using (var agent = new AgentService()) - { - var json = - new WorkspaceRequest(activeBufferId: "generators/FibonacciGenerator.cs", - requestId: "TestRun", - workspace: Workspace.FromSources( - workspaceType: "console", - language: "csharp", - ("Program.cs", program, 0), - ("generators/FibonacciGenerator.cs", processed, position) - )).ToJson(); - - var request = new HttpRequestMessage( - HttpMethod.Post, - @"/workspace/signaturehelp") - { - Content = new StringContent( - json, - Encoding.UTF8, - "application/json") - }; - - var response = await agent.SendAsync(request); - - var result = await response - .EnsureSuccess() - .DeserializeAs(); - result.Signatures.Should().NotBeNullOrEmpty(); - result.Signatures.Should().Contain(diagnostic => diagnostic.Label == "void Console.WriteLine(string format, params object[] arg)"); - } - } - - [Fact] - public async Task A_console_project_can_be_used_to_get_type_completion() - { - await Default.ConsoleWorkspace(); - #region bufferSources - - var program = @"using System; -using System.Linq; - -namespace FibonacciTest -{ - public class Program - { - public static void Main() - { - foreach (var i in FibonacciGenerator.Fibonacci().Take(20)) - { - Console.WriteLine(i); - } - } - } -}".EnforceLF(); - - var generator = @"using System.Collections.Generic; -using System; -namespace FibonacciTest -{ - public static class FibonacciGenerator - { - public static IEnumerable Fibonacci() - { - int current = 1, next = 1; - while (true) - { - yield return current; - next = current + (current = next); - Cons$$ - } - } - } -}".EnforceLF(); - - #endregion - var (processed, position) = CodeManipulation.ProcessMarkup(generator); - var log = new LogEntryList(); - using (LogEvents.Subscribe(log.Add)) - using (var agent = new AgentService()) - { - var json = - new WorkspaceRequest(activeBufferId: "generators/FibonacciGenerator.cs", - requestId: "TestRun", - workspace: Workspace.FromSources( - "console", - language: "csharp", - ("Program.cs", program, 0), - ("generators/FibonacciGenerator.cs", processed, position) - )).ToJson(); - - var request = new HttpRequestMessage( - HttpMethod.Post, - @"/workspace/completion") - { - Content = new StringContent( - json, - Encoding.UTF8, - "application/json") - }; - - var response = await agent.SendAsync(request); - - var result = await response - .EnsureSuccess() - .DeserializeAs(); - result.Items.Should().NotBeNullOrEmpty(); - result.Items.Should().Contain(completion => completion.SortText == "Console"); - } - } - - [Fact] - public async Task A_console_project_can_be_used_to_get_type_completion_with_a_space_in_the_name() - { - await Default.ConsoleWorkspace(); - #region bufferSources - - var program = @"using System; -using System.Linq; - -namespace FibonacciTest -{ - public class Program - { - public static void Main() - { - foreach (var i in FibonacciGenerator.Fibonacci().Take(20)) - { - Console.WriteLine(i); - } - } - } -}".EnforceLF(); - - var generator = @"using System.Collections.Generic; -using System; -namespace FibonacciTest -{ - public static class FibonacciGenerator - { - public static IEnumerable Fibonacci() - { - int current = 1, next = 1; - while (true) - { - yield return current; - next = current + (current = next); - Cons$$ - } - } - } -}".EnforceLF(); - - #endregion - var package = await PackageUtilities.Copy(await Default.ConsoleWorkspace(), "a space"); - var (processed, position) = CodeManipulation.ProcessMarkup(generator); - var log = new LogEntryList(); - using (LogEvents.Subscribe(log.Add)) - using (var agent = new AgentService()) - { - var json = - new WorkspaceRequest(activeBufferId: "generators/FibonacciGenerator.cs", - requestId: "TestRun", - workspace: Workspace.FromSources( - package.Name, - language: "csharp", - ("Program.cs", program, 0), - ("generators/FibonacciGenerator.cs", processed, position) - )).ToJson(); - - var request = new HttpRequestMessage( - HttpMethod.Post, - @"/workspace/completion") - { - Content = new StringContent( - json, - Encoding.UTF8, - "application/json") - }; - - var response = await agent.SendAsync(request); - - var result = await response - .EnsureSuccess() - .DeserializeAs(); - result.Items.Should().NotBeNullOrEmpty(); - result.Items.Should().Contain(completion => completion.SortText == "Console"); - } - } - - [Fact] - public async Task A_console_project_can_be_used_to_get_diagnostics() - { - await Default.ConsoleWorkspace(); - #region bufferSources - - var program = @"using System; -using System.Linq; - -namespace FibonacciTest -{ - public class Program - { - public static void Main() - { - foreach (var i in FibonacciGenerator.Fibonacci().Take(20)) - { - Console.WriteLine(i); - } - } - } -}".EnforceLF(); - - var generator = @"using System.Collections.Generic; -using System; -namespace FibonacciTest -{ - public static class FibonacciGenerator - { - public static IEnumerable Fibonacci() - { - int current = 1, next = 1; - while (true) - { - adddd - yield return current; - next = current + (current = next); - Cons$$ - } - } - } -}".EnforceLF(); - - #endregion - var (processed, position) = CodeManipulation.ProcessMarkup(generator); - var log = new LogEntryList(); - using (LogEvents.Subscribe(log.Add)) - using (var agent = new AgentService()) - { - var json = - new WorkspaceRequest(activeBufferId: "generators/FibonacciGenerator.cs", - requestId: "TestRun", - workspace: Workspace.FromSources( - "console", - language: "csharp", - ("Program.cs", program, 0), - ("generators/FibonacciGenerator.cs", processed, position) - )).ToJson(); - - var request = new HttpRequestMessage( - HttpMethod.Post, - @"/workspace/diagnostics") - { - Content = new StringContent( - json, - Encoding.UTF8, - "application/json") - }; - - var response = await agent.SendAsync(request); - - var result = await response - .EnsureSuccess() - .DeserializeAs(); - result.Diagnostics.Should().NotBeNullOrEmpty(); - result.Diagnostics.Should().Contain(diagnostic => diagnostic.Message == "generators/FibonacciGenerator.cs(12,17): error CS0246: The type or namespace name \'adddd\' could not be found (are you missing a using directive or an assembly reference?)"); - } - } - - [Fact(Skip = "WIP aspnet.webapi")] - public async Task When_aspnet_webapi_workspace_request_succeeds_then_output_shows_web_response() - { - var workspace = new Workspace(workspaceType: "aspnet.webapi", buffers: new[] { new Buffer("empty.cs", "") }); - var request = new WorkspaceRequest(workspace, httpRequest: new HttpRequest("/custom/values", "get"), requestId: "TestRun"); - - var json = request.ToJson(); - - var response = await CallRun(json); - - var result = await response - .EnsureSuccess() - .DeserializeAs(); - - Log.Info("output: {x}", result.Output); - - result.ShouldSucceedWithOutput( - "Status code: 200 OK", - "Content headers:", - " Date:*", - // the order of these two varies for some reason - " *", // e.g. Transfer-Encoding: chunked - " *", // e.g. Server: Kestrel - " Content-Type: application/json; charset=utf-8", - "Content:", - "[", - " \"value1\",", - " \"value2\"", - "]"); - } - - [Fact(Skip = "WIP aspnet.webapi")] - public async Task When_aspnet_webapi_workspace_request_succeeds_then_standard_out_is_available_on_response() - { - var package = await PackageUtilities.Copy(await Default.WebApiWorkspace()); - await package.CreateRoslynWorkspaceForRunAsync(new TimeBudget(10.Minutes())); - var workspace = WorkspaceFactory.CreateWorkspaceFromDirectory(package.Directory, package.Directory.Name); - - var request = new WorkspaceRequest(workspace, httpRequest: new HttpRequest("/custom/values", "get"), requestId: "TestRun"); - - var response = await CallRun(request.ToJson(), 30000); - - var result = await response - .EnsureSuccess() - .Content - .ReadAsStringAsync(); - - Log.Info("result: {x}", result); - - throw new NotImplementedException(); - } - - [Fact(Skip = "WIP aspnet.webapi")] - public async Task When_aspnet_webapi_workspace_request_fails_then_diagnostics_are_returned() - { - var package = await PackageUtilities.Copy(await Default.WebApiWorkspace()); - await package.CreateRoslynWorkspaceForRunAsync(new TimeBudget(10.Minutes())); - var workspace = WorkspaceFactory.CreateWorkspaceFromDirectory(package.Directory, package.Directory.Name); - var nonCompilingBuffer = new Buffer("broken.cs", "this does not compile", 0); - workspace = new Workspace( - buffers: workspace.Buffers.Concat(new[] { nonCompilingBuffer }).ToArray(), - files: workspace.Files.ToArray(), - workspaceType: workspace.WorkspaceType); - - var request = new WorkspaceRequest(workspace, httpRequest: new HttpRequest("/custom/values", "get"), requestId: "TestRun"); - - var response = await CallRun(request.ToJson(), null); - - var result = await response - .EnsureSuccess() - .DeserializeAs(); - - result.ShouldFailWithOutput("broken.cs(1,1): error CS1031: Type expected"); - } - - [Fact] - public async Task When_Run_times_out_in_console_workspace_server_code_then_the_response_code_is_504() - { - await Default.ConsoleWorkspace(); - var code = @"public class Program { public static void Main() { Console.WriteLine(); } }"; - - var workspace = Workspace.FromSource(code.EnforceLF(), "console"); - - var requestJson = new WorkspaceRequest(workspace).ToJson(); - - var response = await CallRun(requestJson, timeoutMs: 1); - - response.StatusCode.Should().Be(HttpStatusCode.GatewayTimeout); - } - - [Theory(Skip = "Test host changes make this difficult to test")] - [InlineData(@" - Console.WriteLine();")] - [InlineData(@" - public class Program { public static void Main()\n {\n Console.WriteLine(); } }")] - public async Task When_Run_times_out_in_script_workspace_server_code_then_the_response_code_is_504(string code) - { - var workspace = Workspace.FromSource(code.EnforceLF(), "script"); - - var requestJson = new WorkspaceRequest(workspace).ToJson(); - - var response = await CallRun(requestJson, timeoutMs: 1); - - response.StatusCode.Should().Be(HttpStatusCode.GatewayTimeout); - } - - [Theory] - [InlineData( - "console", - @" using System; - using System.Threading; - public class Program - { - public static void Main() - { - Console.WriteLine(""start user code.""); - Thread.Sleep(30000); - Console.WriteLine(""end user code.""); - } - }", Skip = "Not supported")] - [InlineData( - "script", - @"Console.WriteLine(""start user code.""); - System.Threading.Thread.Sleep(30000); - Console.WriteLine(""end user code."");")] - [InlineData( - "script", - @" public class Program - { - public static void Main() - { - Console.WriteLine(""start user code.""); - System.Threading.Thread.Sleep(30000); - Console.WriteLine(""end user code.""); - } - }")] - public async Task When_Run_times_out_in_user_code_then_the_response_code_is_417( - string workspaceType, - string code) - { - await Default.ConsoleWorkspace(); - Clock.Reset(); - - Workspace workspace = null; - if (workspaceType == "script") - { - workspace = Workspace.FromSource(code, "script"); - } - else - { - var package = Create.EmptyWorkspace(); - var build = await Create.NewPackage(package.Name, package.Directory, Create.ConsoleConfiguration); - workspace = Workspace.FromSource(code, build.Name); - } - - var requestJson = new WorkspaceRequest(workspace).ToJson(); - var response = await CallRun(requestJson, 10000); - - Log.Info("{response}", await response.Content.ReadAsStringAsync()); - - response.StatusCode.Should().Be(HttpStatusCode.ExpectationFailed); - } - - - [Fact] - public async Task Can_serve_blazor_console_code_runner() - { - using (var agent = new AgentService()) - { - var response = await agent.GetAsync(@"/LocalCodeRunner/blazor-console"); - - response.EnsureSuccess(); - var result = await response.Content.ReadAsStringAsync(); - result.Should().Contain("Loading..."); - } - } - - [Fact] - public async Task Can_serve_from_webassembly_controller() - { - var (name, addSource) = await Create.NupkgWithBlazorEnabled(); - using (var agent = new AgentService(new StartupOptions(addPackageSource: new PackageSource(addSource.FullName)))) - { - var response = await agent.GetAsync($@"/LocalCodeRunner/{name}"); - - response.EnsureSuccess(); - var result = await response.Content.ReadAsStringAsync(); - result.Should().Contain("Loading..."); - - response = await agent.GetAsync($@"/LocalCodeRunner/{name}/interop.js"); - - response.EnsureSuccess(); - result = await response.Content.ReadAsStringAsync(); - result.Should().Contain("invokeMethodAsync"); - } - - // Now do the same thing in hosted mode using the already installed package - using (var agent = new AgentService(StartupOptions.FromCommandLine("hosted"))) - { - var response = await agent.GetAsync($@"/LocalCodeRunner/{name}"); - - response.EnsureSuccess(); - var result = await response.Content.ReadAsStringAsync(); - result.Should().Contain("Loading..."); - - response = await agent.GetAsync($@"/LocalCodeRunner/{name}/interop.js"); - - response.EnsureSuccess(); - result = await response.Content.ReadAsStringAsync(); - result.Should().Contain("invokeMethodAsync"); - } - } - - [Fact] - public async Task Can_serve_nodatime_code_runner() - { - var registry = await Default.PackageRegistry.ValueAsync(); - var nodatime = await registry.Get("blazor-nodatime.api"); - - using (var agent = new AgentService(StartupOptions.FromCommandLine("hosted"))) - { - var response = await agent.GetAsync(@"/LocalCodeRunner/blazor-nodatime.api"); - - response.Should().BeSuccessful(); - var result = await response.Content.ReadAsStringAsync(); - result.Should().Contain("Loading..."); - } - } - - [Fact] - public async Task Can_extract_regions_from_files() - { - using (var agent = new AgentService()) - { - - var json = new CreateRegionsFromFilesRequest( - "testRun", - new[] { new SourceFile( - "program.cs", - "#region one\n#endregion\n#region two\nvar a = 1;\n#endregion") - }).ToJson(); - - var request = new HttpRequestMessage( - HttpMethod.Post, - @"/project/files/regions") - { - Content = new StringContent( - json, - Encoding.UTF8, - "application/json") - }; - - var response = await agent.SendAsync(request); - - var result = await response - .EnsureSuccess() - .DeserializeAs(); - - result.Should().NotBeNull(); - result.Regions.Should().Contain(p => p.Content == string.Empty && p.Id.Contains("one") && p.Id.Contains("program.cs")); - result.Regions.Should().Contain(p => p.Content == "var a = 1;" && p.Id.Contains("two") && p.Id.Contains("program.cs")); - } - } - - [Fact] - public async Task Returns_200_if_the_package_exists() - { - await Default.ConsoleWorkspace(); - var packageVersion = "1.0.0"; - - using (var agent = new AgentService()) - { - var response = await agent.GetAsync($@"/packages/console/{packageVersion}"); - response.StatusCode.Should().Be(HttpStatusCode.OK); - } - } - - [Fact] - public async Task Returns_404_if_the_package_does_not_exist() - { - var packageName = Guid.NewGuid().ToString(); - var packageVersion = "1.0.0"; - - using (var agent = new AgentService()) - { - var response = await agent.GetAsync($@"/packages/{packageName}/{packageVersion}"); - response.StatusCode.Should().Be(HttpStatusCode.NotFound); - } - } - - [Fact] - public async Task Returns_IsWasmSupported_false_if_the_package_does_not_contain_wasm_runner() - { - await Default.ConsoleWorkspace(); - var packageVersion = "1.0.0"; - - using (var agent = new AgentService()) - { - var response = await agent.GetAsync($@"/packages/console/{packageVersion}"); - response.Should().BeSuccessful(); - var result = await response.Content.ReadAsStringAsync(); - result.FromJsonTo() - .IsWasmSupported - .Should() - .BeFalse(); - } - } - - [Fact(Skip = "flaky in signed build")] - public async Task Returns_IsWasmSupported_true_if_the_package_contains_wasm_runner() - { - var package = await Create.InstalledPackageWithBlazorEnabled(); - var packageVersion = "1.0.0"; - - using (var agent = new AgentService()) - { - var response = await agent.GetAsync($"/packages/{package.Name}/{packageVersion}"); - response.Should().BeSuccessful(); - var result = await response.Content.ReadAsStringAsync(); - result.FromJsonTo() - .IsWasmSupported - .Should() - .BeTrue(); - } - } - - [Fact] - public async Task Embeddable_returns_referrer() - { - using (var agent = new AgentService()) - { - var referrer = "http://coolreferrer"; - var response = await agent.GetAsync(@"/ide", referrer); - - response.EnsureSuccess(); - var html = await response.Content.ReadAsStringAsync(); - - var document = new HtmlDocument(); - document.LoadHtml(html); - - var script = document.DocumentNode - .Descendants("script") - .FirstOrDefault(s => s.Attributes["id"]?.Value == "bundlejs"); - - script.Should().NotBeNull(); - - var additionalParameters = script.Attributes["data-client-parameters"]; - - additionalParameters.Should().NotBeNull(); - - var json = HttpUtility.HtmlDecode(additionalParameters.Value); - - var paramsObject = json.FromJsonTo(); - - paramsObject.Referrer.Should().Be(new Uri(referrer)); - } - } - - [Fact] - public async Task Scaffolding_HTML_trydotnet_js_autoEnable_useWasmRunner_is_true_when_package_is_specified_and_supports_Wasm() - { - var (name, addSource) = await Create.NupkgWithBlazorEnabled("packageName"); - - var startupOptions = new StartupOptions( - rootDirectory: new FileSystemDirectoryAccessor(TestAssets.SampleConsole), - addPackageSource: new PackageSource(addSource.FullName), - package: name); - - using (var agent = new AgentService(startupOptions)) - { - var response = await agent.GetAsync(@"/Subdirectory/Tutorial.md"); - - response.Should().BeSuccessful(); - - var html = await response.Content.ReadAsStringAsync(); - - var document = new HtmlDocument(); - document.LoadHtml(html); - - var scripts = document.DocumentNode - .Descendants("body") - .Single() - .Descendants("script") - .Select(s => s.InnerHtml); - - scripts.Should() - .Contain(s => s.Contains(@"trydotnet.autoEnable({ apiBaseAddress: new URL(""http://localhost""), useWasmRunner: true });")); - } - } - - [Fact] - public async Task Is_able_to_serve_static_files() - { - using (var disposableDirectory = DisposableDirectory.Create()) - { - System.IO.File.WriteAllText(Path.Combine(disposableDirectory.Directory.FullName, "a.js"), "alert('This is an alert from javascript');"); - var options = new StartupOptions(rootDirectory: new FileSystemDirectoryAccessor(disposableDirectory.Directory)); - - using (var agent = new AgentService(options: options)) - { - var response = await agent.GetAsync(@"/a.js"); - - response.Should().BeSuccessful(); - response.Content.Headers.ContentType.MediaType.Should().Be("application/javascript"); - var html = await response.Content.ReadAsStringAsync(); - html.Should().Be("alert('This is an alert from javascript');"); - } - } - } - - private class FailedRunResult : Exception - { - internal FailedRunResult(string message) : base(message) - { - } - } - - private void VerifySucceeded(RunResult runResult) - { - if (!runResult.Succeeded) - { - throw new FailedRunResult(runResult.ToString()); - } - } - } -} diff --git a/MLS.Agent.Tests/ApiViaHttpTestsBase.cs b/MLS.Agent.Tests/ApiViaHttpTestsBase.cs deleted file mode 100644 index 9e97f2346..000000000 --- a/MLS.Agent.Tests/ApiViaHttpTestsBase.cs +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Net.Http; -using System.Text; -using System.Threading.Tasks; -using Clockwise; -using MLS.Agent.CommandLine; -using Pocket; -using Xunit.Abstractions; - -namespace MLS.Agent.Tests -{ - public abstract class ApiViaHttpTestsBase : IDisposable - { - private readonly CompositeDisposable _disposables = new CompositeDisposable(); - - protected ApiViaHttpTestsBase(ITestOutputHelper output) - { - _disposables.Add(output.SubscribeToPocketLogger()); - _disposables.Add(VirtualClock.Start()); - EnsureConsoleWorkspaceCreated(); - } - - private void EnsureConsoleWorkspaceCreated() - { - Task.Run(() => WorkspaceServer.Tests.Default.PackageRegistry.ValueAsync()).Wait(); - } - - public void Dispose() => _disposables.Dispose(); - - protected static Task CallCompletion( - string requestBody, - int? timeoutMs = null) => - Call("/workspace/completion", - requestBody, - timeoutMs); - - protected static Task CallRun( - string requestBody, - int? timeoutMs = null, - StartupOptions options = null) => - Call("/workspace/run", - requestBody, - timeoutMs, - options); - - protected static Task CallCompile( - string requestBody, - int? timeoutMs = null, - StartupOptions options = null) => - Call("/workspace/compile", - requestBody, - timeoutMs, - options); - - protected static Task CallSignatureHelp( - string requestBody, - int? timeoutMs = null) => - Call("/workspace/signaturehelp", - requestBody, - timeoutMs); - - private static async Task Call( - string relativeUrl, - string requestBody, - int? timeoutMs = null, - StartupOptions options = null) - { - HttpResponseMessage response; - using (var agent = new AgentService(options ?? StartupOptions.FromCommandLine("hosted"))) - { - var request = new HttpRequestMessage( - HttpMethod.Post, - relativeUrl) - { - Content = new StringContent( - requestBody, - Encoding.UTF8, - "application/json") - }; - - if (timeoutMs != null) - { - request.Headers.Add("Timeout", timeoutMs.Value.ToString("F0")); - } - - response = await agent.SendAsync(request); - } - - return response; - } - } -} diff --git a/MLS.Agent.Tests/CommandLine/CommandLineParserTests.cs b/MLS.Agent.Tests/CommandLine/CommandLineParserTests.cs deleted file mode 100644 index 6cff7c8f7..000000000 --- a/MLS.Agent.Tests/CommandLine/CommandLineParserTests.cs +++ /dev/null @@ -1,435 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.CommandLine.IO; -using System.CommandLine.Parsing; -using System.IO; -using System.Threading.Tasks; -using FluentAssertions; -using Microsoft.DotNet.Interactive.Telemetry; -using Microsoft.Extensions.DependencyInjection; -using MLS.Agent.CommandLine; -using MLS.Agent.Tools; -using WorkspaceServer.Packaging; -using Xunit; -using Xunit.Abstractions; - -namespace MLS.Agent.Tests.CommandLine -{ - public class CommandLineParserTests : IDisposable - { - private readonly ITestOutputHelper _output; - private readonly TestConsole _console = new TestConsole(); - private StartupOptions _startOptions; - private readonly Parser _parser; - private TryGitHubOptions _tryGitHubOptions; - private PackOptions _packOptions; - private InstallOptions _installOptions; - private PackageSource _installPackageSource; - private VerifyOptions _verifyOptions; - private DemoOptions _demoOptions; - private PublishOptions _publishOptions; - - public CommandLineParserTests(ITestOutputHelper output) - { - _output = output; - - _parser = CommandLineParser.Create( - new ServiceCollection(), - startServer: (options, invocationContext) => - { - _startOptions = options; - }, - demo: (options, console, context, startOptions) => - { - _demoOptions = options; - return Task.CompletedTask; - }, - tryGithub: (options, c) => - { - _tryGitHubOptions = options; - return Task.CompletedTask; - }, - pack: (options, console) => - { - _packOptions = options; - return Task.CompletedTask; - }, - install: (options, console) => - { - _installOptions = options; - _installPackageSource = options.AddSource; - return Task.CompletedTask; - }, - verify: (options, console, startupOptions, context) => - { - _verifyOptions = options; - return Task.FromResult(0); - }, - telemetry: new FakeTelemetry(), - publish: (options, console, startupOptions, context) => - { - _publishOptions = options; - return Task.FromResult(0); - }, - firstTimeUseNoticeSentinel: new NopFirstTimeUseNoticeSentinel()); - } - - public void Dispose() - { - _output.WriteLine(_console.Error.ToString()); - } - - [Fact] - public async Task Parse_empty_command_line_has_sane_defaults() - { - await _parser.InvokeAsync("hosted", _console); - - _startOptions.Production.Should().BeFalse(); - } - - [Fact] - public async Task Parse_production_mode_flag_switches_option_to_production() - { - await _parser.InvokeAsync("hosted --production", _console); - - _startOptions.Production.Should().BeTrue(); - } - - [Fact] - public async Task Parse_root_directory_with_a_valid_path_succeeds() - { - var path = Directory.GetCurrentDirectory(); - await _parser.InvokeAsync(new[] { path }, _console); - _startOptions.RootDirectory.GetFullyQualifiedRoot().FullName.Should().Be(path + Path.DirectorySeparatorChar); - } - - [Fact] - public async Task It_parses_log_output_directory() - { - var logPath = new DirectoryInfo(Path.GetTempPath()); - - await _parser.InvokeAsync($"--log-path {logPath}", _console); - - _startOptions - .LogPath - .FullName - .Should() - .Be(logPath.FullName); - } - - [Fact] - public async Task It_parses_verbose_option() - { - await _parser.InvokeAsync($"--verbose", _console); - - _startOptions - .Verbose - .Should() - .BeTrue(); - } - - [Fact] - public async Task It_parses_the_package_option() - { - await _parser.InvokeAsync("--package console", _console); - - _startOptions - .Package - .Should() - .Be("console"); - } - - [Fact] - public async Task It_parses_the_package_version_option() - { - await _parser.InvokeAsync("--package-version 1.2.3-beta", _console); - - _startOptions - .PackageVersion - .Should() - .Be("1.2.3-beta"); - } - - [Fact] - public async Task Parse_empty_command_line_has_current_directory_as_root_directory() - { - await _parser.InvokeAsync("", _console); - _startOptions.RootDirectory.GetFullyQualifiedRoot().FullName.Should().Be(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar); - } - - [Fact] - public async Task Parse_root_directory_with_a_non_existing_path_fails() - { - await _parser.InvokeAsync("INVALIDPATH", _console); - _startOptions.Should().BeNull(); - _console.Error.ToString().Should().Match("*Directory does not exist: INVALIDPATH*"); - } - - [Fact] - public async Task Parse_uri_workspace() - { - await _parser.InvokeAsync("--uri https://google.com/foo.md", _console); - _startOptions.Uri.Should().Be("https://google.com/foo.md"); - } - - [Fact] - public async Task Parse_enable_preview_features_flag() - { - await _parser.InvokeAsync("--enable-preview-features", _console); - _startOptions.EnablePreviewFeatures.Should().BeTrue(); - } - - [Fact] - public async Task Parse_language_service_mode_flag_switches_option_to_language_service() - { - await _parser.InvokeAsync("hosted --language-service", _console); - _startOptions.IsLanguageService.Should().BeTrue(); - } - - [Fact] - public void Parse_key_without_parameter_fails_the_parse() - { - _parser.Parse("hosted -k") - .Errors - .Should() - .Contain(e => e.Message == "Required argument missing for option: -k"); - - _parser.Parse("hosted --key") - .Errors - .Should() - .Contain(e => e.Message == "Required argument missing for option: --key"); - } - - [Fact] - public async Task Parse_key_with_parameter_succeeds() - { - await _parser.InvokeAsync("hosted -k abc123", _console); - _startOptions.Key.Should().Be("abc123"); - - await _parser.InvokeAsync("hosted --key abc123", _console); - _startOptions.Key.Should().Be("abc123"); - } - - [Fact] - public async Task AiKey_defaults_to_null() - { - await _parser.InvokeAsync("hosted", _console); - _startOptions.ApplicationInsightsKey.Should().BeNull(); - } - - [Fact] - public async Task Parses_the_port() - { - await _parser.InvokeAsync("--port 6000", _console); - _startOptions.Port.Should().Be(6000); - } - - [Fact] - public void Negative_port_fails_the_parse() - { - _parser.Parse("--port -8090") - .Errors - .Should() - .Contain(e => e.Message == "Invalid argument for --port option"); - } - - [Fact] - public void Parse_application_insights_key_without_parameter_fails_the_parse() - { - var result = _parser.Parse("hosted --ai-key"); - - result.Errors.Should().Contain(e => e.Message == "Required argument missing for option: --ai-key"); - } - - [Fact] - public async Task Parse_aiKey_with_parameter_succeeds() - { - await _parser.InvokeAsync("hosted --ai-key abc123", _console); - _startOptions.ApplicationInsightsKey.Should().Be("abc123"); - } - - [Fact] - public async Task When_root_command_is_specified_then_agent_is_in_try_mode() - { - await _parser.InvokeAsync("", _console); - _startOptions.Mode.Should().Be(StartupMode.Try); - } - - [Fact] - public async Task When_hosted_command_is_specified_then_agent_is_in_hosted_mode() - { - await _parser.InvokeAsync("hosted", _console); - _startOptions.Mode.Should().Be(StartupMode.Hosted); - } - - [Fact] - public async Task GitHub_handler_not_run_if_argument_is_missing() - { - await _parser.InvokeAsync("github", _console); - _tryGitHubOptions.Should().BeNull(); - } - - [Fact] - public async Task GitHub_handler_run_if_argument_is_present() - { - await _parser.InvokeAsync("github roslyn", _console); - _tryGitHubOptions.Repo.Should().Be("roslyn"); - } - - [Fact] - public async Task Pack_not_run_if_argument_is_missing() - { - var console = new TestConsole(); - await _parser.InvokeAsync("pack", console); - console.Out.ToString().Should().Contain("pack [options] "); - _packOptions.Should().BeNull(); - } - - [Fact] - public async Task Pack_parses_directory_info() - { - var console = new TestConsole(); - var expected = Path.GetDirectoryName(typeof(PackCommand).Assembly.Location); - - await _parser.InvokeAsync($"pack {expected}", console); - _packOptions.PackTarget.FullName.Should().Be(expected); - _packOptions.EnableWasm.Should().Be(false); - } - - [Fact] - public async Task Pack_parses_version() - { - var console = new TestConsole(); - var directoryName = Path.GetDirectoryName(typeof(PackCommand).Assembly.Location); - var expectedVersion = "2.0.0"; - - await _parser.InvokeAsync($"pack {directoryName} --version {expectedVersion}", console); - _packOptions.Version.Should().Be(expectedVersion); - } - - [Fact] - public async Task Pack_parses_enable_wasm() - { - var console = new TestConsole(); - var directoryName = Path.GetDirectoryName(typeof(PackCommand).Assembly.Location); - - await _parser.InvokeAsync($"pack {directoryName} --enable-wasm", console); - _packOptions.EnableWasm.Should().Be(true); - } - - [Fact] - public async Task Install_not_run_if_argument_is_missing() - { - var console = new TestConsole(); - await _parser.InvokeAsync("install", console); - console.Out.ToString().Should().Contain("install [options] "); - _installOptions.Should().BeNull(); - } - - [Fact] - public async Task Install_parses_source_option() - { - var console = new TestConsole(); - - var expectedPackageSource = Path.GetDirectoryName(typeof(PackCommand).Assembly.Location); - - await _parser.InvokeAsync($"install --add-source {expectedPackageSource} the-package", console); - - _installOptions.PackageName.Should().Be("the-package"); - _installPackageSource.ToString().Should().Be(expectedPackageSource); - } - - [Fact] - public async Task Verify_argument_specifies_root_directory() - { - var directory = Path.GetDirectoryName(typeof(VerifyCommand).Assembly.Location); - - await _parser.InvokeAsync($"verify {directory}", _console); - - _verifyOptions.RootDirectory - .GetFullyQualifiedRoot() - .FullName - .Should() - .Be(directory + Path.DirectorySeparatorChar); - } - - [Fact] - public async Task Verify_takes_current_directory_as_default_if_none_is_specified() - { - await _parser.InvokeAsync($"verify", _console); - - _verifyOptions.RootDirectory - .GetFullyQualifiedRoot() - .FullName - .Should() - .Be(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar); - } - - [Fact] - public async Task Demo_allows_output_path_to_be_specified() - { - var expected = Path.GetTempPath(); - - await _parser.InvokeAsync($"demo --output {expected}", _console); - - _demoOptions - .Output - .FullName - .Should() - .Be(expected); - } - - [Fact] - public async Task Publish_root_directory_defaults_to_current_directory() - { - await _parser.InvokeAsync("publish", _console); - - _publishOptions - .RootDirectory - .GetFullyQualifiedRoot() - .FullName - .Should() - .Be(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar); - } - - [Fact] - public async Task Publish_target_directory_defaults_to_root_directory() - { - var rootDir = Path.GetTempPath(); - - await _parser.InvokeAsync($"publish {rootDir}", _console); - - _publishOptions - .TargetDirectory - .GetFullyQualifiedRoot() - .FullName - .Should() - .Be(rootDir); - } - - [Fact] - public async Task Publish_can_specify_source_and_target_directory() - { - var rootDir = Path.GetTempPath(); - var targetDir = Path.Combine(Path.GetTempPath(), "target"); - - await _parser.InvokeAsync($"publish --target-directory {targetDir} {rootDir}", _console); - - _publishOptions - .RootDirectory - .GetFullyQualifiedRoot() - .FullName - .Should() - .Be(rootDir); - - _publishOptions - .TargetDirectory - .GetFullyQualifiedRoot() - .FullName - .Should() - .Be(targetDir + Path.DirectorySeparatorChar); - } - } -} \ No newline at end of file diff --git a/MLS.Agent.Tests/CommandLine/DemoCommandTests.cs b/MLS.Agent.Tests/CommandLine/DemoCommandTests.cs deleted file mode 100644 index fb50c3459..000000000 --- a/MLS.Agent.Tests/CommandLine/DemoCommandTests.cs +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.CommandLine.IO; -using System.IO; -using System.Threading.Tasks; -using FluentAssertions; -using MLS.Agent.CommandLine; -using MLS.Agent.Tools; -using WorkspaceServer.Tests; -using Xunit; -using Xunit.Abstractions; - -namespace MLS.Agent.Tests.CommandLine -{ - public class DemoCommandTests - { - private readonly ITestOutputHelper _output; - - public DemoCommandTests(ITestOutputHelper output) - { - _output = output; - } - - [Fact] - public async Task Demo_project_passes_verification() - { - var console = new TestConsole(); - - var outputDirectory = Create.EmptyWorkspace().Directory; - var packageFile = outputDirectory.Subdirectory("Snippets") - .File("Snippets.csproj"); - - await DemoCommand.Do(new DemoOptions(output: outputDirectory), console); - - var resultCode = await VerifyCommand.Do( - new VerifyOptions(new FileSystemDirectoryAccessor(outputDirectory)), - console, - startupOptions: new StartupOptions(package: packageFile.FullName)); - - _output.WriteLine(console.Out.ToString()); - _output.WriteLine(console.Error.ToString()); - - resultCode.Should().Be(0); - } - - [Fact] - public async Task Demo_sources_pass_verification() - { - var console = new TestConsole(); - - var demoSourcesDir = Create.EmptyWorkspace().Directory; - var packageFile = demoSourcesDir.Subdirectory("Snippets") - .File("Snippets.csproj"); - - _output.WriteLine(demoSourcesDir.FullName); - _output.WriteLine(packageFile.FullName); - - await DemoCommand.Do(new DemoOptions(output: demoSourcesDir), console); - - var resultCode = await VerifyCommand.Do( - new VerifyOptions(new FileSystemDirectoryAccessor(demoSourcesDir)), - console); - - _output.WriteLine(console.Out.ToString()); - _output.WriteLine(console.Error.ToString()); - - resultCode.Should().Be(0); - } - - [Fact] - public async Task Demo_creates_the_output_directory_if_it_does_not_exist() - { - var console = new TestConsole(); - - var outputDirectory = new DirectoryInfo( - Path.Combine( - Create.EmptyWorkspace().Directory.FullName, - Guid.NewGuid().ToString("N"))); - - await DemoCommand.Do( - new DemoOptions(output: outputDirectory), - console, - startServer: (options, context) => { }); - - outputDirectory.Refresh(); - - outputDirectory.Exists.Should().BeTrue(); - } - - [Fact] - public async Task Demo_returns_an_error_if_the_output_directory_is_not_empty() - { - var console = new TestConsole(); - - var outputDirectory = Create.EmptyWorkspace().Directory; - - File.WriteAllText(Path.Combine(outputDirectory.FullName, "a file.txt"), ""); - - await DemoCommand.Do( - new DemoOptions(output: outputDirectory), - console, - startServer: (options, context) => { }); - - var resultCode = await VerifyCommand.Do( - new VerifyOptions(new FileSystemDirectoryAccessor(outputDirectory)), - console); - - resultCode.Should().NotBe(0); - } - - [Fact] - public async Task Demo_starts_the_server_if_there_are_no_errors() - { - var console = new TestConsole(); - - var outputDirectory = Create.EmptyWorkspace().Directory; - - StartupOptions startupOptions = null; - await DemoCommand.Do( - new DemoOptions(output: outputDirectory), - console, - (options, context) => startupOptions = options); - - await VerifyCommand.Do( - new VerifyOptions(new FileSystemDirectoryAccessor(outputDirectory)), - console); - - _output.WriteLine(console.Out.ToString()); - _output.WriteLine(console.Error.ToString()); - - startupOptions.Uri.Should().Be(new Uri("QuickStart.md", UriKind.Relative)); - } - } -} \ No newline at end of file diff --git a/MLS.Agent.Tests/CommandLine/GitHubCommandTests.cs b/MLS.Agent.Tests/CommandLine/GitHubCommandTests.cs deleted file mode 100644 index d920d3bef..000000000 --- a/MLS.Agent.Tests/CommandLine/GitHubCommandTests.cs +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.Collections.Generic; -using System.CommandLine.IO; -using System.Threading.Tasks; -using FluentAssertions; -using MLS.Agent.CommandLine; -using MLS.Repositories; -using Xunit; - -namespace MLS.Agent.Tests.CommandLine -{ - public class GitHubCommandTests - { - private readonly IRepoLocator _locator = new RepoLocatorSimulator(); - - class TestRepoLocator : IRepoLocator - { - private readonly IEnumerable _repos; - - - public TestRepoLocator(IEnumerable repos) - { - _repos = repos; - } - - public Task> LocateRepo(string repo) - { - return Task.FromResult(_repos); - } - } - - [Fact] - public async Task It_reports_no_matches() - { - var console = new TestConsole(); - await GitHubHandler.Handler(new TryGitHubOptions("foo"), console, _locator); - console.Out.ToString().Replace("\r\n", "\n") - .Should().Be("Didn't find any repos called `foo`\n"); - - } - - [Fact] - public async Task It_finds_the_requested_repo() - { - var console = new TestConsole(); - await GitHubHandler.Handler(new TryGitHubOptions("rchande/2660eaec-6af8-452d-b70d-41227d616cd9"), console, _locator); - console.Out.ToString().Replace("\r\n", "\n"). - Should().Be("Found repo `rchande/2660eaec-6af8-452d-b70d-41227d616cd9`\nTo try `rchande/2660eaec-6af8-452d-b70d-41227d616cd9`, cd to your desired directory and run the following command:\n\n\tgit clone https://github.com/rchande/2660eaec-6af8-452d-b70d-41227d616cd9.git && dotnet try .\n"); - - } - - [Fact] - public async Task It_asks_for_disambiguation() - { - var console = new TestConsole(); - await GitHubHandler.Handler(new TryGitHubOptions("rchande/tribble"), console, _locator); - console.Out.ToString().Replace("\r\n", "\n").Should() - .Be("Which of the following did you mean?\n\trchande/upgraded-octo-tribble.\n\trchande/downgraded-octo-tribble.\n"); - } - } -} diff --git a/MLS.Agent.Tests/CommandLine/PackCommandTests.cs b/MLS.Agent.Tests/CommandLine/PackCommandTests.cs deleted file mode 100644 index 56fb707cd..000000000 --- a/MLS.Agent.Tests/CommandLine/PackCommandTests.cs +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.CommandLine.IO; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using FluentAssertions; -using Microsoft.DotNet.Interactive.Utility; -using MLS.Agent.CommandLine; -using MLS.Agent.Tools; -using WorkspaceServer.Packaging; -using WorkspaceServer.Tests; -using Xunit; - -namespace MLS.Agent.Tests.CommandLine -{ - public class PackCommandTests - { - [Fact] - public async Task Pack_project_creates_a_nupkg_with_passed_version() - { - var asset = await Create.NetstandardWorkspaceCopy(); - - var console = new TestConsole(); - - await PackCommand.Do(new PackOptions(asset.Directory, "3.4.5"), console); - - asset.Directory - .GetFiles() - .Should() - .Contain(f => f.Name.Contains("3.4.5.nupkg")); - } - - [Fact] - public async Task Pack_project_works_with_blazor() - { - var asset = await Create.NetstandardWorkspaceCopy(); - - var console = new TestConsole(); - - await PackCommand.Do(new PackOptions(asset.Directory, enableWasm: true), console); - - asset.Directory - .GetFiles() - .Should() - .Contain(f => f.Name.Contains("nupkg")); - } - - [Fact] - public async Task Pack_project_blazor_contents() - { - var asset = await Create.NetstandardWorkspaceCopy(); - - var packageName = Path.GetFileNameWithoutExtension(asset.Directory.GetFiles("*.csproj").First().Name); - - var console = new TestConsole(); - - await PackCommand.Do(new PackOptions(asset.Directory, enableWasm: true), console); - - asset.Directory - .GetFiles() - .Should() - .Contain(f => f.Name.Contains("nupkg")); - - var dotnet = new Dotnet(asset.Directory); - - var result = await dotnet.ToolInstall(packageName, asset.Directory, new PackageSource(asset.Directory.FullName).ToString()); - - var exe = Path.Combine(asset.Directory.FullName, packageName); - - var tool = WorkspaceServer.WorkspaceFeatures.PackageTool.TryCreateFromDirectory(packageName, new FileSystemDirectoryAccessor(asset.Directory)); - - await tool.Prepare(); - - var wasmDirectory = await tool.LocateWasmAsset(); - wasmDirectory.Should().NotBeNull(); - - } - - } -} diff --git a/MLS.Agent.Tests/CommandLine/PublishCommandTests.cs b/MLS.Agent.Tests/CommandLine/PublishCommandTests.cs deleted file mode 100644 index 39e12c0b2..000000000 --- a/MLS.Agent.Tests/CommandLine/PublishCommandTests.cs +++ /dev/null @@ -1,246 +0,0 @@ -using System.Collections.Generic; -using System.CommandLine.IO; -using System.IO; -using System.Linq; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using FluentAssertions; -using Microsoft.DotNet.Try.Protocol.Tests; -using MLS.Agent.CommandLine; -using MLS.Agent.Tools; -using MLS.Agent.Tools.Tests; -using WorkspaceServer.Tests; -using Xunit; -using Xunit.Abstractions; - -namespace MLS.Agent.Tests.CommandLine -{ - public class PublishCommandTests - { - private const string CsprojContents = @" - - netcoreapp3.1 - Exe - - -"; - - private const string CompilingProgramWithRegionCs = @" -using System; - -public class Program -{ - public static void Main(string[] args) - { - #region null_coalesce - var length = (args[0] as string)?.Length ?? 0; - #endregion - - #region userCodeRegion - #endregion - } -}"; - - public class WithMarkdownOutputFormat : WithPublish - { - public WithMarkdownOutputFormat(ITestOutputHelper output) : base(output) {} - - [Theory] - [InlineData("##Title")] - [InlineData("markdown with line\r\nbreak")] - [InlineData("markdown with linux line\nbreak")] - [InlineData("[link](https://try.dot.net/)")] - public async Task When_there_are_no_code_fence_annotations_markdown_is_unchanged(string markdown) - { - var files = PrepareFiles( - ("doc.md", markdown) - ); - - var (publishOutput, resultCode) = await DoPublish(files); - - resultCode.Should().Be(0); - publishOutput.OutputFiles.Single().Content.Should().Be(markdown.EnforceLF()); - } - - [Theory] - [InlineData(@" -## C# null coalesce example -``` cs --source-file ./project/Program.cs --region null_coalesce --project ./project/some.csproj -``` -")] [InlineData(@" -## C# null coalesce example -``` cs --source-file ./project/Program.cs --region null_coalesce --project ./project/some.csproj - var length = some buggy c# example code - -``` -")] - public async Task When_there_are_code_fence_annotations_in_markdown_content_of_the_fenced_section_is_replaced_with_the_project_code(string markdown) - { - var files = PrepareFiles( - ("./folder/project/some.csproj", CsprojContents), - ("./folder/project/Program.cs", CompilingProgramWithRegionCs), - ("./folder/doc.md", markdown) - ); - - var (publishOutput, resultCode) = await DoPublish(files); - - resultCode.Should().Be(0); - MarkdownShouldBeEquivalent(publishOutput.OutputFiles.Single().Content, @" -## C# null coalesce example -``` cs --source-file ./project/Program.cs --region null_coalesce --project ./project/some.csproj -var length = (args[0] as string)?.Length ?? 0; -``` -"); - } - - [Theory] - [InlineData(@" -``` cs --source-file ./project/Program.cs --region the_region --project ./project/some.csproj --session one -Console.WriteLine(""hello!""); -``` -``` console --session one -``` -")] - [InlineData(@" -``` cs --source-file ./project/Program.cs --region the_region --project ./project/some.csproj --session one -Console.WriteLine(""hello!""); -``` -``` console --session one -pre-existing text -``` -")] - public async Task Content_of_console_annotated_blocks_is_replaced_by_code_output(string markdown) - { - var files = PrepareFiles( - ("./project/some.csproj", CsprojContents), - ("./project/Program.cs", @" -using System; - -public class Program -{ - public static void Main(string[] args) - { - #region the_region - Console.WriteLine(""hello!""); - #endregion - } -}"), - ("./doc.md", markdown)); - - var (publishOutput, resultCode) = await DoPublish(files); - - resultCode.Should().Be(0); - - publishOutput.OutputFiles - .Single() - .Content - .Should() - .Contain(@" -``` console --session one -hello! - -```".EnforceLF()); - } - - [Fact] - public async Task When_target_directory_is_sub_directory_of_source_then_markdown_files_in_target_dir_are_not_used_as_sources() - { - const string markdown = @" -## C# null coalesce example -``` cs --source-file ./../../project/Program.cs --region null_coalesce --project ./../../project/some.csproj -``` -"; - var files = PrepareFiles( - ("./project/some.csproj", CsprojContents), - ("./project/Program.cs", CompilingProgramWithRegionCs), - ("./documentation/details/doc.md", markdown), - ("./doc_output/details/doc.md", "result file of previous publish run, will be overridden when publishing docs and should be ignored as source") - ); - - var targetDir = (DirectoryInfo)files.GetFullyQualifiedPath(new RelativeDirectoryPath("doc_output")); - var target = new InMemoryDirectoryAccessor(targetDir); - - var (publishOutput, resultCode) = await DoPublish(files, target); - - resultCode.Should().Be(0); - publishOutput.OutputFiles.Count().Should().Be(1, "Expected existing file in doc_output to be ignored"); - var outputFilePath = new FileInfo(publishOutput.OutputFiles.Single().Path); - var expectedFilePath = target.GetFullyQualifiedPath(new RelativeFilePath("documentation/details/doc.md")); - - outputFilePath.FullName.Should().Be(expectedFilePath.FullName); - } - } - - public abstract class WithPublish - { - private static PublishOptions Options(IDirectoryAccessor source, IDirectoryAccessor target = null) => new PublishOptions(source, target ?? source, PublishFormat.Markdown); - - private readonly ITestOutputHelper _output; - - protected WithPublish(ITestOutputHelper output) => _output = output; - - protected static IDirectoryAccessor PrepareFiles( - params (string path, string content)[] files) - { - var rootDirectory = Create.EmptyWorkspace(isRebuildablePackage: true).Directory; - var directoryAccessor = new InMemoryDirectoryAccessor(rootDirectory); - foreach (var file in files) - { - directoryAccessor.Add(file); - } - directoryAccessor.CreateFiles(); - - return directoryAccessor; - } - - protected async Task<(PublishOutput publishOutput, int resultCode)> DoPublish( - IDirectoryAccessor rootDirectory, - IDirectoryAccessor targetDirectory = null) - { - var console = new TestConsole(); - - var output = new PublishOutput(); - - var resultCode = await PublishCommand.Do( - Options(rootDirectory, targetDirectory), - console, - context: new MarkdownProcessingContext(rootDirectory, - writeFile: output.Add)); - - _output.WriteLine(console.Out.ToString()); - - return (output, resultCode); - } - } - - private static void MarkdownShouldBeEquivalent(string expected, string actual) - { - static string Normalize(string input) => Regex.Replace(input.Trim(), @"[\s]+", " "); - - var expectedNormalized = Normalize(expected); - var actualNormalized = Normalize(actual); - - actualNormalized.Should().Be(expectedNormalized); - } - - public class PublishOutput - { - private readonly List _outputFiles = new List(); - public IEnumerable OutputFiles => _outputFiles; - - public void Add(string path, string content) => _outputFiles.Add(new OutputFile(path, content)); - } - - public class OutputFile - { - public string Path { get; } - public string Content { get; } - - public OutputFile(string path, string content) - { - Path = path; - Content = content; - } - } - } -} \ No newline at end of file diff --git a/MLS.Agent.Tests/CommandLine/StartupOptionsTests.cs b/MLS.Agent.Tests/CommandLine/StartupOptionsTests.cs deleted file mode 100644 index 985b83bd4..000000000 --- a/MLS.Agent.Tests/CommandLine/StartupOptionsTests.cs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.IO; -using FluentAssertions; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Hosting; -using MLS.Agent.CommandLine; -using MLS.Agent.Tools; -using WorkspaceServer; -using Xunit; - -namespace MLS.Agent.Tests.CommandLine -{ - public class StartupOptionsTests - { - [Fact] - public void When_Production_is_true_and_in_hosted_mode_then_EnvironmentName_is_production() - { - var options = new StartupOptions(production: true, rootDirectory: null); - - options.EnvironmentName.Should().Be(Environments.Production); - } - - [Fact] - public void When_Production_is_true_and_not_in_hosted_mode_then_EnvironmentName_is_production() - { - var options = new StartupOptions(production: true, rootDirectory: new FileSystemDirectoryAccessor(Directory.GetCurrentDirectory())); - - options.EnvironmentName.Should().Be(Environments.Production); - } - - [Fact] - public void When_not_in_hosted_mode_then_EnvironmentName_is_production() - { - var options = new StartupOptions(rootDirectory: new FileSystemDirectoryAccessor(Directory.GetCurrentDirectory())); - - options.EnvironmentName.Should().Be(Environments.Production); - } - } -} \ No newline at end of file diff --git a/MLS.Agent.Tests/CommandLine/TelemetryTests.cs b/MLS.Agent.Tests/CommandLine/TelemetryTests.cs deleted file mode 100644 index 39cc229c1..000000000 --- a/MLS.Agent.Tests/CommandLine/TelemetryTests.cs +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.CommandLine.Parsing; -using System.CommandLine.IO; -using System.Threading.Tasks; -using FluentAssertions; -using Microsoft.DotNet.Interactive.Telemetry; -using Microsoft.Extensions.DependencyInjection; -using MLS.Agent.CommandLine; -using Xunit; -using Xunit.Abstractions; - -namespace MLS.Agent.Tests.CommandLine -{ - public class TelemetryTests : IDisposable - { - private readonly FakeTelemetry _fakeTelemetry; - private readonly ITestOutputHelper _output; - private readonly TestConsole _console = new TestConsole(); - private readonly Parser _parser; - - public TelemetryTests(ITestOutputHelper output) - { - _fakeTelemetry = new FakeTelemetry(); - - _output = output; - - _parser = CommandLineParser.Create( - new ServiceCollection(), - startServer: (options, invocationContext) => { }, - demo: (options, console, context, startOptions) => Task.CompletedTask, - tryGithub: (options, c) => Task.CompletedTask, - pack: (options, console) => Task.CompletedTask, - verify: (options, console, startupOptions, context) => Task.FromResult(1), - telemetry: _fakeTelemetry, - firstTimeUseNoticeSentinel: new NopFirstTimeUseNoticeSentinel()); - } - - public void Dispose() - { - _output.WriteLine(_console.Error.ToString()); - } - - [Fact] - public async Task Hosted_is_does_not_send_any_telemetry() - { - await _parser.InvokeAsync("hosted", _console); - _fakeTelemetry.LogEntries.Should().BeEmpty(); - } - - [Fact] - public async Task Invalid_command_is_does_not_send_any_telemetry() - { - await _parser.InvokeAsync("invalidcommand", _console); - _fakeTelemetry.LogEntries.Should().BeEmpty(); - } - - [Fact] - public async Task Show_first_time_message_if_environment_variable_is_not_set() - { - var environmentVariableName = FirstTimeUseNoticeSentinel.SkipFirstTimeExperienceEnvironmentVariableName; - var currentState = Environment.GetEnvironmentVariable(environmentVariableName); - Environment.SetEnvironmentVariable(environmentVariableName, null); - try - { - await _parser.InvokeAsync(string.Empty, _console); - _console.Out.ToString().Should().Contain(Telemetry.WelcomeMessage); - } - finally - { - Environment.SetEnvironmentVariable(environmentVariableName, currentState); - } - } - - [Fact] - public async Task Do_not_show_first_time_message_if_environment_variable_is_set() - { - var environmentVariableName = FirstTimeUseNoticeSentinel.SkipFirstTimeExperienceEnvironmentVariableName; - var currentState = Environment.GetEnvironmentVariable(environmentVariableName); - Environment.SetEnvironmentVariable(environmentVariableName, null); - Environment.SetEnvironmentVariable(environmentVariableName, "1"); - try - { - await _parser.InvokeAsync(string.Empty, _console); - _console.Out.ToString().Should().NotContain(Telemetry.WelcomeMessage); - } - finally - { - Environment.SetEnvironmentVariable(environmentVariableName, currentState); - } - } - } -} \ No newline at end of file diff --git a/MLS.Agent.Tests/CommandLine/VerifyCommandTests.cs b/MLS.Agent.Tests/CommandLine/VerifyCommandTests.cs deleted file mode 100644 index 0bcad6f38..000000000 --- a/MLS.Agent.Tests/CommandLine/VerifyCommandTests.cs +++ /dev/null @@ -1,794 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.CommandLine.IO; -using System.IO; -using System.Threading.Tasks; -using FluentAssertions; -using Microsoft.DotNet.Try.Protocol.Tests; -using MLS.Agent.CommandLine; -using MLS.Agent.Tools; -using MLS.Agent.Tools.Tests; -using WorkspaceServer.Tests; -using Xunit; -using Xunit.Abstractions; - -namespace MLS.Agent.Tests.CommandLine -{ - public class VerifyCommandTests - { - private const string CompilingProgramCs = @" -using System; - -public class Program -{ - public static void Main(string[] args) - { - Console.WriteLine(); - } -}"; - - private const string CompilingProgramWithRegionCs = @" -using System; - -public class Program -{ - public static void Main(string[] args) - { - #region targetRegion - #endregion - - #region userCodeRegion - #endregion - } -}"; - - private const string NonCompilingProgramWithRegionCs = @" -using System; - -public class Program -{ - public static void Main(string[] args) - { - #region targetRegion -DOES NOT COMPILE - #endregion - } -}"; - - private const string CsprojContents = @" - - netcoreapp2.1 - - -"; - - public class WithBackingProject - { - private readonly ITestOutputHelper _output; - - public WithBackingProject(ITestOutputHelper output) - { - _output = output; - } - - - [Fact] - public async Task Errors_are_written_to_std_out() - { - var root = new DirectoryInfo(Directory.GetDirectoryRoot(Directory.GetCurrentDirectory())); - - var directoryAccessor = new InMemoryDirectoryAccessor(root, root) - { - ("doc.md", @" -This is some sample code: -```cs --source-file Program.cs -``` -") - }; - - var console = new TestConsole(); - - await VerifyCommand.Do(new VerifyOptions(directoryAccessor), console); - - console.Out - .ToString() - .Should() - .Match($"*{root}doc.md*Line 3:*{root}Program.cs (in project UNKNOWN)*File not found: ./Program.cs*No project file or package specified*"); - } - - [Fact] - public async Task Files_are_listed() - { - var root = Create.EmptyWorkspace(isRebuildablePackage: true).Directory; - - var directoryAccessor = new InMemoryDirectoryAccessor(root, root) - { - ("some.csproj", CsprojContents), - ("Program.cs", CompilingProgramCs), - ("doc.md", @" -```cs --source-file Program.cs -``` -") - }.CreateFiles(); - - var console = new TestConsole(); - - await VerifyCommand.Do(new VerifyOptions(directoryAccessor), console); - - _output.WriteLine(console.Out.ToString()); - - console.Out - .ToString() - .EnforceLF() - .Trim() - .Should() - .Match( - $"*{root}{Path.DirectorySeparatorChar}doc.md*Line 2:*{root}{Path.DirectorySeparatorChar}Program.cs (in project {root}{Path.DirectorySeparatorChar}some.csproj)*".EnforceLF()); - } - - [Fact] - public async Task Fails_if_language_is_not_compatible_with_backing_project() - { - var root = Create.EmptyWorkspace(isRebuildablePackage: true).Directory; - - var directoryAccessor = new InMemoryDirectoryAccessor(root, root) - { - ("some.csproj", CsprojContents), - ("Program.cs", CompilingProgramCs), - ("support.fs", "let a = 0"), - ("doc.md", @" -```fs --source-file support.fs --project some.csproj -``` -") - }.CreateFiles(); - - var console = new TestConsole(); - - await VerifyCommand.Do(new VerifyOptions(directoryAccessor), console); - - _output.WriteLine(console.Out.ToString()); - - console.Out - .ToString() - .EnforceLF() - .Trim() - .Should() - .Match( - $"*Build failed as project {root}{Path.DirectorySeparatorChar}some.csproj is not compatible with language fsharp*".EnforceLF()); - } - - [Fact] - public async Task When_non_editable_code_blocks_do_not_contain_errors_then_validation_succeeds() - { - var root = Create.EmptyWorkspace(isRebuildablePackage: true).Directory; - - var directoryAccessor = new InMemoryDirectoryAccessor(root, root) - { - ("some.csproj", CsprojContents), - ("Program.cs", CompilingProgramCs), - ("doc.md", @" -```cs --source-file Program.cs -``` -```cs --editable false -// global include -public class EmptyClass {} -``` -```cs --editable false -// global include -public class EmptyClassTwo {} -``` -") - }.CreateFiles(); - - var console = new TestConsole(); - - var resultCode = await VerifyCommand.Do(new VerifyOptions(directoryAccessor), console); - - _output.WriteLine(console.Out.ToString()); - - resultCode.Should().Be(0); - } - - [Fact] - public async Task When_projects_are_deeper_than_root_it_succeeds() - { - var root = Create.EmptyWorkspace(isRebuildablePackage: true).Directory; - - var directoryAccessor = new InMemoryDirectoryAccessor(root, root) - { - ("./folder/project/some.csproj", CsprojContents), - ("./folder/project/Program.cs", CompilingProgramWithRegionCs), - ("./folder/doc2.md", @" -```cs --source-file ./project/Program.cs --region targetRegion --project ./project/some.csproj -``` - -```cs --source-file ./project/Program.cs --region userCodeRegion --project ./project/some.csproj -``` - -") - }.CreateFiles(); - - var console = new TestConsole(); - - var resultCode = await VerifyCommand.Do(new VerifyOptions(directoryAccessor), console); - - _output.WriteLine(console.Out.ToString()); - - resultCode.Should().Be(0); - } - - [Fact] - public async Task With_non_editable_code_block_targeting_regions_with_non_compiling_code_then_validation_fails() - { - var root = Create.EmptyWorkspace(isRebuildablePackage: true).Directory; - - var directoryAccessor = new InMemoryDirectoryAccessor(root, root) - { - ("some.csproj", CsprojContents), - ("Program.cs", NonCompilingProgramWithRegionCs), - ("doc.md", @" -```cs --editable false --source-file Program.cs --region targetRegion -``` -") - }.CreateFiles(); - - var console = new TestConsole(); - - var resultCode = await VerifyCommand.Do(new VerifyOptions(directoryAccessor), console); - - _output.WriteLine(console.Out.ToString()); - - resultCode.Should().NotBe(0); - } - - [Fact] - public async Task When_there_are_no_markdown_errors_then_return_code_is_0() - { - var rootDirectory = Create.EmptyWorkspace(isRebuildablePackage: true).Directory; - - var directoryAccessor = new InMemoryDirectoryAccessor(rootDirectory, rootDirectory) - { - ("some.csproj", CsprojContents), - ("Program.cs", CompilingProgramCs), - ("doc.md", @" -```cs --source-file Program.cs -``` -") - }.CreateFiles(); - - var console = new TestConsole(); - - var resultCode = await VerifyCommand.Do(new VerifyOptions(directoryAccessor), console); - - _output.WriteLine(console.Out.ToString()); - - resultCode.Should().Be(0); - } - - [Theory] - [InlineData("invalid")] - [InlineData("--source-file ./NONEXISTENT.CS")] - [InlineData("--source-file ./Program.cs --region NONEXISTENT")] - public async Task When_there_are_code_fence_annotation_errors_then_return_code_is_nonzero(string args) - { - var rootDirectory = Create.EmptyWorkspace(isRebuildablePackage: true).Directory; - - var directoryAccessor = new InMemoryDirectoryAccessor(rootDirectory) - { - ("doc.md", $@" -```cs {args} -``` -"), - ("Program.cs", $@" -using System; - -public class Program -{{ - public static void Main(string[] args) - {{ -#region main - Console.WriteLine(""Hello World!""); -#endregion - }} -}}"), - ("default.csproj", CsprojContents) - }.CreateFiles(); - - var console = new TestConsole(); - - var resultCode = await VerifyCommand.Do(new VerifyOptions(directoryAccessor), console); - - _output.WriteLine(console.Out.ToString()); - - resultCode.Should().NotBe(0); - } - - - [Fact] - public async Task When_there_are_no_files_found_then_return_code_is_nonzero() - { - var rootDirectory = Create.EmptyWorkspace(isRebuildablePackage: true).Directory; - - var directoryAccessor = new InMemoryDirectoryAccessor(rootDirectory); - - var console = new TestConsole(); - - var resultCode = await VerifyCommand.Do(new VerifyOptions(directoryAccessor), console); - - console.Error.ToString().Should().Contain("No markdown files found"); - resultCode.Should().NotBe(0); - } - - [Theory] - [InlineData(@" -```cs --source-file Program.cs --session one --project a.csproj -``` -```cs --source-file Program.cs --session one --project b.csproj -```")] - [InlineData(@" -```cs --source-file Program.cs --session one --package console -``` -```cs --source-file Program.cs --session one --project b.csproj -```")] - public async Task Returns_an_error_when_a_session_has_more_than_one_package_or_project(string mdFileContents) - { - var rootDirectory = new DirectoryInfo("."); - - var directoryAccessor = new InMemoryDirectoryAccessor(rootDirectory) - { - ("doc.md", mdFileContents), - ("a.csproj", ""), - ("b.csproj", ""), - }; - - var console = new TestConsole(); - - var resultCode = await VerifyCommand.Do(new VerifyOptions(directoryAccessor), console); - - console.Out.ToString().Should().Contain("Session cannot span projects or packages: --session one"); - - resultCode.Should().NotBe(0); - } - - [Theory] - [InlineData("")] - [InlineData("--region mask")] - public async Task Verify_shows_diagnostics_for_compilation_failures(string args) - { - var directory = Create.EmptyWorkspace(isRebuildablePackage: true).Directory; - - var directoryAccessor = new InMemoryDirectoryAccessor(directory, directory) - { - - ("Program.cs", $@" - public class Program - {{ - public static void Main(string[] args) - {{ -#region mask - Console.WriteLine() -#endregion - }} - }}"), - ("sample.md", $@" -```cs {args} --source-file Program.cs -```"), - ("sample.csproj", - @" - - Exe - netcoreapp2.1 - - -") - }.CreateFiles(); - - var console = new TestConsole(); - - var resultCode = await VerifyCommand.Do(new VerifyOptions(directoryAccessor), console); - - _output.WriteLine(console.Out.ToString()); - - console.Out.ToString().Should().Contain($"Build failed for project {directoryAccessor.GetFullyQualifiedPath(new RelativeFilePath("sample.csproj"))}"); - - resultCode.Should().NotBe(0); - } - - [Fact] - public async Task When_there_are_compilation_errors_outside_the_mask_then_they_are_displayed() - { - var rootDirectory = Create.EmptyWorkspace(isRebuildablePackage: true).Directory; - - var directoryAccessor = new InMemoryDirectoryAccessor(rootDirectory, rootDirectory) - { - ("Program.cs", $@" - using System; - - public class Program - {{ - public static void Main(string[] args) DOES NOT COMPILE - {{ -#region mask - Console.WriteLine(); -#endregion - }} - }}"), - ("sample.md", $@" -```cs --source-file Program.cs --region mask -```"), - ("sample.csproj", - CsprojContents) - }.CreateFiles(); - - var console = new TestConsole(); - - var resultCode = await VerifyCommand.Do(new VerifyOptions(directoryAccessor), console); - - _output.WriteLine(console.Out.ToString()); - - console.Out.ToString() - .Should().Contain("Build failed") - .And.Contain("Program.cs(6,72): error CS1002: ; expected"); - - resultCode.Should().NotBe(0); - } - - [Fact] - public async Task When_there_are_compilation_errors_in_non_editable_blocks_then_they_are_displayed() - { - var rootDirectory = Create.EmptyWorkspace(isRebuildablePackage: true).Directory; - - var directoryAccessor = new InMemoryDirectoryAccessor(rootDirectory, rootDirectory) - { - ("Program.cs", @" - using System; - - public class Program - {{ - public static void Main(string[] args) - {{ -#region mask - Console.WriteLine(); -#endregion - }} - }}"), - ("sample.md", @" -```cs --source-file Program.cs --region mask -``` -```cs --editable false - DOES NOT COMPILE - DOES NOT COMPILE - DOES NOT COMPILE -``` -"), - ("sample.csproj", - CsprojContents) - }.CreateFiles(); - - var console = new TestConsole(); - - var resultCode = await VerifyCommand.Do(new VerifyOptions(directoryAccessor), console); - - _output.WriteLine(console.Out.ToString()); - - console.Out.ToString() - .Should().Contain("Build failed") - .And.Contain("generated_include_file_global.cs(3,53): error CS1002: ; expected"); - - resultCode.Should().NotBe(0); - } - - [Fact] - public async Task Console_output_blocks_do_not_cause_verification_to_fail() - { - var rootDirectory = Create.EmptyWorkspace(isRebuildablePackage: true).Directory; - - var directoryAccessor = new InMemoryDirectoryAccessor(rootDirectory, rootDirectory) - { - ("Program.cs", @" - using System; - - public class Program - { - public static void Main(string[] args) - { -#region mask - Console.WriteLine(""hello!""); -#endregion - } - }"), - ("sample.md", @" -```cs --source-file Program.cs --region mask --session one -``` -```console --session one -hello! -``` -"), - ("sample.csproj", CsprojContents) - }.CreateFiles(); - - var console = new TestConsole(); - - var resultCode = await VerifyCommand.Do( - new VerifyOptions(directoryAccessor), - console); - - _output.WriteLine(console.Out.ToString()); - - resultCode.Should().Be(0); - } - - [Fact] - public async Task When_there_are_code_fence_options_errors_then_compilation_is_not_attempted() - { - var root = new DirectoryInfo(Directory.GetDirectoryRoot(Directory.GetCurrentDirectory())); - - var directoryAccessor = new InMemoryDirectoryAccessor(root, root) - { - ("doc.md", @" -This is some sample code: -```cs --source-file Program.cs -``` -") - }; - - var console = new TestConsole(); - - await VerifyCommand.Do(new VerifyOptions(directoryAccessor), console); - - _output.WriteLine(console.Out.ToString()); - - console.Out - .ToString() - .Should() - .NotContain("Compiling samples for session"); - } - - [Fact] - public async Task If_a_new_file_is_added_and_verify_is_called_the_compile_errors_in_it_are_emitted() - { - var rootDirectory = Create.EmptyWorkspace(isRebuildablePackage: true).Directory; - - var directoryAccessor = new InMemoryDirectoryAccessor(rootDirectory, rootDirectory) - { - ("Program.cs", $@" - using System; - - public class Program - {{ - public static void Main(string[] args) - {{ -#region mask - Console.WriteLine(); -#endregion - }} - }}"), - ("sample.md", $@" -```cs --source-file Program.cs --region mask -```"), - ("sample.csproj", - CsprojContents) - }.CreateFiles(); - - var console = new TestConsole(); - - var resultCode = await VerifyCommand.Do(new VerifyOptions(directoryAccessor), console); - - _output.WriteLine(console.Out.ToString()); - resultCode.Should().Be(0); - - File.WriteAllText(directoryAccessor.GetFullyQualifiedPath(new RelativeFilePath("Sample.cs")).FullName, "DOES NOT COMPILE"); - - resultCode = await VerifyCommand.Do(new VerifyOptions(directoryAccessor), console); - - _output.WriteLine(console.Out.ToString()); - - console.Out.ToString() - .Should().Contain("Build failed") - .And.Contain("Sample.cs(1,17): error CS1002: ; expected"); - - resultCode.Should().NotBe(0); - } - - [Fact] - public async Task When_the_file_is_modified_and_errors_are_added_verify_command_shows_the_errors() - { - var rootDirectory = Create.EmptyWorkspace(isRebuildablePackage: true).Directory; - - var validCode = $@" - using System; - - public class Program - {{ - public static void Main(string[] args) - {{ -#region mask - Console.WriteLine(); -#endregion - }} - }}"; - - var invalidCode = $@" - using System; - - public class Program - {{ - public static void Main(string[] args) DOES NOT COMPILE - {{ -#region mask - Console.WriteLine(); -#endregion - }} - }}"; - - var directoryAccessor = new InMemoryDirectoryAccessor(rootDirectory, rootDirectory) - { - ("Program.cs", validCode), - ("sample.md", $@" -```cs --source-file Program.cs --region mask -```"), - ("sample.csproj", - CsprojContents) - }.CreateFiles(); - - var console = new TestConsole(); - - - var resultCode = await VerifyCommand.Do(new VerifyOptions(directoryAccessor), console); - - resultCode.Should().Be(0); - - File.WriteAllText(directoryAccessor.GetFullyQualifiedPath(new RelativeFilePath("Program.cs")).FullName, invalidCode); - - resultCode = await VerifyCommand.Do(new VerifyOptions(directoryAccessor), console); - - _output.WriteLine(console.Out.ToString()); - - console.Out.ToString() - .Should().Contain("Build failed") - .And.Contain("Program.cs(6,72): error CS1002: ; expected"); - - resultCode.Should().NotBe(0); - } - } - - public class WithStandaloneMarkdown - { - private readonly ITestOutputHelper _output; - - public WithStandaloneMarkdown(ITestOutputHelper output) - { - _output = output; - } - - [Fact] - public async Task When_standalone_markdown_with_non_editable_code_block_targeting_regions_has_compiling_code_then_validation_succeeds() - { - var root = Create.EmptyWorkspace(isRebuildablePackage: true).Directory; - - var directoryAccessor = new InMemoryDirectoryAccessor(root, root) - { - ("./subFolder/some.csproj", CsprojContents), - ("doc.md", $@" -```cs --editable false --destination-file Program.cs -{CompilingProgramWithRegionCs} -``` -```cs --editable false --destination-file Program.cs --region targetRegion -Console.WriteLine(""code""); -``` -") - }.CreateFiles(); - - var console = new TestConsole(); - var project = directoryAccessor.GetFullyQualifiedPath(new RelativeFilePath("./subFolder/some.csproj")); - - var resultCode = await VerifyCommand.Do(new VerifyOptions(directoryAccessor), console, - new StartupOptions(package: project.FullName)); - - _output.WriteLine(console.Out.ToString()); - - resultCode.Should().Be(0); - } - - [Fact] - public async Task When_standalone_markdown_has_compiling_code_then_validation_succeeds() - { - var root = Create.EmptyWorkspace(isRebuildablePackage: true).Directory; - - var directoryAccessor = new InMemoryDirectoryAccessor(root, root) - { - ("./subFolder/some.csproj", CsprojContents), - ("doc.md", $@" -```cs --editable false --destination-file Program.cs -{CompilingProgramWithRegionCs} -``` -```cs --editable false -// global include -public class EmptyClass {{}} -``` -```cs --editable false -// global include -public class EmptyClassTwo {{}} -``` -") - }.CreateFiles(); - - var console = new TestConsole(); - var project = directoryAccessor.GetFullyQualifiedPath(new RelativeFilePath("./subFolder/some.csproj")); - - var resultCode = await VerifyCommand.Do(new VerifyOptions(directoryAccessor), console, - new StartupOptions(package: project.FullName) - ); - - _output.WriteLine(console.Out.ToString()); - - resultCode.Should().Be(0); - } - - - [Fact] - public async Task When_standalone_markdown_contains_non_compiling_code_then_validation_fails() - { - var root = Create.EmptyWorkspace(isRebuildablePackage: true).Directory; - - var directoryAccessor = new InMemoryDirectoryAccessor(root, root) - { - ("./subFolder/some.csproj", CsprojContents), - ("doc.md", $@" -```cs --editable false --destination-file Program.cs -{CompilingProgramWithRegionCs} -``` -```cs --editable false -// global include -public class EmptyClassTwo {{ - DOES NOT COMPILE -}} -``` -") - }.CreateFiles(); - - var console = new TestConsole(); - var project = directoryAccessor.GetFullyQualifiedPath(new RelativeFilePath("./subFolder/some.csproj")); - - var resultCode = await VerifyCommand.Do(new VerifyOptions(directoryAccessor), console, - new StartupOptions(package: project.FullName)); - - _output.WriteLine(console.Out.ToString()); - console.Out.ToString() - .Should().Contain("Build failed"); - - resultCode.Should().NotBe(0); - } - - [Fact] - public async Task When_markdown_has_Program_with_a_region_and_markdown_has_destination_file_then_validation_succeeds() - { - var root = Create.EmptyWorkspace(isRebuildablePackage: true).Directory; - - var directoryAccessor = new InMemoryDirectoryAccessor(root, root) - { - ("./subFolder/some.csproj", CsprojContents), - ("Program.cs", CompilingProgramWithRegionCs), - ("doc.md", $@" -```cs --destination-file Program.cs --region targetRegion -Console.WriteLine(""This code should be compiled with the targetRegion in Program.cs""); -``` -") - }.CreateFiles(); - - var console = new TestConsole(); - var project = directoryAccessor.GetFullyQualifiedPath(new RelativeFilePath("./subFolder/some.csproj")); - - var resultCode = await VerifyCommand.Do(new VerifyOptions(directoryAccessor), console, - new StartupOptions(package: project.FullName) - ); - - _output.WriteLine(console.Out.ToString()); - - resultCode.Should().Be(0); - } - } - - } -} \ No newline at end of file diff --git a/MLS.Agent.Tests/DocumentationAPITests.cs b/MLS.Agent.Tests/DocumentationAPITests.cs deleted file mode 100644 index 707059810..000000000 --- a/MLS.Agent.Tests/DocumentationAPITests.cs +++ /dev/null @@ -1,263 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.IO; -using System.Linq; -using System.Net.Http.Headers; -using System.Threading.Tasks; -using Clockwise; -using FluentAssertions; -using FluentAssertions.Extensions; -using HtmlAgilityPack; -using Microsoft.DotNet.Interactive.Utility; -using Microsoft.DotNet.Try.Markdown; -using MLS.Agent.CommandLine; -using MLS.Agent.Tools; -using MLS.Agent.Tools.Tests; -using Recipes; -using WorkspaceServer; -using WorkspaceServer.Packaging; -using WorkspaceServer.Tests; -using Xunit; - -namespace MLS.Agent.Tests -{ - public class DocumentationAPITests - { - [Fact] - public async Task Request_for_non_existent_markdown_file_returns_404() - { - using (var agent = new AgentService(new StartupOptions(rootDirectory: new FileSystemDirectoryAccessor(TestAssets.SampleConsole)))) - { - var response = await agent.GetAsync(@"/DOESNOTEXIST"); - - response.Should().BeNotFound(); - } - } - - [Fact] - public async Task Return_html_for_an_existing_markdown_file() - { - using (var agent = new AgentService(new StartupOptions(rootDirectory: new FileSystemDirectoryAccessor(TestAssets.SampleConsole)))) - { - var response = await agent.GetAsync(@"Readme.md"); - - response.Should().BeSuccessful(); - - var result = await response.Content.ReadAsStringAsync(); - response.Content.Headers.ContentType.MediaType.Should().Be("text/html"); - result.Should().Contain("markdown file"); - } - } - - [Fact] - public async Task Return_html_for_existing_markdown_files_in_a_subdirectory() - { - using (var agent = new AgentService(new StartupOptions(rootDirectory: new FileSystemDirectoryAccessor(TestAssets.SampleConsole)))) - { - var response = await agent.GetAsync(@"Subdirectory/Tutorial.md"); - - response.Should().BeSuccessful(); - - var result = await response.Content.ReadAsStringAsync(); - result.Should().Contain("tutorial file"); - } - } - - [Fact] - public async Task Lists_markdown_files_when_a_folder_is_requested() - { - using (var agent = new AgentService(new StartupOptions(rootDirectory: new FileSystemDirectoryAccessor(TestAssets.SampleConsole)))) - { - var response = await agent.GetAsync(@"/"); - - response.Should().BeSuccessful(); - - var html = await response.Content.ReadAsStringAsync(); - - var htmlDoc = new HtmlDocument(); - htmlDoc.LoadHtml(html); - - var links = htmlDoc.DocumentNode - .SelectNodes("//a") - .Select(a => a.Attributes["href"].Value) - .ToArray(); - - links.Should().Contain("./Readme.md"); - links.Should().Contain("./Subdirectory/Tutorial.md"); - } - } - - [Fact] - public async Task Scaffolding_HTML_includes_trydotnet_js_script_link() - { - using (var agent = new AgentService(new StartupOptions(rootDirectory: new FileSystemDirectoryAccessor(TestAssets.SampleConsole)))) - { - var response = await agent.GetAsync(@"Subdirectory/Tutorial.md"); - - response.Should().BeSuccessful(); - - var html = await response.Content.ReadAsStringAsync(); - - var document = new HtmlDocument(); - document.LoadHtml(html); - - var script = document.DocumentNode - .Descendants("head") - .Single() - .Descendants("script") - .FirstOrDefault(); - - script.Attributes["src"].Value.Should().StartWith("/api/trydotnet.min.js?v="); - } - } - - [Fact] - public async Task Scaffolding_HTML_includes_trydotnet_js_autoEnable_invocation_with_useBlazor_defaulting_to_false() - { - using (var agent = new AgentService(new StartupOptions(rootDirectory: new FileSystemDirectoryAccessor(TestAssets.SampleConsole)))) - { - var response = await agent.GetAsync(@"Subdirectory/Tutorial.md"); - - response.Should().BeSuccessful(); - - var html = await response.Content.ReadAsStringAsync(); - - var document = new HtmlDocument(); - document.LoadHtml(html); - - var scripts = document.DocumentNode - .Descendants("body") - .Single() - .Descendants("script") - .Select(s => s.InnerHtml); - - scripts.Should() - .Contain(s => s.Contains(@"trydotnet.autoEnable({ apiBaseAddress: new URL(""http://localhost""), useWasmRunner: false });")); - } - } - - [Fact] - public async Task Scaffolding_HTML_trydotnet_js_autoEnable_useBlazor_is_true_when_package_is_specified_and_supports_wasmrunner() - { - var (name, addSource) = await Create.NupkgWithBlazorEnabled("packageName"); - - var startupOptions = new StartupOptions( - rootDirectory: new FileSystemDirectoryAccessor(TestAssets.SampleConsole), - addPackageSource: new PackageSource(addSource.FullName), - package: name); - - using (var agent = new AgentService(startupOptions)) - { - var response = await agent.GetAsync(@"Subdirectory/Tutorial.md"); - - response.Should().BeSuccessful(); - - var html = await response.Content.ReadAsStringAsync(); - - var document = new HtmlDocument(); - document.LoadHtml(html); - - var scripts = document.DocumentNode - .Descendants("body") - .Single() - .Descendants("script") - .Select(s => s.InnerHtml); - - scripts.Should() - .Contain(s => s.Contains(@"trydotnet.autoEnable({ apiBaseAddress: new URL(""http://localhost""), useWasmRunner: true });")); - } - } - - - [Fact] - public async Task Scaffolding_HTML_trydotnet_js_autoEnable_useBlazor_is_true_when_package_is_not_specified_and_supports_wasmrunner() - { - var (name, addSource) = await Create.NupkgWithBlazorEnabled("packageName"); - - using (var dir = DisposableDirectory.Create()) - { - var text = $@" -```cs --package {name} -```"; - - var path = Path.Combine(dir.Directory.FullName, "BlazorTutorial.md"); - File.WriteAllText(path, text); - - var startupOptions = new StartupOptions( - rootDirectory: new FileSystemDirectoryAccessor(dir.Directory), - addPackageSource: new PackageSource(addSource.FullName)); - - using (var agent = new AgentService(startupOptions)) - { - var response = await agent.GetAsync(@"/BlazorTutorial.md"); - - response.Should().BeSuccessful(); - - var html = await response.Content.ReadAsStringAsync(); - - var document = new HtmlDocument(); - document.LoadHtml(html); - - var scripts = document.DocumentNode - .Descendants("body") - .Single() - .Descendants("script") - .Select(s => s.InnerHtml); - - scripts.Should() - .Contain(s => s.Contains(@"trydotnet.autoEnable({ apiBaseAddress: new URL(""http://localhost""), useWasmRunner: true });")); - } - } - } - - [Fact] - public async Task When_relative_uri_is_specified_then_it_opens_to_that_page() - { - var launchUri = new Uri("something.md", UriKind.Relative); - - using (var clock = VirtualClock.Start()) - using (var agent = new AgentService(new StartupOptions( - rootDirectory: new FileSystemDirectoryAccessor(TestAssets.SampleConsole), - uri: launchUri))) - { - await clock.Wait(5.Seconds()); - - agent.BrowserLauncher - .LaunchedUri - .ToString() - .Should() - .Match("https://localhost:*/something.md"); - } - } - - [Fact] - public async Task When_readme_file_is_on_root_browser_opens_there() - { - - var directoryAccessor = new InMemoryDirectoryAccessor - { - ("./readme.md", ""), - ("./subfolder/part1.md", ""), - ("./subfolder/part2.md", "") - }; - - var root = directoryAccessor.GetFullyQualifiedPath(new RelativeDirectoryPath(".")) as DirectoryInfo; - - var options = new StartupOptions(rootDirectory: new FileSystemDirectoryAccessor(root)); - - using (var clock = VirtualClock.Start()) - using (var agent = new AgentService(options: options, directoryAccessor: directoryAccessor)) - { - await clock.Wait(5.Seconds()); - - agent.BrowserLauncher - .LaunchedUri - .ToString() - .Should() - .Match("https://localhost:*/readme.md"); - } - } - } -} diff --git a/MLS.Agent.Tests/ExceptionExtensionsTests.cs b/MLS.Agent.Tests/ExceptionExtensionsTests.cs deleted file mode 100644 index c1e48bb64..000000000 --- a/MLS.Agent.Tests/ExceptionExtensionsTests.cs +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.Threading.Tasks; -using Clockwise; -using FluentAssertions; -using FluentAssertions.Extensions; -using WorkspaceServer.Servers.Scripting; -using Xunit; - -namespace MLS.Agent.Tests -{ - public class ExceptionExtensionsTests - { - [Fact] - public async Task When_time_budget_expires_in_user_code_then_a_417_is_returned() - { - using (VirtualClock.Start()) - { - var budget = new TimeBudget(10.Seconds()); - - await Clock.Current.Wait(11.Seconds()); - - budget.RecordEntry(ScriptingWorkspaceServer.UserCodeCompletedBudgetEntryName); - - var exception = new BudgetExceededException(budget); - - exception.ToHttpStatusCode().Should().Be(417); - } - } - - [Fact] - public async Task When_time_budget_expires_prior_to_user_code_then_a_504_is_returned() - { - using (VirtualClock.Start()) - { - var budget = new TimeBudget(10.Seconds()); - - await Clock.Current.Wait(11.Seconds()); - - var exception = new BudgetExceededException(budget); - - exception.ToHttpStatusCode().Should().Be(504); - } - } - } -} diff --git a/MLS.Agent.Tests/FakeBrowserLauncher.cs b/MLS.Agent.Tests/FakeBrowserLauncher.cs deleted file mode 100644 index f130c4525..000000000 --- a/MLS.Agent.Tests/FakeBrowserLauncher.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; - -namespace MLS.Agent.Tests -{ - public class FakeBrowserLauncher : IBrowserLauncher - { - public void LaunchBrowser(Uri uri) - { - LaunchedUri = uri; - } - - public Uri LaunchedUri { get; private set; } - } -} \ No newline at end of file diff --git a/MLS.Agent.Tests/FakeTelemetry.cs b/MLS.Agent.Tests/FakeTelemetry.cs deleted file mode 100644 index 0c1c626b2..000000000 --- a/MLS.Agent.Tests/FakeTelemetry.cs +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.Collections.Concurrent; -using System.Collections.Generic; -using Microsoft.DotNet.Interactive.Telemetry; - -namespace MLS.Agent.Tests -{ - public sealed class FakeTelemetry : ITelemetry - { - public FakeTelemetry() - { - Enabled = true; - } - - public bool Enabled { get; set; } - - public void TrackEvent(string eventName, - IDictionary properties, - IDictionary measurements) - { - LogEntries.Add( - new LogEntry - { - EventName = eventName, - Measurement = measurements, - Properties = properties - }); - } - - public ConcurrentBag LogEntries { get; set; } = new ConcurrentBag(); - - public class LogEntry - { - public string EventName { get; set; } - public IDictionary Properties { get; set; } - public IDictionary Measurement { get; set; } - } - } -} diff --git a/MLS.Agent.Tests/LocalToolHelpers.cs b/MLS.Agent.Tests/LocalToolHelpers.cs deleted file mode 100644 index 488b3d00b..000000000 --- a/MLS.Agent.Tests/LocalToolHelpers.cs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.CommandLine.IO; -using System.IO; -using System.Threading.Tasks; -using MLS.Agent.CommandLine; -using WorkspaceServer.Tests; - -namespace MLS.Agent.Tests -{ - public static class LocalToolHelpers - { - public static async Task<(DirectoryInfo, string)> CreateTool(TestConsole console) - { - var asset = await Create.NetstandardWorkspaceCopy(); - await PackCommand.Do(new PackOptions(asset.Directory), console); - return (asset.Directory, asset.Name); - } - } -} diff --git a/MLS.Agent.Tests/LocalToolPackageDiscoveryStrategyTests.cs b/MLS.Agent.Tests/LocalToolPackageDiscoveryStrategyTests.cs deleted file mode 100644 index bc66c4ed0..000000000 --- a/MLS.Agent.Tests/LocalToolPackageDiscoveryStrategyTests.cs +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using FluentAssertions; -using System.CommandLine.IO; -using System.Threading.Tasks; -using MLS.Agent.CommandLine; -using WorkspaceServer.Packaging; -using WorkspaceServer.Tests; -using Xunit; -using Xunit.Abstractions; -using WorkspaceServer; -using System.IO; -using System.Linq; -using Microsoft.DotNet.Interactive.Utility; -using MLS.Agent.Tools; - -namespace MLS.Agent.Tests -{ - public class LocalToolPackageDiscoveryStrategyTests - { - private readonly ITestOutputHelper output; - - public LocalToolPackageDiscoveryStrategyTests(ITestOutputHelper _output) - { - output = _output; - } - - [Fact] - public async Task Discover_tool_from_directory() - { - using (var directory = DisposableDirectory.Create()) - { - var console = new TestConsole(); - var temp = directory.Directory; - var package = await Create.ConsoleWorkspaceCopy(); - File.Move(package.Directory.GetFiles("*.csproj").First().FullName, Path.Combine(package.Directory.FullName, "not-console.csproj")); - await PackCommand.Do(new PackOptions(package.Directory, outputDirectory: temp, enableWasm: false), console); - var result = await Microsoft.DotNet.Interactive.Utility.CommandLine.Execute("dotnet", $"tool install --add-source {temp.FullName} not-console --tool-path {temp.FullName}"); - output.WriteLine(string.Join("\n", result.Error)); - result.ExitCode.Should().Be(0); - - var strategy = new LocalToolInstallingPackageDiscoveryStrategy(temp); - var tool = await strategy.Locate(new PackageDescriptor("not-console")); - tool.Should().NotBeNull(); - } - } - - [Fact] - public void Does_not_throw_for_missing_tool() - { - using (var directory = DisposableDirectory.Create()) - { - var temp = directory.Directory; - var strategy = new LocalToolInstallingPackageDiscoveryStrategy(temp); - - strategy.Invoking(s => s.Locate(new PackageDescriptor("not-a-workspace")).Wait()).Should().NotThrow(); - } - } - - [Fact] - public async Task Installs_tool_from_package_source_when_requested() - { - var console = new TestConsole(); - var (asset, name) = await LocalToolHelpers.CreateTool(console); - - var strategy = new LocalToolInstallingPackageDiscoveryStrategy(asset, new PackageSource(asset.FullName)); - var package = await strategy.Locate(new PackageDescriptor("blazor-console")); - package.Should().NotBeNull(); - } - } -} diff --git a/MLS.Agent.Tests/LocalToolStaticFilesTests.dotnet_try_tools_packs_static_file_content.approved.json b/MLS.Agent.Tests/LocalToolStaticFilesTests.dotnet_try_tools_packs_static_file_content.approved.json deleted file mode 100644 index 8c1176353..000000000 --- a/MLS.Agent.Tests/LocalToolStaticFilesTests.dotnet_try_tools_packs_static_file_content.approved.json +++ /dev/null @@ -1,209 +0,0 @@ -{ - "name": "wwwroot", - "content": [ - { - "name": "/0.bundle.js" - }, - { - "name": "/10.bundle.js" - }, - { - "name": "/11.bundle.js" - }, - { - "name": "/12.bundle.js" - }, - { - "name": "/13.bundle.js" - }, - { - "name": "/14.bundle.js" - }, - { - "name": "/15.bundle.js" - }, - { - "name": "/16.bundle.js" - }, - { - "name": "/17.bundle.js" - }, - { - "name": "/18.bundle.js" - }, - { - "name": "/19.bundle.js" - }, - { - "name": "/2.bundle.js" - }, - { - "name": "/20.bundle.js" - }, - { - "name": "/21.bundle.js" - }, - { - "name": "/22.bundle.js" - }, - { - "name": "/23.bundle.js" - }, - { - "name": "/24.bundle.js" - }, - { - "name": "/25.bundle.js" - }, - { - "name": "/26.bundle.js" - }, - { - "name": "/27.bundle.js" - }, - { - "name": "/28.bundle.js" - }, - { - "name": "/29.bundle.js" - }, - { - "name": "/3.bundle.js" - }, - { - "name": "/30.bundle.js" - }, - { - "name": "/31.bundle.js" - }, - { - "name": "/32.bundle.js" - }, - { - "name": "/33.bundle.js" - }, - { - "name": "/34.bundle.js" - }, - { - "name": "/35.bundle.js" - }, - { - "name": "/36.bundle.js" - }, - { - "name": "/37.bundle.js" - }, - { - "name": "/38.bundle.js" - }, - { - "name": "/39.bundle.js" - }, - { - "name": "/4.bundle.js" - }, - { - "name": "/40.bundle.js" - }, - { - "name": "/41.bundle.js" - }, - { - "name": "/42.bundle.js" - }, - { - "name": "/43.bundle.js" - }, - { - "name": "/44.bundle.js" - }, - { - "name": "/45.bundle.js" - }, - { - "name": "/46.bundle.js" - }, - { - "name": "/47.bundle.js" - }, - { - "name": "/48.bundle.js" - }, - { - "name": "/49.bundle.js" - }, - { - "name": "/5.bundle.js" - }, - { - "name": "/50.bundle.js" - }, - { - "name": "/51.bundle.js" - }, - { - "name": "/52.bundle.js" - }, - { - "name": "/53.bundle.js" - }, - { - "name": "/6.bundle.js" - }, - { - "name": "/7.bundle.js" - }, - { - "name": "/8.bundle.js" - }, - { - "name": "/9.bundle.js" - }, - { - "name": "/api/trydotnet.min.js" - }, - { - "name": "/api/trydotnet.min.js.map" - }, - { - "name": "/bundle.css" - }, - { - "name": "/bundle.js" - }, - { - "name": "/bundle.js.map" - }, - { - "name": "/css/trydotnet.css" - }, - { - "name": "/editor.worker.js" - }, - { - "name": "/favicon.ico" - }, - { - "name": "/fonts/materialdesignicons-webfont.eot" - }, - { - "name": "/fonts/materialdesignicons-webfont.svg" - }, - { - "name": "/fonts/materialdesignicons-webfont.ttf" - }, - { - "name": "/fonts/materialdesignicons-webfont.woff" - }, - { - "name": "/fonts/materialdesignicons-webfont.woff2" - }, - { - "name": "/static/docs.css" - }, - { - "name": "/static/vs_windows.png" - } - ] -} \ No newline at end of file diff --git a/MLS.Agent.Tests/MLS.Agent.Tests.csproj b/MLS.Agent.Tests/MLS.Agent.Tests.csproj deleted file mode 100644 index c5f6c6828..000000000 --- a/MLS.Agent.Tests/MLS.Agent.Tests.csproj +++ /dev/null @@ -1,68 +0,0 @@ - - - Latest - net6.0 - $(AssetTargetFallback);dotnet5.4;portable-net45+win8 - $(NoWarn);8002 - - - - - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - - - all - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - diff --git a/MLS.Agent.Tests/Markdown/CodeBlockAnnotationExtensionTests.cs b/MLS.Agent.Tests/Markdown/CodeBlockAnnotationExtensionTests.cs deleted file mode 100644 index 9e194220c..000000000 --- a/MLS.Agent.Tests/Markdown/CodeBlockAnnotationExtensionTests.cs +++ /dev/null @@ -1,555 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.CommandLine.IO; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using FluentAssertions; -using HtmlAgilityPack; -using Markdig; -using Microsoft.DotNet.Interactive.Utility; -using Microsoft.DotNet.Try.Markdown; -using Microsoft.DotNet.Try.Protocol.Tests; -using MLS.Agent.Controllers; -using MLS.Agent.Markdown; -using MLS.Agent.Tools; -using MLS.Agent.Tools.Tests; -using WorkspaceServer; -using WorkspaceServer.Packaging; -using WorkspaceServer.Tests; -using Xunit; - -namespace MLS.Agent.Tests.Markdown -{ - public class CodeBlockAnnotationExtensionTests - { - private readonly AsyncLazy<(PackageRegistry, string)> _package; - - public CodeBlockAnnotationExtensionTests() - { - var console = new TestConsole(); - _package = new AsyncLazy<(PackageRegistry, string)>( async () => { - var (dir, name) = await LocalToolHelpers.CreateTool(console); - var strategy = new LocalToolInstallingPackageDiscoveryStrategy(dir, new PackageSource(dir.FullName)); - return (new PackageRegistry(true, null, additionalStrategies: strategy), name); - } - ); - } - - [Theory] - [InlineData("cs")] - [InlineData("csharp")] - [InlineData("c#")] - [InlineData("CS")] - [InlineData("CSHARP")] - [InlineData("C#")] - public async Task Inserts_code_when_an_existing_file_is_specified_using_source_file_option(string language) - { - var fileContent = @"using System; - -namespace BasicConsoleApp - { - class Program - { - static void MyProgram(string[] args) - { - Console.WriteLine(""Hello World!""); - } - } - }".EnforceLF(); - var directoryAccessor = new InMemoryDirectoryAccessor() - { - ("Program.cs", fileContent), - ("sample.csproj", "") - }; - var pipeline = new MarkdownPipelineBuilder().UseCodeBlockAnnotations(directoryAccessor,await Default.PackageRegistry.ValueAsync()).Build(); - var document = -$@"```{language} --source-file Program.cs -```"; - var html = (await pipeline.RenderHtmlAsync(document)).EnforceLF(); - html.Should().Contain(fileContent.HtmlEncode().ToString()); - } - - [Fact] - public async Task Does_not_insert_code_when_specified_language_is_not_supported() - { - var expectedValue = -@"
console.log("Hello World");
-
-".EnforceLF(); - - var testDir = TestAssets.SampleConsole; - var directoryAccessor = new InMemoryDirectoryAccessor(testDir); - var pipeline = new MarkdownPipelineBuilder().UseCodeBlockAnnotations(directoryAccessor,await Default.PackageRegistry.ValueAsync()).Build(); - var document = @" -```js --source-file Program.cs -console.log(""Hello World""); -```"; - var html = (await pipeline.RenderHtmlAsync(document)).EnforceLF(); - html.Should().Contain(expectedValue); - } - - [Theory] - [InlineData("cs", "language-cs")] - [InlineData("csharp", "language-csharp")] - [InlineData("c#", "language-c#")] - [InlineData("fs", "language-fs")] - [InlineData("fsharp", "language-fsharp")] - [InlineData("f#", "language-f#")] - public async Task Does_not_insert_code_when_supported_language_is_specified_but_no_additional_options(string fenceLanguage, string expectedClass) - { - var expectedValue = -$@"
Console.WriteLine("Hello World");
-
-".EnforceLF(); - - var directoryAccessor = new InMemoryDirectoryAccessor(); - var pipeline = new MarkdownPipelineBuilder().UseCodeBlockAnnotations(directoryAccessor,await Default.PackageRegistry.ValueAsync()).Build(); - var document = $@" -```{fenceLanguage} -Console.WriteLine(""Hello World""); -```"; - var html = (await pipeline.RenderHtmlAsync(document)).EnforceLF(); - html.Should().Contain(expectedValue); - } - - - [Fact] - public async Task Error_message_is_displayed_when_the_linked_file_does_not_exist() - { - var directoryAccessor = new InMemoryDirectoryAccessor() - { - ("sample.csproj", "") - }; - var pipeline = new MarkdownPipelineBuilder().UseCodeBlockAnnotations(directoryAccessor,await Default.PackageRegistry.ValueAsync()).Build(); - var document = -@"```cs --source-file DOESNOTEXIST -```"; - var html = (await pipeline.RenderHtmlAsync(document)).EnforceLF(); - html.Should().Contain("File not found: ./DOESNOTEXIST"); - } - - [Fact] - public async Task Error_message_is_displayed_when_no_project_is_specified_and_no_project_file_is_found() - { - var testDir = TestAssets.SampleConsole; - var directoryAccessor = new InMemoryDirectoryAccessor(testDir) - { - ("Program.cs", "") - }; - var pipeline = new MarkdownPipelineBuilder().UseCodeBlockAnnotations(directoryAccessor,await Default.PackageRegistry.ValueAsync()).Build(); - var document = -@"```cs --source-file Program.cs -```"; - var html = (await pipeline.RenderHtmlAsync(document)).EnforceLF(); - - html.Should().Contain($"No project file or package specified"); - } - - [Fact] - public async Task Error_message_is_displayed_when_a_project_is_specified_but_the_file_does_not_exist() - { - var testDir = TestAssets.SampleConsole; - var directoryAccessor = new InMemoryDirectoryAccessor(testDir) - { - ("Program.cs", "") - }; - var projectPath = "sample.csproj"; - - var document = -$@"```cs --project {projectPath} --source-file Program.cs -```"; - var pipeline = new MarkdownPipelineBuilder().UseCodeBlockAnnotations(directoryAccessor,await Default.PackageRegistry.ValueAsync()).Build(); - var html = (await pipeline.RenderHtmlAsync(document)).EnforceLF(); - - html.Should().Contain($"Project not found: ./{projectPath}"); - } - - [Fact] - public async Task Sets_the_trydotnet_package_attribute_using_the_passed_project_path() - { - var rootDirectory = TestAssets.SampleConsole; - var currentDir = new DirectoryInfo(Path.Combine(rootDirectory.FullName, "docs")); - var directoryAccessor = new InMemoryDirectoryAccessor(currentDir, rootDirectory) - { - ("src/sample/Program.cs", ""), - ("src/sample/sample.csproj", "") - }; - - var pipeline = new MarkdownPipelineBuilder().UseCodeBlockAnnotations(directoryAccessor,await Default.PackageRegistry.ValueAsync()).Build(); - - var package = "../src/sample/sample.csproj"; - var document = -$@"```cs --project {package} --source-file ../src/sample/Program.cs -```"; - - var html = (await pipeline.RenderHtmlAsync(document)).EnforceLF(); - var node = GetSingleHtmlNode(html, "//pre/code"); - var output = node.Attributes["data-trydotnet-package"]; - - var fullProjectPath = directoryAccessor.GetFullyQualifiedPath(new RelativeFilePath(package)); - output.Value.Should().Be(fullProjectPath.FullName); - } - - [Theory] - [InlineData("cs", "Program.cs", "sample.csproj", "csharp")] - [InlineData("c#", "Program.cs", "sample.csproj", "csharp")] - [InlineData("fs", "Program.fs", "sample.fsproj", "fsharp")] - [InlineData("f#", "Program.fs", "sample.fsproj", "fsharp")] - public async Task Sets_the_trydotnet_language_attribute_using_the_fence_command(string fenceLanguage, string fileName, string projectName, string expectedLanguage) - { - var rootDirectory = TestAssets.SampleConsole; - var currentDir = new DirectoryInfo(Path.Combine(rootDirectory.FullName, "docs")); - var directoryAccessor = new InMemoryDirectoryAccessor(currentDir, rootDirectory) - { - ($"src/sample/{fileName}", ""), - ($"src/sample/{projectName}", "") - }; - - var pipeline = new MarkdownPipelineBuilder().UseCodeBlockAnnotations(directoryAccessor,await Default.PackageRegistry.ValueAsync()).Build(); - - var package = $"../src/sample/{projectName}"; - var document = - $@"```{fenceLanguage} --project {package} --source-file ../src/sample/{fileName} -```"; - - var html = (await pipeline.RenderHtmlAsync(document)).EnforceLF(); - - var htmlDocument = new HtmlDocument(); - htmlDocument.LoadHtml(html); - var trydotnetLanguage = htmlDocument.DocumentNode - .SelectSingleNode("//pre/code").Attributes["data-trydotnet-language"]; - - trydotnetLanguage.Value.Should().Be(expectedLanguage); - } - - [Fact] - public async Task Sets_the_trydotnet_package_attribute_using_the_passed_package_option() - { - var rootDirectoryToAddFiles = TestAssets.SampleConsole; - var workingDirectory = new DirectoryInfo(Path.Combine(rootDirectoryToAddFiles.FullName, "docs")); - var directoryAccessor = new InMemoryDirectoryAccessor(workingDirectory, rootDirectoryToAddFiles) - { - ("src/sample/Program.cs", ""), - ("src/sample/sample.csproj", "") - }; - - var (registry, package) = await _package.ValueAsync(); - var pipeline = new MarkdownPipelineBuilder().UseCodeBlockAnnotations(directoryAccessor, registry).Build(); - - var document = -$@"```cs --package {package} --source-file ../src/sample/Program.cs -```"; - - var html = (await pipeline.RenderHtmlAsync(document)).EnforceLF(); - var node = GetSingleHtmlNode(html, "//pre/code"); - var output = node.Attributes["data-trydotnet-package"]; - - output.Value.Should().Be(package); - } - - [Fact] - public async Task When_both_package_and_project_are_specified_then_package_wins() - { - var rootDirectory = TestAssets.SampleConsole; - var currentDir = new DirectoryInfo(Path.Combine(rootDirectory.FullName, "docs")); - var directoryAccessor = new InMemoryDirectoryAccessor(currentDir, rootDirectory) - { - ("src/sample/Program.cs", ""), - ("src/sample/sample.csproj", "") - }; - - var (registry, package) = await _package.ValueAsync(); - var pipeline = new MarkdownPipelineBuilder().UseCodeBlockAnnotations(directoryAccessor, registry).Build(); - - var project = "../src/sample/sample.csproj"; - var document = -$@"```cs --package {package} --project {project} --source-file ../src/sample/Program.cs -```"; - - var html = (await pipeline.RenderHtmlAsync(document)).EnforceLF(); - var node = GetSingleHtmlNode(html, "//pre/code"); - var output = node.Attributes["data-trydotnet-package"]; - - output.Value.Should().Be(package); - } - - [Fact] - public async Task Sets_the_code_in_the_pre_tag_using_the_region_specified_in_markdown() - { - var regionCode = @"Console.WriteLine(""Hello World!"");"; - var fileContent = $@"using System; - -namespace BasicConsoleApp - {{ - class Program - {{ - static void MyProgram(string[] args) - {{ - #region codeRegion - {regionCode} - #endregion - }} - }} - }}".EnforceLF(); - - - var rootDirectory = TestAssets.SampleConsole; - var directoryAccessor = new InMemoryDirectoryAccessor(rootDirectory) - { - ("Program.cs", fileContent), - ("sample.csproj", "") - }; - - var document = -@"```cs --source-file Program.cs --region codeRegion -```"; - var pipeline = new MarkdownPipelineBuilder().UseCodeBlockAnnotations(directoryAccessor,await Default.PackageRegistry.ValueAsync()).Build(); - var html = (await pipeline.RenderHtmlAsync(document)).EnforceLF(); - var node = GetSingleHtmlNode(html, "//pre/code"); - var output = node.InnerText.Trim(); - - output.Should().BeEquivalentTo($"{regionCode.HtmlEncode()}"); - } - - [Fact] - public async Task Sets_the_trydotnet_filename_using_the_filename_specified_in_the_markdown_via_source_file() - { - var rootDirectory = TestAssets.SampleConsole; - var filename = "Program.cs"; - var codeContent = @" -#region codeRegion -Console.WriteLine(""Hello World""); -#endregion"; - var directoryAccessor = new InMemoryDirectoryAccessor(rootDirectory) - { - (filename, codeContent), - ("sample.csproj", "") - }; - - var document = -$@"```cs --source-file {filename} --region codeRegion -```"; - var pipeline = new MarkdownPipelineBuilder().UseCodeBlockAnnotations(directoryAccessor,await Default.PackageRegistry.ValueAsync()).Build(); - var html = (await pipeline.RenderHtmlAsync(document)).EnforceLF(); - var node = GetSingleHtmlNode(html, "//pre/code"); - var output = node.Attributes["data-trydotnet-file-name"]; - - output.Value.Should().Be(directoryAccessor.GetFullyQualifiedPath(new RelativeFilePath(filename)).FullName); - } - - [Fact] - public async Task Sets_the_trydotnet_filename_using_the_filename_specified_in_the_markdown_via_destination_file() - { - var rootDirectory = TestAssets.SampleConsole; - var sourceFile = "Program.cs"; - var destinationFile = "EntryPoint.cs"; - var codeContent = @" -#region codeRegion -Console.WriteLine(""Hello World""); -#endregion"; - var directoryAccessor = new InMemoryDirectoryAccessor(rootDirectory) - { - (sourceFile, codeContent), - ("sample.csproj", "") - }; - - var document = - $@"```cs --source-file {sourceFile} --destination-file {destinationFile} --region codeRegion -```"; - var pipeline = new MarkdownPipelineBuilder().UseCodeBlockAnnotations(directoryAccessor,await Default.PackageRegistry.ValueAsync()).Build(); - var html = (await pipeline.RenderHtmlAsync(document)).EnforceLF(); - var node = GetSingleHtmlNode(html, "//pre/code"); - var output = node.Attributes["data-trydotnet-file-name"]; - - output.Value.Should().Be(directoryAccessor.GetFullyQualifiedPath(new RelativeFilePath(destinationFile)).FullName); - } - - [Fact] - public async Task Sets_the_trydotnet_region_using_the_region_passed_in_the_markdown() - { - var rootDirectory = TestAssets.SampleConsole; - var region = "codeRegion"; - var codeContent = $@" -#region {region} -Console.WriteLine(""Hello World""); -#endregion"; - var directoryAccessor = new InMemoryDirectoryAccessor(rootDirectory) - { - ("Program.cs", codeContent), - ("sample.csproj", "") - }; - - var document = -$@"```cs --source-file Program.cs --region {region} -```"; - var pipeline = new MarkdownPipelineBuilder().UseCodeBlockAnnotations(directoryAccessor,await Default.PackageRegistry.ValueAsync()).Build(); - var html = (await pipeline.RenderHtmlAsync(document)).EnforceLF(); - var node = GetSingleHtmlNode(html, "//pre/code"); - var output = node.Attributes["data-trydotnet-region"]; - - output.Value.Should().Be(region); - } - - [Fact] - public async Task If_the_specified_region_does_not_exist_then_an_error_message_is_shown() - { - var rootDirectory = TestAssets.SampleConsole; - var region = "noRegion"; - var directoryAccessor = new InMemoryDirectoryAccessor(rootDirectory) - { - ("Program.cs", ""), - ("sample.csproj", "") - }; - - var document = -$@"```cs --source-file Program.cs --region {region} -```"; - var pipeline = new MarkdownPipelineBuilder().UseCodeBlockAnnotations(directoryAccessor,await Default.PackageRegistry.ValueAsync()).Build(); - var html = (await pipeline.RenderHtmlAsync(document)).EnforceLF(); - var node = GetSingleHtmlNode(html, "//div[@class='notification is-danger']"); - - var expected = $"Region \"{region}\" not found in file {directoryAccessor.GetFullyQualifiedPath(new RelativeFilePath("./Program.cs"))}".HtmlEncode().ToString(); - - node.InnerHtml.Should().Contain(expected); - } - - [Fact] - public async Task If_the_specified_region_exists_more_than_once_then_an_error_is_displayed() - { - var rootDirectory = TestAssets.SampleConsole; - var codeContent = @" -#region codeRegion -#endregion -#region codeRegion -#endregion"; - var region = "codeRegion"; - var directoryAccessor = new InMemoryDirectoryAccessor(rootDirectory) - { - ("Program.cs", codeContent), - ("sample.csproj", "") - }; - - var document = - $@"```cs --source-file Program.cs --region {region} -```"; - var pipeline = new MarkdownPipelineBuilder().UseCodeBlockAnnotations(directoryAccessor,await Default.PackageRegistry.ValueAsync()).Build(); - var html = (await pipeline.RenderHtmlAsync(document)).EnforceLF(); - var pre = GetSingleHtmlNode(html, "//div[@class='notification is-danger']"); - - pre.InnerHtml.Should().Contain($"Multiple regions found: {region}"); - } - - [Fact] - public async Task Sets_the_trydotnet_session_using_the_session_passed_in_the_markdown() - { - var directoryAccessor = new InMemoryDirectoryAccessor(TestAssets.SampleConsole) - { - ("Program.cs", ""), - ("sample.csproj", "") - }; - - var session = "the-session-name"; - var document = - $@"```cs --source-file Program.cs --session {session} -```"; - var pipeline = new MarkdownPipelineBuilder() - .UseCodeBlockAnnotations(directoryAccessor,await Default.PackageRegistry.ValueAsync()) - .Build(); - - var html = (await pipeline.RenderHtmlAsync(document)).EnforceLF(); - var node = GetSingleHtmlNode(html, "//pre/code"); - var output = node.Attributes["data-trydotnet-session-id"]; - - output.Value.Should().Be(session); - } - - [Fact] - public async Task Sets_the_trydotnet_session_to_a_default_value_when_a_session_is_not_passed_in_the_markdown() - { - var directoryAccessor = new InMemoryDirectoryAccessor(TestAssets.SampleConsole) - { - ("Program.cs", ""), - ("sample.csproj", "") - }; - - var document = - @"```cs --source-file Program.cs -```"; - var pipeline = new MarkdownPipelineBuilder() - .UseCodeBlockAnnotations(directoryAccessor,await Default.PackageRegistry.ValueAsync()) - .Build(); - - var html = (await pipeline.RenderHtmlAsync(document)).EnforceLF(); - var node = GetSingleHtmlNode(html, "//pre/code"); - var output = node.Attributes["data-trydotnet-session-id"]; - - output.Value.Should().StartWith("Run"); - } - - [Fact] - public async Task Sets_a_diagnostic_if_the_package_cannot_be_found() - { - var rootDirectory = TestAssets.SampleConsole; - var currentDir = new DirectoryInfo(Path.Combine(rootDirectory.FullName, "docs")); - var directoryAccessor = new InMemoryDirectoryAccessor(currentDir, rootDirectory) - { - ("src/sample/Program.cs", ""), - ("src/sample/sample.csproj", "") - }; - - var (registry, package) = await _package.ValueAsync(); - var pipeline = new MarkdownPipelineBuilder().UseCodeBlockAnnotations(directoryAccessor, registry).Build(); - - package = "not-the-package"; - - var document = -$@"```cs --package {package} -```"; - - var html = (await pipeline.RenderHtmlAsync(document)).EnforceLF(); - var node = GetSingleHtmlNode(html, "//div[@class='notification is-danger']"); - - node.InnerHtml.Should().Contain($"Package named "{package}" not found"); - } - - [Fact] - public async Task Arguments_are_forwarded_to_the_users_program_entry_point() - { - var directoryAccessor = new InMemoryDirectoryAccessor(TestAssets.SampleConsole) - { - ("Program.cs", ""), - ("sample.csproj", ""), - ("sample.md", - @"```cs --region the-region --source-file Program.cs -- one two ""and three"" -```") - }; - - var project = new MarkdownProject(directoryAccessor, new PackageRegistry()); - - var markdownFile = project.GetAllMarkdownFiles().Single(); - - var html = await DocumentationController.SessionControlsHtml(markdownFile); - - var htmlDocument = new HtmlDocument(); - htmlDocument.LoadHtml(html.ToString()); - - var value = htmlDocument.DocumentNode - .SelectSingleNode("//button") - .Attributes["data-trydotnet-run-args"] - .Value; - - value.Should().Be("--region the-region --source-file Program.cs -- one two \"and three\"".HtmlAttributeEncode().ToString()); - } - - private static HtmlNode GetSingleHtmlNode(string html, string nodeName) - { - var htmlDocument = new HtmlDocument(); - htmlDocument.LoadHtml(html); - var node = htmlDocument?.DocumentNode?.SelectSingleNode(nodeName); - Assert.True(node != null, $"Unexpected value for `{nameof(node)}`. Html was:\r\n{html}"); - return node; - } - } -} diff --git a/MLS.Agent.Tests/Markdown/MarkdownFileTests.cs b/MLS.Agent.Tests/Markdown/MarkdownFileTests.cs deleted file mode 100644 index 73a16b6b8..000000000 --- a/MLS.Agent.Tests/Markdown/MarkdownFileTests.cs +++ /dev/null @@ -1,596 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.IO; -using FluentAssertions; -using System.Linq; -using System.Threading.Tasks; -using HtmlAgilityPack; -using Microsoft.DotNet.Try.Protocol.Tests; -using MLS.Agent.CommandLine; -using MLS.Agent.Markdown; -using WorkspaceServer.Tests; -using Xunit; -using Xunit.Abstractions; -using MLS.Agent.Tools; -using MLS.Agent.Tools.Tests; - -namespace MLS.Agent.Tests.Markdown -{ - public class MarkdownFileTests - { - public class ToHtmlContent - { - private readonly ITestOutputHelper _output; - - public ToHtmlContent(ITestOutputHelper output) - { - _output = output; - } - - [Fact] - public async Task Renders_html_content_for_the_files_in_the_root_path() - { - var html = await RenderHtml(("Readme.md", "This is a sample *markdown file*")); - - html.Should().Contain("markdown file"); - } - - [Fact] - public async Task Renders_html_content_for_files_in_subdirectories() - { - var html = await RenderHtml(("SubDirectory/Tutorial.md", "This is a sample *tutorial file*")); - - html.Should().Contain("tutorial file"); - } - - [Fact] - public async Task When_file_argument_is_specified_then_it_inserts_code_present_in_csharp_file() - { - var codeContent = @"using System; - -namespace BasicConsoleApp -{ - class Program - { - static void MyProgram(string[] args) - { - Console.WriteLine(""Hello World!""); - } - } -}".EnforceLF(); - - var html = await RenderHtml(("Program.cs", codeContent), - ("Readme.md", - @"This is a sample *markdown file* - -```cs --source-file Program.cs -```"), - ("sample.csproj", "") - ); - - html.EnforceLF().Should().Contain(codeContent.HtmlEncode().ToString()); - } - - [Fact] - public async Task When_no_source_file_argument_is_specified_then_it_does_not_replace_fenced_csharp_code() - { - var fencedCode = @"// this is the actual embedded code"; - - var html = await RenderHtml( - ("Readme.md", - $@"This is a sample *markdown file* - -```cs -{fencedCode} -```")); - - var htmlDocument = new HtmlDocument(); - htmlDocument.LoadHtml(html); - var output = htmlDocument.DocumentNode - .SelectSingleNode("//pre/code").InnerHtml.EnforceLF(); - output.Should().Be($"{fencedCode}\n"); - } - - [Fact] - public async Task Should_parse_markdown_file_and_insert_code_from_paths_relative_to_the_markdown_file() - { - var codeContent = @"using System; - -namespace BasicConsoleApp -{ - class Program - { - static void MyProgram(string[] args) - { - Console.WriteLine(""Hello World!""); - } - } -}".EnforceLF(); - - var package = "../src/sample/sample.csproj"; - - var html = await RenderHtml(("src/sample/Program.cs", codeContent), - ("src/sample/sample.csproj", ""), - ("docs/Readme.md", - $@" -```cs --project {package} --source-file ../src/sample/Program.cs -```")); - - html.EnforceLF().Should().Contain(codeContent.HtmlEncode().ToString()); - } - - [Fact] - public async Task Should_parse_markdown_file_and_set_package_with_fully_resolved_path() - { - var packagePathRelativeToBaseDir = "src/sample/sample.csproj"; - - var dirAccessor = new InMemoryDirectoryAccessor() - { - ("src/sample/Program.cs", ""), - (packagePathRelativeToBaseDir, ""), - ("docs/Readme.md", - $@"```cs --project ../{packagePathRelativeToBaseDir} --source-file ../src/sample/Program.cs -```") - }; - - var project = new MarkdownProject(dirAccessor, await Default.PackageRegistry.ValueAsync()); - project.TryGetMarkdownFile(new RelativeFilePath("docs/Readme.md"), out var markdownFile).Should().BeTrue(); - var htmlDocument = new HtmlDocument(); - htmlDocument.LoadHtml((await markdownFile.ToHtmlContentAsync()).ToString()); - var output = htmlDocument.DocumentNode - .SelectSingleNode("//pre/code").Attributes["data-trydotnet-package"]; - - var fullProjectPath = dirAccessor.GetFullyQualifiedPath(new RelativeFilePath(packagePathRelativeToBaseDir)); - output.Value.Should().Be(fullProjectPath.FullName); - } - - [Fact] - public async Task Should_include_the_code_from_source_file_and_not_the_fenced_code() - { - var codeContent = @"using System; - -namespace BasicConsoleApp -{ - class Program - { - static void MyProgram(string[] args) - { - Console.WriteLine(""Hello World!""); - } - } -}".EnforceLF(); - - var html = await RenderHtml( - ("sample.csproj", ""), - ("Program.cs", codeContent), - ("Readme.md", - @"```cs --source-file Program.cs -Console.WriteLine(""This code should not appear""); -```")); - - var htmlDocument = new HtmlDocument(); - htmlDocument.LoadHtml(html); - var output = htmlDocument.DocumentNode - .SelectSingleNode("//pre/code").InnerHtml.EnforceLF(); - - output.Should().Contain($"{codeContent.HtmlEncode()}"); - } - - [Fact] - public async Task Should_emit_include_mode_for_non_editable_blocks() - { - var codeContent = @"using System; - -namespace BasicConsoleApp -{ - class Program - { - static void MyProgram(string[] args) - { - Console.WriteLine(""Hello World!""); - } - } -}".EnforceLF(); - - var html = await RenderHtml( - ("sample.csproj", ""), - ("Program.cs", codeContent), - ("Readme.md", - @"```cs --source-file Program.cs --editable false -using System; -```")); - - var htmlDocument = new HtmlDocument(); - htmlDocument.LoadHtml(html); - var code = htmlDocument.DocumentNode - .SelectSingleNode("//pre/code"); - - var output = code.InnerHtml.EnforceLF(); - - code.Attributes["data-trydotnet-mode"].Value.Should().Be("include"); - code.ParentNode.Attributes["style"].Should().BeNull(); - - output.Should().Contain($"{codeContent.HtmlEncode()}"); - } - - [Fact] - public async Task Should_emit_replace_injection_point_for_readonly_regions_from_source_file() - { - var expectedCode = @"Console.WriteLine(""Hello World!"");"; - - var codeContent = @"using System; - -namespace BasicConsoleApp -{ - class Program - { - static void MyProgram(string[] args) - { - #region code - Console.WriteLine(""Hello World!""); - #endregion - } - } -}".EnforceLF(); - - var html = await RenderHtml( - ("sample.csproj", ""), - ("Program.cs", codeContent), - ("Readme.md", - @"```cs --source-file Program.cs --region code --editable false -using System; -```")); - - var htmlDocument = new HtmlDocument(); - htmlDocument.LoadHtml(html); - var code = htmlDocument.DocumentNode - .SelectSingleNode("//pre/code"); - - var output = code.InnerHtml.EnforceLF(); - - code.Attributes["data-trydotnet-mode"].Value.Should().Be("include"); - code.Attributes["data-trydotnet-injection-point"].Value.Should().Be("replace"); - code.ParentNode.Attributes["style"].Should().BeNull(); - - output.Should().Contain($"{expectedCode.HtmlEncode()}"); - } - - [Fact] - public async Task Should_emit_run_buttons_for_editable_blocks() - { - var codeContent = @"using System; - -namespace BasicConsoleApp -{ - class Program - { - static void MyProgram(string[] args) - { - Console.WriteLine(""Hello World!""); - } - } -}".EnforceLF(); - - var html = await RenderHtml( - ("sample.csproj", ""), - ("Program.cs", codeContent), - ("Readme.md", - @"```cs --source-file Program.cs -Console.WriteLine(""Hello world""); -```")); - - var htmlDocument = new HtmlDocument(); - htmlDocument.LoadHtml(html); - var buttons = htmlDocument.DocumentNode - .SelectSingleNode("//button"); - - buttons.Attributes["data-trydotnet-mode"].Value.Should().Be("run"); - } - - [Fact] - public async Task Should_not_emit_run_button_for_non_editable_blocks() - { - var codeContent = @"using System; - -namespace BasicConsoleApp -{ - class Program - { - static void MyProgram(string[] args) - { - Console.WriteLine(""Hello World!""); - } - } -}".EnforceLF(); - - var html = await RenderHtml( - ("sample.csproj", ""), - ("Program.cs", codeContent), - ("Readme.md", - @"```cs --source-file Program.cs --editable false -using System; -```")); - - var htmlDocument = new HtmlDocument(); - htmlDocument.LoadHtml(html); - var buttons = htmlDocument.DocumentNode - .SelectNodes("//button"); - - buttons.Should().BeNull(); - } - - [Fact] - public async Task Should_emit_math_inline_block_rendering() - { - var html = await RenderHtml( - ("Readme.md", @"this is math inline $$\sum ^{n}_{i=0}\left(x_{i}+a_{i}y_{i}\right)$$")); - - var htmlDocument = new HtmlDocument(); - htmlDocument.LoadHtml(html); - - var math = htmlDocument.DocumentNode - .SelectSingleNode("//span"); - - math.HasClass("math").Should().BeTrue(); - math.InnerText.Should().Match(@"\(\sum ^{n}_{i=0}\left(x_{i}+a_{i}y_{i}\right)\)"); - } - - [Fact] - public async Task Should_emit_math_block_rendering() - { - var html = await RenderHtml( - ("Readme.md", @"$$ -\begin{equation} - \int_0^\infty \frac{x^3}{e^x-1}\,dx = \frac{\pi^4}{15} - \label{eq:sample} -\end{equation} -$$")); - - var htmlDocument = new HtmlDocument(); - htmlDocument.LoadHtml(html); - - var math = htmlDocument.DocumentNode - .SelectSingleNode("//div"); - - math.HasClass("math").Should().BeTrue(); - math.InnerText.EnforceLF().Should().Match(@" -\[ -\begin{equation} - \int_0^\infty \frac{x^3}{e^x-1}\,dx = \frac{\pi^4}{15} - \label{eq:sample} -\end{equation} -\]".EnforceLF()); - } - - [Fact] - public async Task Should_emit_pre_style_for_hidden_blocks() - { - var codeContent = @"using System; - -namespace BasicConsoleApp -{ - class Program - { - static void MyProgram(string[] args) - { - Console.WriteLine(""Hello World!""); - } - } -}".EnforceLF(); - - var html = await RenderHtml( - ("sample.csproj", ""), - ("Program.cs", codeContent), - ("Readme.md", - @"```cs --source-file Program.cs --editable false --hidden -Console.WriteLine(""This code should not appear""); -```")); - - var htmlDocument = new HtmlDocument(); - htmlDocument.LoadHtml(html); - - var code = htmlDocument.DocumentNode - .SelectSingleNode("//pre/code"); - - var output = code.InnerHtml.EnforceLF(); - - code.Attributes["data-trydotnet-mode"].Value.Should().Match("include"); - - code.ParentNode.Attributes["style"].Value.Should().Match("border:none; margin:0px; padding:0px; visibility:hidden; display: none;"); - - output.Should().Contain($"{codeContent.HtmlEncode()}"); - } - - [Fact] - public async Task Should_enforce_editable_false_for_hidden_blocks() - { - var codeContent = @"using System; - -namespace BasicConsoleApp -{ - class Program - { - static void MyProgram(string[] args) - { - Console.WriteLine(""Hello World!""); - } - } -}".EnforceLF(); - - var html = await RenderHtml( - ("sample.csproj", ""), - ("Program.cs", codeContent), - ("Readme.md", - @"```cs --source-file Program.cs --hidden -Console.WriteLine(""This code should not appear""); -```")); - - var htmlDocument = new HtmlDocument(); - htmlDocument.LoadHtml(html); - - var code = htmlDocument.DocumentNode - .SelectSingleNode("//pre/code"); - - var output = code.InnerHtml.EnforceLF(); - - code.Attributes["data-trydotnet-mode"].Value.Should().Match("include"); - - code.ParentNode.Attributes["style"].Value.Should().Match("border:none; margin:0px; padding:0px; visibility:hidden; display: none;"); - - output.Should().Contain($"{codeContent.HtmlEncode()}"); - } - - [Fact] - public async Task Multiple_fenced_code_blocks_are_correctly_rendered() - { - var region1Code = @"Console.WriteLine(""I am region one code"");"; - var region2Code = @"Console.WriteLine(""I am region two code"");"; - var codeContent = $@"using System; - -namespace BasicConsoleApp -{{ - class Program - {{ - static void MyProgram(string[] args) - {{ - #region region1 - {region1Code} - #endregion - - #region region2 - {region2Code} - #endregion - }} - }} -}}".EnforceLF(); - - var html = await RenderHtml(("sample.csproj", ""), - ("Program.cs", codeContent), - ("Readme.md", - @"This is a markdown file with two regions -This is region 1 -```cs --source-file Program.cs --region region1 -//This part should not be included -``` -This is region 2 -```cs --source-file Program.cs --region region2 -//This part should not be included as well -``` -This is the end of the file")); - var htmlDocument = new HtmlDocument(); - htmlDocument.LoadHtml(html); - var codeNodes = htmlDocument.DocumentNode.SelectNodes("//pre/code"); - - codeNodes.Should().HaveCount(2); - codeNodes[0].InnerHtml.Should().Contain($"{region1Code.HtmlEncode()}"); - codeNodes[1].InnerHtml.Should().Contain($"{region2Code.HtmlEncode()}"); - } - - [Fact] - public async Task Non_editable_code_inserts_code_present_in_markdown() - { - var html = await RenderHtml(("readme.md", @" -```cs --editable false --package console -//some code to include -``` - ")); - - var htmlDocument = new HtmlDocument(); - htmlDocument.LoadHtml(html); - - var codeNodes = htmlDocument.DocumentNode.SelectNodes("//pre/code[@data-trydotnet-mode='include']"); - codeNodes.Should().HaveCount(1); - - codeNodes.Single().InnerText.Should().Match(@"*//some code to include*"); - } - - [Fact] - public async Task Annotated_console_blocks_do_not_produce_HTML_elements() - { - var codeContent = $@"using System; - -namespace BasicConsoleApp -{{ - class Program - {{ - static void MyProgram(string[] args) - {{ - #region abc - Console.WriteLine(""conca"" + ""tenated""); - #endregion - - }} - }} -}}".EnforceLF(); - - var html = await RenderHtml( - ("readme.md", @" -```cs --source-file Program.cs --region abc --session 123 -``` -```console --session 123 -concatenated -``` -"), - ("Program.cs", codeContent), - ("sample.csproj", "")); - - html.Should().NotContain("
"); - html.Should().NotContain("concatenated"); - } - - [Fact] - public async Task Package_option_defaults_to_startup_options() - { - const string expectedPackage = "console"; - const string expectedPackageVersion = "1.2.3"; - - var defaultCodeBlockAnnotations = new StartupOptions( - package: expectedPackage, - packageVersion: expectedPackageVersion); - var project = new MarkdownProject( - new InMemoryDirectoryAccessor(new DirectoryInfo(Directory.GetCurrentDirectory())) - { - ("readme.md", @" -```cs --source-file Program.cs -``` - "), - ("Program.cs", "") - }, - await Default.PackageRegistry.ValueAsync(), - defaultCodeBlockAnnotations - ); - - var html = (await project.GetAllMarkdownFiles() - .Single() - .ToHtmlContentAsync()) - .ToString(); - - html.Should() - .Contain($"data-trydotnet-package=\"{expectedPackage}\" data-trydotnet-package-version=\"{expectedPackageVersion}\""); - } - - protected async Task RenderHtml(params (string, string)[] project) - { - var directoryAccessor = new InMemoryDirectoryAccessor(new DirectoryInfo(Directory.GetCurrentDirectory())); - - foreach (var valueTuple in project) - { - directoryAccessor.Add(valueTuple); - } - - var markdownProject = new MarkdownProject( - directoryAccessor, - await Default.PackageRegistry.ValueAsync()); - - var markdownFile = markdownProject.GetAllMarkdownFiles().Single(); - var html = (await markdownFile.ToHtmlContentAsync()).ToString(); - - _output.WriteLine(html); - - return html; - } - } - } -} \ No newline at end of file diff --git a/MLS.Agent.Tests/Markdown/MarkdownProjectTests.cs b/MLS.Agent.Tests/Markdown/MarkdownProjectTests.cs deleted file mode 100644 index 03218bb79..000000000 --- a/MLS.Agent.Tests/Markdown/MarkdownProjectTests.cs +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.IO; -using FluentAssertions; -using System.Linq; -using Xunit; -using WorkspaceServer; -using System.Threading.Tasks; -using Microsoft.DotNet.Try.Markdown; -using MLS.Agent.Markdown; -using WorkspaceServer.Tests; -using MLS.Agent.Tools; -using MLS.Agent.Tools.Tests; - -namespace MLS.Agent.Tests -{ - public class MarkdownProjectTests - { - public class GetAllMarkdownFiles - { - [Fact] - public async Task Returns_list_of_all_relative_paths_to_all_markdown_files() - { - var dirAccessor = new InMemoryDirectoryAccessor() - { - ("Readme.md", ""), - ("Subdirectory/Tutorial.md", ""), - ("Program.cs", "") - }; - - var project = new MarkdownProject(dirAccessor, await Default.PackageRegistry.ValueAsync()); - - var files = project.GetAllMarkdownFiles(); - - files.Should().HaveCount(2); - files.Should().Contain(f => f.Path.Value.Equals("./Readme.md")); - files.Should().Contain(f => f.Path.Value.Equals("./Subdirectory/Tutorial.md")); - } - } - - public class TryGetMarkdownFile - { - [Fact] - public async Task Returns_false_for_nonexistent_file() - { - var workingDir = TestAssets.SampleConsole; - var dirAccessor = new InMemoryDirectoryAccessor(workingDir); - var project = new MarkdownProject(dirAccessor, await Default.PackageRegistry.ValueAsync()); - var path = new RelativeFilePath("DOESNOTEXIST"); - - project.TryGetMarkdownFile(path, out _).Should().BeFalse(); - } - } - - public class GetAllProjects - { - [Fact] - public async Task Returns_all_projects_referenced_from_all_markdown_files() - { - var project = new MarkdownProject( - new InMemoryDirectoryAccessor(new DirectoryInfo(Directory.GetCurrentDirectory())) - { - ("readme.md", @" -```cs --project ../Project1/Console1.csproj -``` -```cs --project ../Project2/Console2.csproj -``` - "), - ("../Project1/Console1.csproj", @""), - ("../Project2/Console2.csproj", @"") - }, - await Default.PackageRegistry.ValueAsync()); - - var markdownFiles = project.GetAllMarkdownFiles(); - - var annotatedCodeBlocks = await Task.WhenAll(markdownFiles.Select(f => f.GetAnnotatedCodeBlocks())); - - annotatedCodeBlocks - .SelectMany(f => f) - .Select(block => block.Annotations) - .OfType() - .Select(b => b.Project) - .Should() - .Contain(p => p.Directory.Name == "Project1") - .And - .Contain(p => p.Directory.Name == "Project2"); - } - } - } -} \ No newline at end of file diff --git a/MLS.Agent.Tests/ProjectFilePackageDiscoveryStrategyTests.cs b/MLS.Agent.Tests/ProjectFilePackageDiscoveryStrategyTests.cs deleted file mode 100644 index 05caefb50..000000000 --- a/MLS.Agent.Tests/ProjectFilePackageDiscoveryStrategyTests.cs +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using FluentAssertions; -using System.Linq; -using System.Threading.Tasks; -using WorkspaceServer.Packaging; -using WorkspaceServer.Tests; -using Xunit; - -namespace MLS.Agent.Tests -{ - public class ProjectFilePackageDiscoveryStrategyTests - { - [Fact] - public async Task Discover_package_from_project_file() - { - var strategy = new ProjectFilePackageDiscoveryStrategy(false); - var sampleProject = (await Create.ConsoleWorkspaceCopy()).Directory; - var projectFile = sampleProject.GetFiles("*.csproj").Single(); - var packageBuilder = await strategy.Locate(new PackageDescriptor(projectFile.FullName)); - - packageBuilder.PackageName.Should().Be(projectFile.FullName); - packageBuilder.Directory.FullName.Should().Be(sampleProject.FullName); - } - } -} \ No newline at end of file diff --git a/MLS.Agent.Tests/Properties/AssemblyInfo.cs b/MLS.Agent.Tests/Properties/AssemblyInfo.cs deleted file mode 100644 index d4983a59a..000000000 --- a/MLS.Agent.Tests/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using Xunit; - -[assembly: CollectionBehavior(DisableTestParallelization = true)] \ No newline at end of file diff --git a/MLS.Agent.Tests/ProxyTests.cs b/MLS.Agent.Tests/ProxyTests.cs deleted file mode 100644 index db833a27c..000000000 --- a/MLS.Agent.Tests/ProxyTests.cs +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using FluentAssertions; -using System; -using System.Collections.Generic; -using System.Net.Http; -using System.Text; -using System.Threading.Tasks; -using Xunit; - -namespace MLS.Agent.Tests -{ - public class ProxyTests - { - [Fact] - public async Task XForwardedPathBase_is_prepended_to_request_url() - { - using (var service = new AgentService()) - { - var message = new HttpRequestMessage(HttpMethod.Get, "/"); - message.Headers.Add("X-Forwarded-PathBase", "/LocalCodeRunner/blazor-console"); - - var expected = @" - - - - - - - - Loading... - - - - - -"; - - var result = await service.SendAsync(message); - var content = await result.Content.ReadAsStringAsync(); - content.Should().Be(expected); - - } - } - } -} diff --git a/MLS.Agent.Tests/StringExtensions.cs b/MLS.Agent.Tests/StringExtensions.cs deleted file mode 100644 index 9a4d664cc..000000000 --- a/MLS.Agent.Tests/StringExtensions.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using Microsoft.DotNet.Try.Protocol.Tests; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -namespace MLS.Agent.Tests -{ - internal static class StringExtensions - { - public static string FormatJson(this string value) - { - var s = JToken.Parse(value).ToString(Formatting.Indented); - return s.EnforceLF(); - } - } -} \ No newline at end of file diff --git a/MLS.Agent.Tests/WebHostBuilderExtensionTests.cs b/MLS.Agent.Tests/WebHostBuilderExtensionTests.cs deleted file mode 100644 index c5ad57c9e..000000000 --- a/MLS.Agent.Tests/WebHostBuilderExtensionTests.cs +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using FluentAssertions; -using MLS.Agent.CommandLine; -using System.Linq; -using System.Net.NetworkInformation; -using Xunit; -namespace MLS.Agent.Tests -{ - public class WebHostBuilderExtensionTests - { - [Theory] - [InlineData(StartupMode.Try)] - [InlineData(StartupMode.Hosted)] - public void If_port_is_not_specified_a_free_port_is_returned(StartupMode mode) - { - var uri = WebHostBuilderExtensions.GetBrowserLaunchUri(mode, null); - CheckIfPortIsAvailable(uri.Port).Should().BeTrue(); - } - - [Theory] - [InlineData(StartupMode.Try)] - [InlineData(StartupMode.Hosted)] - public void If_a_port_it_specified_it_is_used(StartupMode mode) - { - var uri = WebHostBuilderExtensions.GetBrowserLaunchUri(mode, 6000); - uri.Port.Should().Be(6000); - } - - [Fact] - public void In_try_mode_host_should_be_localhost() - { - var uri = WebHostBuilderExtensions.GetBrowserLaunchUri(StartupMode.Try, 6000); - uri.Host.Should().Be("localhost"); - } - - [Fact] - public void In_try_mode_scheme_should_be_https() - { - var uri = WebHostBuilderExtensions.GetBrowserLaunchUri(StartupMode.Try, 6000); - uri.Scheme.Should().Be("https"); - } - - [Fact] - public void In_hosted_mode_host_should_be_star() - { - var uri = WebHostBuilderExtensions.GetBrowserLaunchUri(StartupMode.Hosted, 6000); - uri.Host.Should().Be("*"); - } - - [Fact] - public void In_hosted_mode_scheme_should_be_http() - { - var uri = WebHostBuilderExtensions.GetBrowserLaunchUri(StartupMode.Hosted, 6000); - uri.Scheme.Should().Be("http"); - } - - private static bool CheckIfPortIsAvailable(ushort port) - { - // Evaluate current system tcp connections. This is the same information provided - // by the netstat command line application, just in .Net strongly-typed object - // form. We will look through the list, and if our port we would like to use - // in our TcpClient is occupied, we will set isAvailable to false. - IPGlobalProperties ipGlobalProperties = IPGlobalProperties.GetIPGlobalProperties(); - TcpConnectionInformation[] tcpConnInfoArray = ipGlobalProperties.GetActiveTcpConnections(); - - return tcpConnInfoArray.FirstOrDefault(tcpi => tcpi.LocalEndPoint.Port == port) == null; - } - } -} diff --git a/MLS.Agent.Tests/WorkspaceDiscoveryTests.cs b/MLS.Agent.Tests/WorkspaceDiscoveryTests.cs deleted file mode 100644 index 8987f6d4a..000000000 --- a/MLS.Agent.Tests/WorkspaceDiscoveryTests.cs +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using Recipes; -using System; -using System.CommandLine; -using System.CommandLine.IO; -using System.IO; -using System.Threading.Tasks; -using Clockwise; -using FluentAssertions.Extensions; -using Microsoft.DotNet.Try.Protocol; -using Microsoft.DotNet.Try.Protocol.Tests; -using MLS.Agent.CommandLine; -using WorkspaceServer.Packaging; -using WorkspaceServer.Tests; -using Xunit; -using Xunit.Abstractions; -using Buffer = Microsoft.DotNet.Try.Protocol.Buffer; -using File = Microsoft.DotNet.Try.Protocol.File; -using MLS.Agent.Tools; - -namespace MLS.Agent.Tests -{ - public class WorkspaceDiscoveryTests : ApiViaHttpTestsBase - { - public WorkspaceDiscoveryTests(ITestOutputHelper output) : base(output) - { - } - - [Fact] - public async Task Local_tool_workspace_can_be_discovered() - { - var console = new TestConsole(); - var (packageName, packageLocation) = await CreateLocalTool(console); - - var output = Guid.NewGuid().ToString(); - var requestJson = Create.SimpleWorkspaceRequestAsJson(output, packageName); - - var response = await CallRun(requestJson, options: new StartupOptions(addPackageSource: new PackageSource(packageLocation.FullName), rootDirectory: new FileSystemDirectoryAccessor(Directory.GetCurrentDirectory()))); - var result = await response - .EnsureSuccess() - .DeserializeAs(); - - result.ShouldSucceedWithOutput(output); - } - - [Fact] - public async Task Project_file_path_workspace_can_be_discovered_and_run_with_buffer_inlining() - { - var package = Create.EmptyWorkspace("a space"); - var build = await Create.NewPackage(package.Name, package.Directory, Create.ConsoleConfiguration) as IHaveADirectory; - - var workspace = build.Directory; - var csproj = workspace.GetFiles("*.csproj")[0]; - var programCs = workspace.GetFiles("*.cs")[0]; - - var output = Guid.NewGuid().ToString(); - var ws = new Workspace( - files: new[] { new File(programCs.FullName, SourceCodeProvider.ConsoleProgramSingleRegion) }, - buffers: new[] { new Buffer(new BufferId(programCs.FullName, "alpha"), $"Console.WriteLine(\"{output}\");") }, - workspaceType: csproj.FullName); - - var requestJson = new WorkspaceRequest(ws, requestId: "TestRun").ToJson(); - - var response = await CallRun(requestJson); - var result = await response - .EnsureSuccess() - .DeserializeAs(); - - result.ShouldSucceedWithOutput(output); - } - - private async Task<(string packageName, DirectoryInfo packageLocation)> CreateLocalTool(IConsole console) - { - // Keep project name short to work around max path issues - var projectName = Guid.NewGuid().ToString("N").Substring(0, 8); - var build = await Create.NewPackage(projectName, Create.ConsoleConfiguration) as IHaveADirectory; - - var ws = await ((ICreateWorkspaceForRun)build).CreateRoslynWorkspaceForRunAsync(new TimeBudget(30.Seconds())); - var packageLocation = new DirectoryInfo( - Path.Combine(build.Directory.FullName, "pack-output")); - - var packageName = await PackCommand.Do( - new PackOptions( - build.Directory, - outputDirectory: packageLocation, - enableWasm: false), - console); - - return (packageName, packageLocation); - } - } -} diff --git a/MLS.Agent.Tests/WorkspaceRequestTests.cs b/MLS.Agent.Tests/WorkspaceRequestTests.cs deleted file mode 100644 index 7903b47a6..000000000 --- a/MLS.Agent.Tests/WorkspaceRequestTests.cs +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using FluentAssertions; -using Microsoft.DotNet.Try.Protocol; -using Recipes; -using WorkspaceServer.Tests; -using Xunit; -using Buffer = Microsoft.DotNet.Try.Protocol.Buffer; - -namespace MLS.Agent.Tests -{ - public class WorkspaceRequestTests - { - [Fact] - public void webrequest_must_have_verb() - { - var action = new Action(() => - { - var wr = new HttpRequest(@"/handler", string.Empty); - }); - action.Should().Throw(); - } - - [Fact] - public void webrequest_must_have_relative_url() - { - var action = new Action(() => - { - var wr = new HttpRequest(@"http://www.microsoft.com", "post"); - }); - action.Should().Throw(); - } - - [Fact] - public void When_ActiveBufferId_is_not_specified_and_there_is_only_one_buffer_then_it_returns_that_buffers_id() - { - var request = new WorkspaceRequest( - new Workspace( - buffers: new[] - { - new Buffer("the.only.buffer.cs", "its content", 123) - }), - requestId: "TestRun"); - - request.ActiveBufferId.Should().Be(BufferId.Parse("the.only.buffer.cs")); - } - - [Fact] - public void WorkspaceRequest_deserializes_from_JSON() - { - var (processed, position) = CodeManipulation.ProcessMarkup("Console.WriteLine($$)"); - - var original = new WorkspaceRequest( - activeBufferId: BufferId.Parse("default.cs"), - workspace: Workspace.FromSource( - processed, - "script", - id: "default.cs", - position: position), requestId: "TestRun"); - - var json = original.ToJson(); - - var deserialized = json.FromJsonTo(); - - deserialized.Should().BeEquivalentTo(original); - } - } -} diff --git a/MLS.Agent.Tests/index.ts b/MLS.Agent.Tests/index.ts deleted file mode 100644 index a2b882f99..000000000 --- a/MLS.Agent.Tests/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -import * as path from "path"; -import * as fs from "fs"; - -//Read the expected approval file as json and return the result -export function GetExpectedResultASJSON(filename: string) { - let testDir = path.resolve(process.cwd(),"node_modules", "mls-agent-results", filename); - return JSON.parse(fs.readFileSync(testDir).toString()); -} \ No newline at end of file diff --git a/MLS.Agent.Tests/package-lock.json b/MLS.Agent.Tests/package-lock.json deleted file mode 100644 index 182ebec91..000000000 --- a/MLS.Agent.Tests/package-lock.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "mls-agent-results", - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "@types/node": { - "version": "10.12.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.12.tgz", - "integrity": "sha512-Pr+6JRiKkfsFvmU/LK68oBRCQeEg36TyAbPhc2xpez24OOZZCuoIhWGTd39VZy6nGafSbxzGouFPTFD/rR1A0A==" - } - } -} diff --git a/MLS.Agent.Tests/package.json b/MLS.Agent.Tests/package.json deleted file mode 100644 index 9571b55f8..000000000 --- a/MLS.Agent.Tests/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "mls-agent-results", - "description": "Package to verify if the agent and the simulator in the client are in sync", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "files": [ - "dist", - "*.approved.json" - ], - "scripts": { - "build": "tsc" - }, - "repository": { - "type": "git", - "url": "https://msazure.visualstudio.com/DefaultCollection/One/_git/MLS-Agent" - }, - "author": "MLS-Dev", - "license": "ISC", - "dependencies": { - "@types/node": "^10.12.12" - } -} diff --git a/MLS.Agent.Tests/tsconfig.json b/MLS.Agent.Tests/tsconfig.json deleted file mode 100644 index 296e1afcc..000000000 --- a/MLS.Agent.Tests/tsconfig.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "compilerOptions": { - /* Basic Options */ - "target": "es2015", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ - "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ - // "lib": [], /* Specify library files to be included in the compilation. */ - // "allowJs": true, /* Allow javascript files to be compiled. */ - // "checkJs": true, /* Report errors in .js files. */ - // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ - "declaration": true, /* Generates corresponding '.d.ts' file. */ - // "sourceMap": true, /* Generates corresponding '.map' file. */ - // "outFile": "./", /* Concatenate and emit output to single file. */ - "outDir": "dist", /* Redirect output structure to the directory. */ - // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ - // "removeComments": true, /* Do not emit comments to output. */ - // "noEmit": true, /* Do not emit outputs. */ - // "importHelpers": true, /* Import emit helpers from 'tslib'. */ - // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ - // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ - - /* Strict Type-Checking Options */ - "strict": true, /* Enable all strict type-checking options. */ - // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* Enable strict null checks. */ - // "strictFunctionTypes": true, /* Enable strict checking of function types. */ - // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ - // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ - // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ - - /* Additional Checks */ - // "noUnusedLocals": true, /* Report errors on unused locals. */ - // "noUnusedParameters": true, /* Report errors on unused parameters. */ - // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - - /* Module Resolution Options */ - // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ - // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ - // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ - // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ - // "typeRoots": [], /* List of folders to include type definitions from. */ - "types": ["node"], /* Type declaration files to be included in compilation. */ - // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ - "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ - // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ - - /* Source Map Options */ - // "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ - // "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ - // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ - - /* Experimental Options */ - // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ - // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ - } -} \ No newline at end of file diff --git a/MLS.Agent.Tools.Tests/DirectoryAccessorTests.cs b/MLS.Agent.Tools.Tests/DirectoryAccessorTests.cs deleted file mode 100644 index 2bdd6d418..000000000 --- a/MLS.Agent.Tools.Tests/DirectoryAccessorTests.cs +++ /dev/null @@ -1,350 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.IO; -using System.Runtime.CompilerServices; -using FluentAssertions; -using Microsoft.DotNet.PlatformAbstractions; -using MLS.Agent.Tools; -using MLS.Agent.Tools.Tests; -using Xunit; -using static Microsoft.DotNet.PlatformAbstractions.RuntimeEnvironment; - -namespace MLS.Agent.Tests.Markdown -{ - public abstract class DirectoryAccessorTests - { - public abstract IDirectoryAccessor GetDirectory(DirectoryInfo dirInfo, DirectoryInfo rootDirectoryToAddFiles = null); - - public abstract IDirectoryAccessor CreateDirectory([CallerMemberName]string testName = null); - - [Fact] - public void It_can_retrieve_all_files_recursively() - { - var directory = GetDirectory(TestAssets.SampleConsole); - - var files = directory.GetAllFilesRecursively(); - - files.Should() - .Contain(new RelativeFilePath("BasicConsoleApp.csproj")) - .And - .Contain(new RelativeFilePath("Program.cs")) - .And - .Contain(new RelativeFilePath("Readme.md")) - .And - .Contain(new RelativeFilePath("Subdirectory/AnotherProgram.cs")) - .And - .Contain(new RelativeFilePath("Subdirectory/Tutorial.md")); - } - - [Fact] - public void It_can_retrieve_all_files_at_root() - { - var directory = GetDirectory(TestAssets.SampleConsole); - - var files = directory.GetAllFiles(); - - files.Should() - .Contain(new RelativeFilePath("BasicConsoleApp.csproj")) - .And - .Contain(new RelativeFilePath("Program.cs")) - .And - .Contain(new RelativeFilePath("Readme.md")) - .And - .NotContain(new RelativeFilePath("Subdirectory/AnotherProgram.cs")) - .And - .NotContain(new RelativeFilePath("Subdirectory/Tutorial.md")); - } - - [Fact] - public void GetAllFilesRecursively_does_not_return_directories() - { - var directory = GetDirectory(TestAssets.SampleConsole); - - var files = directory.GetAllFilesRecursively(); - - files.Should().NotContain(f => f.Value.EndsWith("Subdirectory")); - files.Should().NotContain(f => f.Value.EndsWith("Subdirectory/")); - } - - [Fact] - public void It_can_retrieve_all_directories_recursively() - { - var directory = GetDirectory(TestAssets.SampleConsole); - - var directories = directory.GetAllDirectoriesRecursively(); - - directories.Should() - .Contain(new RelativeDirectoryPath("Subdirectory")); - } - - [Fact] - public void GetAllDirectoriesRecursively_does_not_return_files() - { - var directory = GetDirectory(TestAssets.SampleConsole); - - var directories = directory.GetAllDirectoriesRecursively(); - - directories.Should() - .NotContain(d => d.Value.EndsWith("BasicConsoleApp.csproj")) - .And - .NotContain(d => d.Value.EndsWith("Program.cs")) - .And - .NotContain(d => d.Value.EndsWith("Readme.md")) - .And - .NotContain(d => d.Value.EndsWith("Subdirectory/AnotherProgram.cs")) - .And - .NotContain(d => d.Value.EndsWith("Subdirectory/Tutorial.md")); - } - - [Theory] - [InlineData(".")] - [InlineData("./Subdirectory")] - public void When_the_directory_exists_DirectoryExists_returns_true(string path) - { - var directoryAccessor = GetDirectory(TestAssets.SampleConsole); - - directoryAccessor.DirectoryExists(path).Should().BeTrue(); - } - - [Theory] - [InlineData(".")] - [InlineData("Subdirectory")] - public void It_can_ensure_a_directory_exists(string path) - { - var directoryAccessor = CreateDirectory(); - - directoryAccessor.EnsureDirectoryExists(path); - - directoryAccessor.DirectoryExists(path).Should().BeTrue(); - } - - [Fact] - public void EnsureDirectoryExists_is_idempotent() - { - var directoryAccessor = CreateDirectory(); - - var subdirectory = "./a-subdirectory"; - - directoryAccessor.EnsureDirectoryExists(subdirectory); - - directoryAccessor - .Invoking(d => d.EnsureDirectoryExists(subdirectory)) - .Should() - .NotThrow(); - } - - [Theory] - [InlineData("./some-file.txt", "hello!")] - public void It_can_write_text_to_a_file(string path, string text) - { - var directory = CreateDirectory(); - - directory.WriteAllText(path, text); - - directory.ReadAllText(path).Should().Be(text); - } - - [Fact] - public void It_can_overwrite_an_existing_file() - { - var directory = CreateDirectory(); - - directory.WriteAllText("./some-file.txt", "original text"); - directory.WriteAllText("./some-file.txt", "updated text"); - - directory.ReadAllText("./some-file.txt").Should().Be("updated text"); - - } - - [Fact] - public void When_the_file_exists_FileExists_returns_true() - { - var testDir = TestAssets.SampleConsole; - GetDirectory(testDir).FileExists(new RelativeFilePath("Program.cs")).Should().BeTrue(); - } - - [Fact] - public void When_the_filepath_is_null_FileExists_returns_false() - { - var testDir = TestAssets.SampleConsole; - GetDirectory(testDir).Invoking(d => d.FileExists(null)).Should().Throw(); - } - - [Theory] - [InlineData(@"Subdirectory/AnotherProgram.cs")] - [InlineData(@"Subdirectory\AnotherProgram.cs")] - public void When_the_filepath_contains_subdirectory_paths_FileExists_returns_true(string filepath) - { - var testDir = TestAssets.SampleConsole; - GetDirectory(testDir).FileExists(new RelativeFilePath(filepath)).Should().BeTrue(); - } - - [Theory] - [InlineData(@"../Program.cs")] - [InlineData(@"..\Program.cs")] - public void When_the_filepath_contains_a_path_that_looks_upward_in_tree_then_FileExists_returns_the_text(string filePath) - { - var rootDirectoryToAddFiles = TestAssets.SampleConsole; - var testDir = new DirectoryInfo(Path.Combine(rootDirectoryToAddFiles.FullName, "Subdirectory")); - GetDirectory(testDir, rootDirectoryToAddFiles).FileExists(new RelativeFilePath(filePath)).Should().BeTrue(); - } - - [Fact] - public void When_the_filepath_contains_an_existing_file_ReadAllText_returns_the_text() - { - var testDir = TestAssets.SampleConsole; - GetDirectory(testDir).ReadAllText(new RelativeFilePath("Program.cs")).Should().Contain("Hello World!"); - } - - [Theory] - [InlineData(@"Subdirectory/AnotherProgram.cs")] - [InlineData(@"Subdirectory\AnotherProgram.cs")] - public void When_the_filepath_contains_an_existing_file_from_subdirectory_then_ReadAllText_returns_the_text(string filePath) - { - var testDir = TestAssets.SampleConsole; - GetDirectory(testDir).ReadAllText(new RelativeFilePath(filePath)).Should().Contain("Hello from Another Program!"); - } - - [Theory] - [InlineData(@"../Program.cs")] - [InlineData(@"..\Program.cs")] - public void When_the_filepath_contains_a_path_that_looks_upward_in_tree_then_ReadAllText_returns_the_text(string filePath) - { - var rootDirectoryToAddFiles = TestAssets.SampleConsole; - var testDir = new DirectoryInfo(Path.Combine(rootDirectoryToAddFiles.FullName, "Subdirectory")); - var value = GetDirectory(testDir, rootDirectoryToAddFiles).ReadAllText(new RelativeFilePath(filePath)); - value.Should().Contain("Hello World!"); - } - - [Fact] - public void Should_return_a_directory_accessor_for_a_relative_path() - { - var rootDir = TestAssets.SampleConsole; - var outerDirAccessor = GetDirectory(rootDir); - var inner = outerDirAccessor.GetDirectoryAccessorForRelativePath(new RelativeDirectoryPath("Subdirectory")); - inner.FileExists(new RelativeFilePath("AnotherProgram.cs")).Should().BeTrue(); - } - - [Fact] - public void Path_separators_are_uniform() - { - var directory = GetDirectory(TestAssets.SampleConsole); - var unexpectedPathSeparator = OperatingSystemPlatform == Platform.Windows - ? "/" - : "\\"; - - foreach (var relativePath in directory.GetAllFilesRecursively()) - { - var fullyQualifiedPath = directory.GetFullyQualifiedPath(relativePath).FullName; - fullyQualifiedPath.Should().NotContain(unexpectedPathSeparator); - } - } - - [Fact] - public void It_can_make_a_directory_accessor_from_an_absolute_DirectoryInfo() - { - - var directory = GetDirectory(TestAssets.SampleConsole); - - var fullyQualifiedSubdirectory = new DirectoryInfo(directory.GetFullyQualifiedFilePath("./Subdirectory/").FullName); - - var subdirectory = directory.GetDirectoryAccessorFor(fullyQualifiedSubdirectory); - - subdirectory.FileExists("Tutorial.md").Should().BeTrue(); - } - } - - public class FileSystemDirectoryAccessorTests : DirectoryAccessorTests - { - public override IDirectoryAccessor CreateDirectory([CallerMemberName]string testName = null) - { - var directory = PackageUtilities.CreateDirectory(testName); - - return new FileSystemDirectoryAccessor(directory); - } - - public override IDirectoryAccessor GetDirectory(DirectoryInfo directoryInfo, DirectoryInfo rootDirectoryToAddFiles = null) - { - return new FileSystemDirectoryAccessor(directoryInfo); - } - } - - public class InMemoryDirectoryAccessorTests : DirectoryAccessorTests - { - public override IDirectoryAccessor CreateDirectory([CallerMemberName]string testName = null) - { - return new InMemoryDirectoryAccessor(); - } - - [Theory] - [InlineData("one")] - [InlineData("./one")] - [InlineData("./one/two")] - [InlineData("./one/two/three")] - public void DirectoryExists_returns_true_for_parent_directories_of_explicitly_added_relative_file_paths(string relativeDirectoryPath) - { - var directory = new InMemoryDirectoryAccessor - { - ("./one/two/three/file.txt", "") - }; - - directory.DirectoryExists(relativeDirectoryPath).Should().BeTrue(); - } - - public override IDirectoryAccessor GetDirectory(DirectoryInfo rootDirectory, DirectoryInfo rootDirectoryToAddFiles = null) - { - return new InMemoryDirectoryAccessor(rootDirectory, rootDirectoryToAddFiles) - { - ("BasicConsoleApp.csproj", -@" - - - Exe - netcoreapp2.1 - - - -"), - ("Program.cs", -@"using System; - -namespace BasicConsoleApp -{ - class Program - { - static void MyProgram(string[] args) - { - Console.WriteLine(""Hello World!""); - } - } -}"), - ("Readme.md", -@"This is a sample *markdown file* - -```cs Program.cs -```"), - ("./Subdirectory/Tutorial.md", "This is a sample *tutorial file*"), - ("./Subdirectory/AnotherProgram.cs", -@"using System; -using System.Collections.Generic; -using System.Text; - -namespace MLS.Agent.Tests.TestProjects.BasicConsoleApp.Subdirectory -{ - class AnotherPorgram - { - static void MyAnotherProgram(string[] args) - { - Console.WriteLine(""Hello from Another Program!""); - } - } - } -") - }; - } - } -} - - diff --git a/MLS.Agent.Tools.Tests/InMemoryDirectoryAccessor.cs b/MLS.Agent.Tools.Tests/InMemoryDirectoryAccessor.cs deleted file mode 100644 index 36571fb49..000000000 --- a/MLS.Agent.Tools.Tests/InMemoryDirectoryAccessor.cs +++ /dev/null @@ -1,209 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections; -using System.Collections.Generic; -using System.IO; -using System.Linq; - -namespace MLS.Agent.Tools.Tests -{ - public class InMemoryDirectoryAccessor : IDirectoryAccessor, IEnumerable - { - private readonly DirectoryInfo _rootDirToAddFiles; - - private Dictionary _files = new Dictionary( - new Dictionary(), - new FileSystemInfoComparer()); - - public InMemoryDirectoryAccessor( - DirectoryInfo workingDirectory = null, - DirectoryInfo rootDirectoryToAddFiles = null) - { - WorkingDirectory = workingDirectory ?? - new DirectoryInfo(Path.Combine("some", "fake", "path")); - - _rootDirToAddFiles = rootDirectoryToAddFiles ?? - WorkingDirectory; - } - - internal DirectoryInfo WorkingDirectory { get; } - - public void Add((string path, string content) file) - { - var fileInfo = new FileInfo(Path.Combine(_rootDirToAddFiles.FullName, file.path)); - - _files.Add(fileInfo, file.content); - - var directory = fileInfo.Directory; - - while (directory != null && - !FileSystemInfoComparer.Instance.Equals(directory, WorkingDirectory)) - { - _files.TryAdd(directory, null); - - directory = directory.Parent; - } - } - - public FileSystemDirectoryAccessor CreateFiles() - { - foreach (var filePath in GetAllFilesRecursively()) - { - var absolutePath = GetFullyQualifiedPath(filePath); - - var text = ReadAllText(filePath); - - if (absolutePath is FileInfo file) - { - if (!file.Directory.Exists) - { - file.Directory.Create(); - } - - File.WriteAllText(absolutePath.FullName, text); - } - } - - return new FileSystemDirectoryAccessor(WorkingDirectory); - } - - public bool DirectoryExists(RelativeDirectoryPath path) - { - var fullyQualifiedDirPath = GetFullyQualifiedPath(path); - - return _files - .Keys - .Any(f => - { - switch (f) - { - case FileInfo file: - return FileSystemInfoComparer.Instance.Equals( - file.Directory, - fullyQualifiedDirPath); - - case DirectoryInfo dir: - return FileSystemInfoComparer.Instance.Equals( - dir, - fullyQualifiedDirPath); - - default: - throw new NotSupportedException(); - } - }); - } - - public void EnsureDirectoryExists(RelativeDirectoryPath path) - { - _files[GetFullyQualifiedPath(path)] = null; - } - - public bool FileExists(RelativeFilePath path) - { - return _files.ContainsKey(GetFullyQualifiedPath(path)); - } - - public string ReadAllText(RelativeFilePath path) - { - _files.TryGetValue(GetFullyQualifiedPath(path), out var value); - return value; - } - - public void WriteAllText(RelativeFilePath path, string text) - { - _files[GetFullyQualifiedPath(path)] = text; - } - - public FileSystemInfo GetFullyQualifiedPath(RelativePath path) - { - if (path == null) - { - throw new ArgumentNullException(); - } - - switch (path) - { - case RelativeFilePath rfp: - return WorkingDirectory.Combine(rfp); - case RelativeDirectoryPath rdp: - return WorkingDirectory.Combine(rdp); - default: - throw new NotSupportedException(); - } - } - - public IEnumerator GetEnumerator() - { - throw new NotImplementedException(); - } - - public IDirectoryAccessor GetDirectoryAccessorForRelativePath(RelativeDirectoryPath relativePath) - { - var newPath = WorkingDirectory.Combine(relativePath); - return new InMemoryDirectoryAccessor(newPath) - { - _files = _files - }; - } - - public IEnumerable GetAllDirectoriesRecursively() - { - return _files.Keys - .OfType() - .Select(key => new RelativeDirectoryPath( - Path.GetRelativePath(WorkingDirectory.FullName, key.FullName))); - } - - public IEnumerable GetAllFiles() - { - return _files.Keys - .OfType() - .Where(key => FileSystemInfoComparer.Instance.Equals(key.Directory, WorkingDirectory)) - .Select(key => new RelativeFilePath( - Path.GetRelativePath(WorkingDirectory.FullName, key.FullName))); - } - - public IEnumerable GetAllFilesRecursively() - { - return _files.Keys - .OfType() - .Select(key => new RelativeFilePath( - Path.GetRelativePath(WorkingDirectory.FullName, key.FullName))); - } - - public override string ToString() => this.GetFullyQualifiedRoot().FullName; - - private class FileSystemInfoComparer : IEqualityComparer - { - public static FileSystemInfoComparer Instance { get; } = new FileSystemInfoComparer(); - - public bool Equals(FileSystemInfo x, FileSystemInfo y) - { - if (x?.GetType() == y?.GetType() && x != null) - { - return x is DirectoryInfo - ? RelativePath.NormalizeDirectory(x.FullName) == RelativePath.NormalizeDirectory(y.FullName) - : x.FullName == y.FullName; - } - - return false; - } - - public int GetHashCode(FileSystemInfo obj) - { - var fullName = obj.FullName; - - if (obj is DirectoryInfo) - { - fullName = RelativePath.NormalizeDirectory(fullName); - } - - var hashCode = $"{obj.GetType().GetHashCode()}:{fullName}".GetHashCode(); - - return hashCode; - } - } - } -} \ No newline at end of file diff --git a/MLS.Agent.Tools.Tests/MLS.Agent.Tools.Tests.csproj b/MLS.Agent.Tools.Tests/MLS.Agent.Tools.Tests.csproj deleted file mode 100644 index 7f4021daf..000000000 --- a/MLS.Agent.Tools.Tests/MLS.Agent.Tools.Tests.csproj +++ /dev/null @@ -1,48 +0,0 @@ - - - - net6.0 - Latest - portable-net45+win8+wp8+wpa81 - $(NoWarn);8002 - - - - - - - - - - - - Always - - - - - - - - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - diff --git a/MLS.Agent.Tools.Tests/PackageUtilities.cs b/MLS.Agent.Tools.Tests/PackageUtilities.cs deleted file mode 100644 index 6de7f7577..000000000 --- a/MLS.Agent.Tools.Tests/PackageUtilities.cs +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.IO; -using System.Reactive.Concurrency; -using System.Threading.Tasks; -using Clockwise; -using WorkspaceServer.Packaging; - -namespace MLS.Agent.Tools.Tests -{ - public static class PackageUtilities - { - private static readonly object CreateDirectoryLock = new object(); - - public static async Task Copy( - Package fromPackage, - string folderNameStartsWith = null, - bool isRebuildable = false, - IScheduler buildThrottleScheduler = null, - DirectoryInfo parentDirectory = null) - { - if (fromPackage == null) - { - throw new ArgumentNullException(nameof(fromPackage)); - } - - await fromPackage.EnsureReady(new Budget()); - - folderNameStartsWith = folderNameStartsWith ?? fromPackage.Name; - parentDirectory = parentDirectory ?? fromPackage.Directory.Parent; - - var destination = - CreateDirectory(folderNameStartsWith, - parentDirectory); - - fromPackage.Directory.CopyTo(destination, info => - { - switch (info) - { - case FileInfo fileInfo: - return FileLock.IsLockFile(fileInfo) || fileInfo.Extension.EndsWith("binlog"); - default: - return false; - } - }); - - Package copy; - if (isRebuildable) - { - copy = new RebuildablePackage(directory: destination, name: destination.Name, buildThrottleScheduler: buildThrottleScheduler); - } - else - { - copy = new NonrebuildablePackage(directory: destination, name: destination.Name, buildThrottleScheduler: buildThrottleScheduler); - } - - return copy; - } - - public static DirectoryInfo CreateDirectory( - string folderNameStartsWith, - DirectoryInfo parentDirectory = null) - { - if (string.IsNullOrWhiteSpace(folderNameStartsWith)) - { - throw new ArgumentException("Value cannot be null or whitespace.", nameof(folderNameStartsWith)); - } - - parentDirectory = parentDirectory ?? Package.DefaultPackagesDirectory; - - DirectoryInfo created; - - lock (CreateDirectoryLock) - { - if (!parentDirectory.Exists) - { - parentDirectory.Create(); - } - - var existingFolders = parentDirectory.GetDirectories($"{folderNameStartsWith}.*"); - - created = parentDirectory.CreateSubdirectory($"{folderNameStartsWith}.{existingFolders.Length + 1}"); - } - - return created; - } - } -} diff --git a/MLS.Agent.Tools.Tests/RelativeDirectoryPathTests.cs b/MLS.Agent.Tools.Tests/RelativeDirectoryPathTests.cs deleted file mode 100644 index b6515ce5f..000000000 --- a/MLS.Agent.Tools.Tests/RelativeDirectoryPathTests.cs +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using FluentAssertions; -using Xunit; - -namespace MLS.Agent.Tools.Tests -{ - public class RelativeDirectoryPathTests - { - [Fact] - public void Can_create_directory_paths_from_string_with_directory() - { - var path = new RelativeDirectoryPath("../src"); - path.Value.Should().Be("../src/"); - } - - [Fact] - public void Normalises_the_passed_path() - { - var path = new RelativeDirectoryPath(@"..\src"); - path.Value.Should().Be("../src/"); - } - - [Fact] - public void Throws_exception_if_the_path_contains_invalid_path_characters() - { - Action action = () => new RelativeDirectoryPath(@"abc|def"); - action.Should().Throw(); - } - - [Theory] - [InlineData("/")] - [InlineData("/some/path")] - [InlineData(@"c:\some\path")] - [InlineData(@"\\some\path")] - public void Throws_if_path_is_absolute(string value) - { - Action action = () => new RelativeDirectoryPath(value); - action.Should().Throw(); - } - - [Theory] - [InlineData(".", ".")] - [InlineData(".", "./")] - [InlineData(".", @".\")] - [InlineData("./", @".\")] - [InlineData("..", "..")] - [InlineData(@"../", @"..\")] - [InlineData("../a/", "../a")] - [InlineData("a", "./a")] - public void Equality_is_based_on_same_resolved_directory_path( - string value1, - string value2) - { - var path1 = new RelativeDirectoryPath(value1); - var path2 = new RelativeDirectoryPath(value2); - - path1.GetHashCode().Should().Be(path2.GetHashCode()); - path1.Equals(path2).Should().BeTrue(); - path2.Equals(path1).Should().BeTrue(); - } - } -} diff --git a/MLS.Agent.Tools.Tests/RelativeFilePathTests.cs b/MLS.Agent.Tools.Tests/RelativeFilePathTests.cs deleted file mode 100644 index be0b2854e..000000000 --- a/MLS.Agent.Tools.Tests/RelativeFilePathTests.cs +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using FluentAssertions; -using MLS.Agent.Tools; -using Xunit; -using Xunit.Abstractions; - -namespace MLS.Agent.Tools.Tests -{ - public class RelativeFilePathTests - { - private readonly ITestOutputHelper _output; - - public RelativeFilePathTests(ITestOutputHelper output) - { - _output = output; - } - - [Fact] - public void Can_create_file_paths_from_string_with_directory() - { - var path = new RelativeFilePath("../readme.md"); - path.Value.Should().Be("../readme.md"); - } - - [Fact] - public void Can_create_file_paths_from_string_without_directory() - { - var path = new RelativeFilePath("readme.md"); - path.Value.Should().Be("./readme.md"); - } - - [Fact] - public void Normalises_the_passed_path() - { - var path = new RelativeFilePath(@"..\readme.md"); - _output.WriteLine(path.Value); - _output.WriteLine(path.Directory.Value); - path.Value.Should().Be("../readme.md"); - } - - [Fact] - public void Throws_exception_if_the_path_contains_invalid_filename_characters() - { - Action action = () => new RelativeFilePath(@"abc*def"); - action.Should().Throw(); - } - - [Fact] - public void Throws_exception_if_the_path_contains_invalid_path_characters() - { - Action action = () => new RelativeFilePath(@"abc|def"); - action.Should().Throw(); - } - - [Fact] - public void Throws_exception_if_the_path_is_empty() - { - Action action = () => new RelativeFilePath(""); - action.Should().Throw(); - } - - [Theory] - [InlineData("../src/Program.cs", "../src/")] - [InlineData("src/Program.cs", "./src/")] - [InlineData("Readme.md", "./")] - public void Returns_the_directory_path(string path, string directory) - { - var relativePath = new RelativeFilePath(path); - relativePath.Directory.Value.Should().Be(directory); - } - - [Fact] - public void Extension_returns_file_extension_with_a_dot() - { - new RelativeFilePath("../Program.cs").Extension.Should().Be(".cs"); - } - - [Theory] - [InlineData("Program.cs", "Program.cs")] - [InlineData("./Program.cs", "Program.cs")] - [InlineData("./Program.cs", @".\Program.cs")] - [InlineData("./a/Program.cs", @".\a/Program.cs")] - public void Equality_is_based_on_same_resolved_file_path( - string value1, - string value2) - { - var path1 = new RelativeFilePath(value1); - var path2 = new RelativeFilePath(value2); - - _output.WriteLine($"path1.Value: {path1.Value}"); - _output.WriteLine($"path1.Directory.Value: {path1.Directory.Value}"); - _output.WriteLine($"path2.Value: {path2.Value}"); - _output.WriteLine($"path2.Directory.Value: {path2.Directory.Value}"); - - path1.GetHashCode().Should().Be(path2.GetHashCode()); - path1.Equals(path2).Should().BeTrue(); - path2.Equals(path1).Should().BeTrue(); - } - } -} diff --git a/MLS.Agent.Tools.Tests/TestProjects/SampleConsole/BasicConsoleApp.csproj b/MLS.Agent.Tools.Tests/TestProjects/SampleConsole/BasicConsoleApp.csproj deleted file mode 100644 index c73e0d169..000000000 --- a/MLS.Agent.Tools.Tests/TestProjects/SampleConsole/BasicConsoleApp.csproj +++ /dev/null @@ -1,8 +0,0 @@ - - - - Exe - netcoreapp3.1 - - - diff --git a/MLS.Agent.Tools.Tests/TestProjects/SampleConsole/Program.cs b/MLS.Agent.Tools.Tests/TestProjects/SampleConsole/Program.cs deleted file mode 100644 index 9747aab5b..000000000 --- a/MLS.Agent.Tools.Tests/TestProjects/SampleConsole/Program.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; - -namespace BasicConsoleApp -{ - class Program - { - static void Main() - { - #region theregion - Console.WriteLine("Hello World!"); - #endregion - } - } -} diff --git a/MLS.Agent.Tools.Tests/TestProjects/SampleConsole/Readme.md b/MLS.Agent.Tools.Tests/TestProjects/SampleConsole/Readme.md deleted file mode 100644 index 0a2754628..000000000 --- a/MLS.Agent.Tools.Tests/TestProjects/SampleConsole/Readme.md +++ /dev/null @@ -1,4 +0,0 @@ -This is a sample *markdown file* - -```cs --source-file Program.cs -``` \ No newline at end of file diff --git a/MLS.Agent.Tools.Tests/TestProjects/SampleConsole/Subdirectory/AnotherProgram.cs b/MLS.Agent.Tools.Tests/TestProjects/SampleConsole/Subdirectory/AnotherProgram.cs deleted file mode 100644 index c99dfa178..000000000 --- a/MLS.Agent.Tools.Tests/TestProjects/SampleConsole/Subdirectory/AnotherProgram.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.Text; - -namespace MLS.Agent.Tests.TestProjects.BasicConsoleApp.Subdirectory -{ - class AnotherPorgram - { - static void MyAnotherProgram(string[] args) - { - Console.WriteLine("Hello from Another Program!"); - } - } -} diff --git a/MLS.Agent.Tools.Tests/TestProjects/SampleConsole/Subdirectory/Tutorial.md b/MLS.Agent.Tools.Tests/TestProjects/SampleConsole/Subdirectory/Tutorial.md deleted file mode 100644 index 161c19a39..000000000 --- a/MLS.Agent.Tools.Tests/TestProjects/SampleConsole/Subdirectory/Tutorial.md +++ /dev/null @@ -1 +0,0 @@ -This is a sample *tutorial file* \ No newline at end of file diff --git a/MLS.Agent.Tools.Tests/TestUtility/TestAssets.cs b/MLS.Agent.Tools.Tests/TestUtility/TestAssets.cs deleted file mode 100644 index 8c84cd6eb..000000000 --- a/MLS.Agent.Tools.Tests/TestUtility/TestAssets.cs +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.IO; - -namespace MLS.Agent.Tools.Tests -{ - public static class TestAssets - { - public static DirectoryInfo SampleConsole => - new DirectoryInfo(Path.Combine(GetTestProjectsFolder(), "SampleConsole")); - - public static DirectoryInfo KernelExtension => - new DirectoryInfo(Path.Combine(GetTestProjectsFolder(), "KernelExtension")); - - private static string GetTestProjectsFolder() - { - var current = Directory.GetCurrentDirectory(); - return Path.Combine(current, "TestProjects"); - } - } -} diff --git a/MLS.Agent.Tools/AsyncLazy{T}.cs b/MLS.Agent.Tools/AsyncLazy{T}.cs deleted file mode 100644 index 3305aa446..000000000 --- a/MLS.Agent.Tools/AsyncLazy{T}.cs +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Threading.Tasks; - -namespace MLS.Agent.Tools -{ - public class AsyncLazy - { - private readonly Lazy> _lazy; - - public AsyncLazy(Func> initialize) - { - if (initialize == null) - { - throw new ArgumentNullException(nameof(initialize)); - } - - _lazy = new Lazy>(initialize); - } - - public Task ValueAsync() => _lazy.Value; - } -} diff --git a/MLS.Agent.Tools/DirectoryAccessor.cs b/MLS.Agent.Tools/DirectoryAccessor.cs deleted file mode 100644 index f373ab242..000000000 --- a/MLS.Agent.Tools/DirectoryAccessor.cs +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.IO; -using Microsoft.DotNet.Interactive.Utility; - -namespace MLS.Agent.Tools -{ - public static class DirectoryAccessor - { - public static bool DirectoryExists( - this IDirectoryAccessor directoryAccessor, - string relativePath) => - directoryAccessor.DirectoryExists(new RelativeDirectoryPath(relativePath)); - - public static bool RootDirectoryExists( - this IDirectoryAccessor directoryAccessor) => - directoryAccessor.DirectoryExists(new RelativeDirectoryPath(".")); - - public static void EnsureDirectoryExists( - this IDirectoryAccessor directoryAccessor, - string relativePath) => - directoryAccessor.EnsureDirectoryExists(new RelativeDirectoryPath(relativePath)); - - public static void EnsureRootDirectoryExists( - this IDirectoryAccessor directoryAccessor) => - directoryAccessor.EnsureDirectoryExists(new RelativeDirectoryPath(".")); - - public static bool FileExists( - this IDirectoryAccessor directoryAccessor, - string relativePath) => - directoryAccessor.FileExists(new RelativeFilePath(relativePath)); - - public static string ReadAllText( - this IDirectoryAccessor directoryAccessor, - string relativePath) => - directoryAccessor.ReadAllText(new RelativeFilePath(relativePath)); - - public static void WriteAllText( - this IDirectoryAccessor directoryAccessor, - string relativePath, - string text) => - directoryAccessor.WriteAllText( - new RelativeFilePath(relativePath), - text); - - public static IDirectoryAccessor GetDirectoryAccessorForRelativePath( - this IDirectoryAccessor directoryAccessor, - string relativePath) => - directoryAccessor.GetDirectoryAccessorForRelativePath(new RelativeDirectoryPath(relativePath)); - - public static IDirectoryAccessor GetDirectoryAccessorFor(this IDirectoryAccessor directory, DirectoryInfo directoryInfo) - { - var relative = PathUtilities.GetRelativePath( - directory.GetFullyQualifiedRoot().FullName, - directoryInfo.FullName); - return directory.GetDirectoryAccessorForRelativePath(new RelativeDirectoryPath(relative)); - } - - public static DirectoryInfo GetFullyQualifiedRoot(this IDirectoryAccessor directoryAccessor) => - (DirectoryInfo) directoryAccessor.GetFullyQualifiedPath(new RelativeDirectoryPath(".")); - - public static FileInfo GetFullyQualifiedFilePath(this IDirectoryAccessor directoryAccessor, string relativeFilePath) => - GetFullyQualifiedFilePath(directoryAccessor, new RelativeFilePath(relativeFilePath)); - - public static FileInfo GetFullyQualifiedFilePath(this IDirectoryAccessor directoryAccessor, RelativeFilePath relativePath) => - (FileInfo) directoryAccessor.GetFullyQualifiedPath(relativePath); - - public static DirectoryInfo GetFullyQualifiedDirectoryPath(this IDirectoryAccessor directoryAccessor, RelativeDirectoryPath relativePath) => - (DirectoryInfo)directoryAccessor.GetFullyQualifiedPath(relativePath); - } -} \ No newline at end of file diff --git a/MLS.Agent.Tools/DirectoryInfoExtensions.cs b/MLS.Agent.Tools/DirectoryInfoExtensions.cs deleted file mode 100644 index ddac8b140..000000000 --- a/MLS.Agent.Tools/DirectoryInfoExtensions.cs +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.IO; - -namespace MLS.Agent.Tools -{ - public static class DirectoryInfoExtensions - { - public static void CopyTo( - this DirectoryInfo source, - DirectoryInfo destination, - Func skipWhen = null) - { - if (source == null) - { - throw new ArgumentNullException(nameof(source)); - } - - if (!source.Exists) - { - throw new DirectoryNotFoundException(source.FullName); - } - - if (!destination.Exists) - { - destination.Create(); - } - - foreach (var file in source.GetFiles()) - { - if (skipWhen?.Invoke(file) == true) - { - continue; - } - - file.CopyTo( - Path.Combine( - destination.FullName, file.Name), false); - } - - foreach (var subdirectory in source.GetDirectories()) - { - if (skipWhen?.Invoke(subdirectory) == true) - { - continue; - } - - subdirectory.CopyTo( - new DirectoryInfo( - Path.Combine( - destination.FullName, subdirectory.Name))); - } - } - - public static DirectoryInfo Subdirectory(this DirectoryInfo directoryInfo, string path) - { - return new DirectoryInfo(Path.Combine(directoryInfo.FullName, path)); - } - - public static FileInfo File(this DirectoryInfo directoryInfo, string name) - { - return new FileInfo(Path.Combine(directoryInfo.FullName, name)); - } - - public static DirectoryInfo NormalizeEnding(this DirectoryInfo directoryInfo) - { - if (!directoryInfo.FullName.EndsWith(Path.DirectorySeparatorChar.ToString())) - { - return new DirectoryInfo(Path.Combine(directoryInfo.FullName, Path.DirectorySeparatorChar.ToString())); - } - - return directoryInfo; - } - } -} diff --git a/MLS.Agent.Tools/FileInfoExtensions.cs b/MLS.Agent.Tools/FileInfoExtensions.cs deleted file mode 100644 index 3ac4f88dd..000000000 --- a/MLS.Agent.Tools/FileInfoExtensions.cs +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.IO; -using System.Threading.Tasks; - -namespace MLS.Agent.Tools -{ - public static class FileInfoExtensions - { - public static string Read(this FileInfo file) - { - using (var reader = file.OpenText()) - { - return reader.ReadToEnd(); - } - } - - public static async Task ReadAsync(this FileInfo file) - { - using (var reader = file.OpenText()) - { - return await reader.ReadToEndAsync(); - } - } - - public static bool IsBuildOutput(this FileInfo fileInfo) - { - var directory = fileInfo.Directory; - - while (directory != null) - { - if (directory.Name == "obj" || directory.Name == "bin") - { - return true; - } - - directory = directory.Parent; - } - - return false; - } - } -} diff --git a/MLS.Agent.Tools/FileSystemDirectoryAccessor.cs b/MLS.Agent.Tools/FileSystemDirectoryAccessor.cs deleted file mode 100644 index b5c6d8a31..000000000 --- a/MLS.Agent.Tools/FileSystemDirectoryAccessor.cs +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using Microsoft.DotNet.Interactive.Utility; - -namespace MLS.Agent.Tools -{ - public class FileSystemDirectoryAccessor : IDirectoryAccessor - { - private readonly DirectoryInfo _rootDirectory; - - public FileSystemDirectoryAccessor(string directory): this(new DirectoryInfo(directory)) - { - } - - public FileSystemDirectoryAccessor(DirectoryInfo rootDir) - { - _rootDirectory = rootDir ?? throw new ArgumentNullException(nameof(rootDir)); - } - - public bool DirectoryExists(RelativeDirectoryPath path) - { - return GetFullyQualifiedPath(path).Exists; - } - - public bool FileExists(RelativeFilePath filePath) - { - return GetFullyQualifiedPath(filePath).Exists; - } - - public void EnsureDirectoryExists(RelativeDirectoryPath path) - { - var fullyQualifiedPath = GetFullyQualifiedPath(path); - - if (!Directory.Exists(fullyQualifiedPath.FullName)) - { - Directory.CreateDirectory(fullyQualifiedPath.FullName); - } - } - - public string ReadAllText(RelativeFilePath filePath) - { - return File.ReadAllText(GetFullyQualifiedPath(filePath).FullName); - } - - public void WriteAllText(RelativeFilePath path, string text) - { - File.WriteAllText(GetFullyQualifiedPath(path).FullName, text); - } - - public FileSystemInfo GetFullyQualifiedPath(RelativePath path) - { - if (path == null) - { - throw new ArgumentNullException(nameof(path)); - } - - return path.Match( - directory => new DirectoryInfo(_rootDirectory.Combine(directory).FullName), - file => new FileInfo(_rootDirectory.Combine(file).FullName) - ); - } - - public IDirectoryAccessor GetDirectoryAccessorForRelativePath(RelativeDirectoryPath relativePath) - { - var absolutePath = _rootDirectory.Combine(relativePath).FullName; - return new FileSystemDirectoryAccessor(new DirectoryInfo(absolutePath)); - } - - - public IEnumerable GetAllDirectoriesRecursively() - { - var directories = _rootDirectory.GetDirectories("*", SearchOption.AllDirectories); - - return directories.Select(f => - new RelativeDirectoryPath(PathUtilities.GetRelativePath(_rootDirectory.FullName, f.FullName))); - } - - public IEnumerable GetAllFilesRecursively() - { - var files = _rootDirectory.GetFiles("*", SearchOption.AllDirectories); - - return files.Select(f => - new RelativeFilePath(PathUtilities.GetRelativePath(_rootDirectory.FullName, f.FullName))); - } - - public IEnumerable GetAllFiles() - { - var files = _rootDirectory.GetFiles("*", SearchOption.TopDirectoryOnly); - - return files.Select(f => - new RelativeFilePath(PathUtilities.GetRelativePath(_rootDirectory.FullName, f.FullName))); - } - - public override string ToString() => _rootDirectory.FullName; - } -} diff --git a/MLS.Agent.Tools/IDirectoryAccessor.cs b/MLS.Agent.Tools/IDirectoryAccessor.cs deleted file mode 100644 index 3ffbe3652..000000000 --- a/MLS.Agent.Tools/IDirectoryAccessor.cs +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.Collections.Generic; -using System.IO; - -namespace MLS.Agent.Tools -{ - public interface IDirectoryAccessor - { - bool FileExists(RelativeFilePath path); - - bool DirectoryExists(RelativeDirectoryPath path); - - void EnsureDirectoryExists(RelativeDirectoryPath path); - - string ReadAllText(RelativeFilePath path); - - void WriteAllText(RelativeFilePath path, string text); - - IEnumerable GetAllFilesRecursively(); - - IEnumerable GetAllFiles(); - - IEnumerable GetAllDirectoriesRecursively(); - - FileSystemInfo GetFullyQualifiedPath(RelativePath path); - - IDirectoryAccessor GetDirectoryAccessorForRelativePath(RelativeDirectoryPath path); - } -} \ No newline at end of file diff --git a/MLS.Agent.Tools/MLS.Agent.Tools.csproj b/MLS.Agent.Tools/MLS.Agent.Tools.csproj deleted file mode 100644 index 63a576fd4..000000000 --- a/MLS.Agent.Tools/MLS.Agent.Tools.csproj +++ /dev/null @@ -1,32 +0,0 @@ - - - - netstandard2.0 - Latest - $(NoWarn);8002 - - - - - - - - - - - - - - - - - - all - - - - - - - - diff --git a/MLS.Agent.Tools/RelativeDirectoryPath.cs b/MLS.Agent.Tools/RelativeDirectoryPath.cs deleted file mode 100644 index a31adf63f..000000000 --- a/MLS.Agent.Tools/RelativeDirectoryPath.cs +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; - -namespace MLS.Agent.Tools -{ - public class RelativeDirectoryPath : - RelativePath, - IEquatable - { - public static RelativeDirectoryPath Root { get; } = new RelativeDirectoryPath("./"); - - public RelativeDirectoryPath(string value) : base(value) - { - Value = NormalizeDirectory(value); - } - - public bool Equals(RelativeDirectoryPath other) - { - if (ReferenceEquals(null, other)) - { - return false; - } - - if (ReferenceEquals(this, other)) - { - return true; - } - - return Equals(Value, other.Value); - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - - if (ReferenceEquals(this, obj)) - { - return true; - } - - if (obj.GetType() != GetType()) - { - return false; - } - - return Equals((RelativeDirectoryPath) obj); - } - - public override int GetHashCode() => Value.GetHashCode(); - - public static bool operator ==(RelativeDirectoryPath left, RelativeDirectoryPath right) - { - return Equals(left, right); - } - - public static bool operator !=(RelativeDirectoryPath left, RelativeDirectoryPath right) - { - return !Equals(left, right); - } - } -} \ No newline at end of file diff --git a/MLS.Agent.Tools/RelativeFilePath.cs b/MLS.Agent.Tools/RelativeFilePath.cs deleted file mode 100644 index d07a2cb64..000000000 --- a/MLS.Agent.Tools/RelativeFilePath.cs +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.IO; - -namespace MLS.Agent.Tools -{ - public class RelativeFilePath : - RelativePath, - IEquatable - { - public RelativeFilePath(string value) : base(value) - { - if (string.IsNullOrWhiteSpace(value)) - { - throw new ArgumentException("File path cannot be null or consist entirely of whitespace", nameof(value)); - } - - var (directoryPath, fileName) = GetFileAndDirectoryNames(value); - - FileName = fileName; - - ThrowIfContainsDisallowedFilePathChars(FileName); - - Directory = new RelativeDirectoryPath(directoryPath); - - Value = Directory.Value + FileName; - } - - private static (string directoryPath, string fileName) GetFileAndDirectoryNames(string filePath) - { - var lastDirectorySeparatorPos = filePath.LastIndexOfAny(new[] { '\\', '/' }); - - if (lastDirectorySeparatorPos == -1) - { - return ("./", filePath); - } - - var fileName = filePath.Substring(lastDirectorySeparatorPos + 1); - - var directoryPath = filePath.Substring(0, lastDirectorySeparatorPos); - - directoryPath = NormalizeDirectory(directoryPath); - - return (directoryPath, fileName); - } - - public string FileName { get; } - - public RelativeDirectoryPath Directory { get; } - - public string Extension => - Path.GetExtension(Value); - - public static bool TryParse(string path, out RelativeFilePath relativeFilePath) - { - relativeFilePath = null; - try - { - relativeFilePath = new RelativeFilePath(path); - return true; - } - catch - { - return false; - } - } - - public bool Equals(RelativeFilePath other) - { - if (ReferenceEquals(null, other)) - { - return false; - } - - if (ReferenceEquals(this, other)) - { - return true; - } - - return string.Equals(FileName, other.FileName) && - Equals(Directory, other.Directory); - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - - if (ReferenceEquals(this, obj)) - { - return true; - } - - if (obj.GetType() != GetType()) - { - return false; - } - - return Equals((RelativeFilePath) obj); - } - - public override int GetHashCode() => Value.GetHashCode(); - } -} \ No newline at end of file diff --git a/MLS.Agent.Tools/RelativePath.cs b/MLS.Agent.Tools/RelativePath.cs deleted file mode 100644 index 239fee6e6..000000000 --- a/MLS.Agent.Tools/RelativePath.cs +++ /dev/null @@ -1,192 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.IO; - -namespace MLS.Agent.Tools -{ - public abstract class RelativePath - { - private string _value; - - protected RelativePath(string value) - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - ThrowIfPathIsRooted(value); - } - - private void ThrowIfPathIsRooted(string path) - { - if (IsPathRootedRegardlessOfOS(path)) - { - throw new ArgumentException($"Path cannot be absolute: {path}"); - } - } - - private static bool IsPathRootedRegardlessOfOS(string path) - { - return Path.IsPathRooted(path) || - path.StartsWith(@"/") || - path.StartsWith(@"\\") || - path.Substring(1).StartsWith(@":\"); - } - - public string Value - { - get => _value; - protected set => _value = value ?? throw new ArgumentNullException(nameof(value)) ; - } - - public override string ToString() => Value; - - private static readonly HashSet DisallowedPathChars = new HashSet( - new char[] - { - '|', - '\0', - '\u0001', - '\u0002', - '\u0003', - '\u0004', - '\u0005', - '\u0006', - '\a', - '\b', - '\t', - '\n', - '\v', - '\f', - '\r', - '\u000e', - '\u000f', - '\u0010', - '\u0011', - '\u0012', - '\u0013', - '\u0014', - '\u0015', - '\u0016', - '\u0017', - '\u0018', - '\u0019', - '\u001a', - '\u001b', - '\u001c', - '\u001d', - '\u001e', - '\u001f' - }); - - private static readonly HashSet DisallowedFileNameChars = new HashSet( - new char[] - { - '"', - '<', - '>', - '|', - '\0', - '\u0001', - '\u0002', - '\u0003', - '\u0004', - '\u0005', - '\u0006', - '\a', - '\b', - '\t', - '\n', - '\v', - '\f', - '\r', - '\u000e', - '\u000f', - '\u0010', - '\u0011', - '\u0012', - '\u0013', - '\u0014', - '\u0015', - '\u0016', - '\u0016', - '\u0017', - '\u0018', - '\u0019', - '\u001a', - '\u001b', - '\u001c', - '\u001d', - '\u001e', - '\u001f', - ':', - '*', - '?', - '\\' - }); - - public static string NormalizeDirectory(string directoryPath) - { - directoryPath = directoryPath.Replace('\\', '/'); - - if (string.IsNullOrWhiteSpace(directoryPath)) - { - directoryPath = "./"; - } - else - { - if (!IsPathRootedRegardlessOfOS(directoryPath) && - !directoryPath.StartsWith(".") && - !directoryPath.StartsWith("..") && - !directoryPath.StartsWith("/")) - { - directoryPath = $"./{directoryPath}"; - } - - directoryPath = directoryPath.TrimEnd('\\', '/') + '/'; - } - - ThrowIfContainsDisallowedDirectoryPathChars(directoryPath); - - return directoryPath; - } - - protected static void ThrowIfContainsDisallowedDirectoryPathChars(string path) - { - for (var index = 0; index < path.Length; index++) - { - var ch = path[index]; - if (DisallowedPathChars.Contains(ch)) - { - throw new ArgumentException($"The character {ch} is not allowed in the path"); - } - } - } - - protected static void ThrowIfContainsDisallowedFilePathChars(string filename) - { - for (var index = 0; index < filename.Length; index++) - { - var ch = filename[index]; - if (DisallowedFileNameChars.Contains(ch)) - { - throw new ArgumentException($"The character {ch} is not allowed in the filename"); - } - } - } - - // public static bool operator ==(RelativePath left, RelativePath right) - // { - // return Equals(left, right); - // } - // - // public static bool operator !=(RelativePath left, RelativePath right) - // { - // return !Equals(left, right); - // } - } -} \ No newline at end of file diff --git a/MLS.Agent.Tools/RelativePathExtensions.cs b/MLS.Agent.Tools/RelativePathExtensions.cs deleted file mode 100644 index aa2b244a0..000000000 --- a/MLS.Agent.Tools/RelativePathExtensions.cs +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.IO; - -namespace MLS.Agent.Tools -{ - public static class RelativePathExtensions - { - public static FileInfo Combine( - this DirectoryInfo directory, - RelativeFilePath filePath) - { - var filePart = filePath.Value; - - if (filePart.StartsWith("./")) - { - filePart = filePart.Substring(2); - } - - return new FileInfo( - Path.Combine( - directory.FullName, - filePart.Replace('/', Path.DirectorySeparatorChar))); - } - - public static DirectoryInfo Combine( - this DirectoryInfo directory, - RelativeDirectoryPath directoryPath) - { - return new DirectoryInfo( - Path.Combine( - RelativePath.NormalizeDirectory(directory.FullName), - directoryPath.Value.Replace('/', Path.DirectorySeparatorChar))); - } - - public static T Match(this RelativePath path, Func directory, Func file) - { - switch (path) - { - case RelativeDirectoryPath relativeDirectoryPath: - return directory(relativeDirectoryPath); - case RelativeFilePath relativeFilePath: - return file(relativeFilePath); - default: - throw new ArgumentOutOfRangeException($"Unexpected type derived from {nameof(RelativePath)}: {path.GetType().Name}"); - } - } - } -} \ No newline at end of file diff --git a/MLS.Agent.Tools/TypeExtensions.cs b/MLS.Agent.Tools/TypeExtensions.cs deleted file mode 100644 index 7dccc6ea7..000000000 --- a/MLS.Agent.Tools/TypeExtensions.cs +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.IO; -using System.Linq; - -namespace MLS.Agent.Tools -{ - public static class TypeExtensions - { - public static string ReadManifestResource(this Type type, string resourceName) - { - if (type == null) - { - throw new ArgumentNullException(nameof(type)); - } - - if (string.IsNullOrWhiteSpace(resourceName)) - { - throw new ArgumentException("Value cannot be null or whitespace.", nameof(resourceName)); - } - - var assembly = type.Assembly; - - var assemblyResourceName = assembly.GetManifestResourceNames().First(s => s.Contains(resourceName)); - - if (string.IsNullOrWhiteSpace(assemblyResourceName)) - { - throw new InvalidOperationException($"Cannot locate resource {resourceName} in {assembly}"); - } - - using (var reader = new StreamReader(assembly.GetManifestResourceStream(assemblyResourceName))) - { - return reader.ReadToEnd(); - } - } - } -} \ No newline at end of file diff --git a/MLS.Agent/(Recipes)/BadRequestOnInvalidModelFilter.cs b/MLS.Agent/(Recipes)/BadRequestOnInvalidModelFilter.cs deleted file mode 100644 index ab31e542d..000000000 --- a/MLS.Agent/(Recipes)/BadRequestOnInvalidModelFilter.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Linq; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Filters; - -namespace Recipes -{ - internal class BadRequestOnInvalidModelFilter : IActionFilter - { - public void OnActionExecuting(ActionExecutingContext context) - { - if (!context.ModelState.IsValid) - { - context.Result = new BadRequestObjectResult( - context.ModelState - .Values - .SelectMany(e => e.Errors - .Select(ee => ee.ErrorMessage))); - } - } - - public void OnActionExecuted(ActionExecutedContext context) - { - } - } -} diff --git a/MLS.Agent/(Recipes)/ClientConfigurationExtensions.cs b/MLS.Agent/(Recipes)/ClientConfigurationExtensions.cs deleted file mode 100644 index 7460ee56d..000000000 --- a/MLS.Agent/(Recipes)/ClientConfigurationExtensions.cs +++ /dev/null @@ -1,329 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Net.Http; -using System.Security.Cryptography; -using System.Text; -using System.Text.RegularExpressions; -using System.Web; -using Microsoft.DotNet.Try.Protocol; -using Microsoft.DotNet.Try.Protocol.ClientApi; -using Microsoft.DotNet.Try.Protocol.ClientApi.GitHub; - -namespace Recipes -{ - internal static class ClientConfigurationExtensions - { - private static readonly Regex OptionalRouteFilter = new Regex(@"/\{.+\?\}", RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase); - - private static string ToSha256(string value) - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - var inputBytes = Encoding.UTF8.GetBytes(value); - - byte[] hash; - using (var sha256 = SHA256.Create()) - { - hash = sha256.ComputeHash(inputBytes); - } - - return Convert.ToBase64String(hash); - } - public static string ComputeHash(this RequestDescriptors links) - { - return ToSha256(links.ToJson()); - } - - public static string BuildUrl(this RequestDescriptor requestDescriptor, Dictionary context = null) - { - var url = requestDescriptor.Href; - if (requestDescriptor.Templated && context?.Count > 0) - { - foreach (var entry in context) - { - var filter = new Regex(@"\{" + entry.Key + @"\??\}", RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase); - url = filter.Replace(url, $"{UrlEncode(entry.Value.ToString())}"); - } - } - - return OptionalRouteFilter.Replace(url, string.Empty); - } - - public static string BuildQueryString(this RequestDescriptor requestDescriptor, Dictionary context = null) - { - var parts = new List(); - if (context?.Count > 0) - { - if (context.TryGetValue("hostOrigin", out var hostOrigin)) - { - parts.Add($"hostOrigin={UrlEncode(hostOrigin.ToString())}"); - } - - foreach (var property in requestDescriptor.Properties ?? Enumerable.Empty()) - { - if (context.TryGetValue(property.Name, out var propertyValue)) - { - parts.Add($"{property.Name}={UrlEncode(propertyValue.ToString())}"); - } - } - } - - return string.Join("&", parts); - } - - public static HttpRequestMessage BuildRequest(this RequestDescriptor requestDescriptor, Dictionary context = null) - { - var fullUrl = requestDescriptor.BuildFullUri(context); - - var request = new HttpRequestMessage - { - RequestUri = new Uri(fullUrl, UriKind.RelativeOrAbsolute) - }; - - switch (requestDescriptor.Method) - { - case "POST": - request.Method = HttpMethod.Post; - break; - case "DELETE": - request.Method = HttpMethod.Delete; - break; - case "PUT": - request.Method = HttpMethod.Put; - break; - case "HEAD": - request.Method = HttpMethod.Head; - break; - case "OPTIONS": - request.Method = HttpMethod.Options; - break; - case "TRACE": - request.Method = HttpMethod.Trace; - break; - default: - request.Method = HttpMethod.Get; - break; - } - - return request; - } - - public static string BuildFullUri(this RequestDescriptor requestDescriptor, Dictionary context = null) - { - var url = requestDescriptor.BuildUrl(context); - var queryString = requestDescriptor.BuildQueryString(context); - - var fullUrl = url; - if (!string.IsNullOrWhiteSpace(queryString)) - { - var joinSymbol = "?"; - if (url.IndexOf("?", StringComparison.InvariantCultureIgnoreCase) >= 0) - { - joinSymbol = "&"; - } - - fullUrl = $"{url}{joinSymbol}{queryString}"; - } - - return fullUrl; - } - - public static HttpRequestMessage BuildLoadFromRequest(this ClientConfiguration configuration, string codeUrl, string hostOrigin) - { - var api = configuration.Links.Snippet; - var context = new Dictionary - { - { "from", codeUrl } - }; - - var request = BuildRequestWithHeaders(configuration, api, hostOrigin, context); - - return request; - } - - private static HttpRequestMessage BuildRequestWithHeaders(this ClientConfiguration configuration, RequestDescriptor requestDescriptor, string hostOrigin, Dictionary context = null) - { - var safeContext = context ?? new Dictionary(); - - if (hostOrigin != null) - { - safeContext["hostOrigin"] = hostOrigin; - } - - var request = requestDescriptor.BuildRequest(safeContext); - - configuration.AddConfigurationVersionIdHeader(request); - configuration.AddTimeoutHeader(request, requestDescriptor); - - return request; - } - - public static HttpRequestMessage BuildLoadFromGistRequest(this ClientConfiguration configuration, string gist, string hash = null, string workspaceType = null, - bool? extractBuffers = null, string hostOrigin = null) - { - var api = configuration.Links.LoadFromGist; - var context = new Dictionary - { - { "gistId", gist } - }; - - if (hash != null) - { - context["commitHash"] = hash; - } - - if (workspaceType != null) - { - context["workspaceType"] = workspaceType; - } - - if (extractBuffers != null) - { - context["extractBuffers"] = extractBuffers; - } - - return BuildRequestWithHeaders(configuration, api, hostOrigin, context); - } - - public static HttpRequestMessage BuildRegionFromFilesRequest(this ClientConfiguration configuration, IEnumerable files, string hostOrigin, string requestId = null) - { - var api = configuration.Links.RegionsFromFiles; - - var request = BuildRequestWithHeaders(configuration, api, hostOrigin); - var payload = new CreateRegionsFromFilesRequest(requestId ?? (Guid.NewGuid().ToString()), files?.ToArray()); - SetRequestContent(payload, request); - - return request; - } - - public static HttpRequestMessage BuildProjectFromGistRequest(this ClientConfiguration configuration, string gistId, string projectTemplate, string hostOrigin, string hash = null, string requestId = null) - { - var api = configuration.Links.ProjectFromGist; - - var request = BuildRequestWithHeaders(configuration, api, hostOrigin); - var payload = new CreateProjectFromGistRequest(requestId ?? (Guid.NewGuid().ToString()), gistId, projectTemplate, hash); - SetRequestContent(payload, request); - - return request; - } - - public static HttpRequestMessage BuildCompletionRequest(this ClientConfiguration configuration, object workspaceRequest, string hostOrigin) - { - var api = configuration.Links.Completion; - - var request = BuildRequestWithHeaders(configuration, api, hostOrigin); - - SetRequestContent(workspaceRequest, request); - - return request; - } - - public static HttpRequestMessage BuildCompileRequest(this ClientConfiguration configuration, object workspaceRequest, string hostOrigin) - { - var api = configuration.Links.Compile; - - var request = BuildRequestWithHeaders(configuration, api, hostOrigin); - - SetRequestContent(workspaceRequest, request); - - return request; - } - - public static HttpRequestMessage BuildSignatureHelpRequest(this ClientConfiguration configuration, object workspaceRequest, string hostOrigin) - { - var api = configuration.Links.SignatureHelp; - - var request = BuildRequestWithHeaders(configuration, api, hostOrigin); - - SetRequestContent(workspaceRequest, request); - - return request; - } - - public static HttpRequestMessage BuildDiagnosticsRequest(this ClientConfiguration configuration, object workspace, string hostOrigin) - { - var api = configuration.Links.Diagnostics; - - var request = BuildRequestWithHeaders(configuration, api, hostOrigin); - - SetRequestContent(workspace, request); - - return request; - } - - public static HttpRequestMessage BuildRunRequest(this ClientConfiguration configuration, object workspaceRequest, string hostOrigin) - { - var api = configuration.Links.Run; - - var request = BuildRequestWithHeaders(configuration, api, hostOrigin); - - SetRequestContent(workspaceRequest, request); - - return request; - } - - public static HttpRequestMessage BuildVersionRequest(this ClientConfiguration configuration, string hostOrigin) - { - var api = configuration.Links.Version; - - return BuildRequestWithHeaders(configuration, api, hostOrigin); - } - - public static HttpRequestMessage BuildGetPackagesRequest(this ClientConfiguration configuration, string packageName, string packageVersion, string hostOrigin) - { - var api = configuration.Links.GetPackage; - var context = new Dictionary - { - { "name", packageName }, - { "version", packageVersion } - }; - - var request = BuildRequestWithHeaders(configuration, api, hostOrigin, context); - - - return request; - } - - private static string UrlEncode(string source) - { - return HttpUtility.UrlEncode(HttpUtility.UrlDecode(source)); - } - - private static void AddConfigurationVersionIdHeader(this ClientConfiguration configuration, HttpRequestMessage request) - { - request.Headers.Remove("ClientConfigurationVersionId"); - request.Headers.Add("ClientConfigurationVersionId", configuration.VersionId); - } - - private static void AddTimeoutHeader(this ClientConfiguration configuration, HttpRequestMessage request, RequestDescriptor requestDescriptor = null) - { - request.Headers.Remove("Timeout"); - var timeoutMs = configuration.DefaultTimeoutMs.ToString(CultureInfo.InvariantCulture); - - if (requestDescriptor != null && requestDescriptor.TimeoutMs > 0) - { - timeoutMs = requestDescriptor.TimeoutMs.ToString(CultureInfo.InvariantCulture); - } - - request.Headers.Add("Timeout", timeoutMs); - } - - private static void SetRequestContent(object content, HttpRequestMessage request) - { - switch (content) - { - case string text: - request.Content = new JsonContent(text); - break; - default: - request.Content = new JsonContent(content); - break; - } - } - } -} diff --git a/MLS.Agent/(Recipes)/DictionaryExtensions.cs b/MLS.Agent/(Recipes)/DictionaryExtensions.cs deleted file mode 100644 index 98fe27886..000000000 --- a/MLS.Agent/(Recipes)/DictionaryExtensions.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Recipes -{ - internal static class DictionaryExtensions - { - /// - /// Adds a key/value pair to the dictionary if the key does not already exist. - /// - /// The type of the key. - /// The type of the value. - /// The dictionary. - /// The key of the element to add. - /// The function used to generate a value for the key. - /// - /// The value for the key. This will be either the existing value for the key if the key is already in the dictionary, or the new value for the key as returned by valueFactory if the key was not in the dictionary. - /// - /// dictionary - public static TValue GetOrAdd( - this IDictionary dictionary, - TKey key, - Func valueFactory) - { - if (dictionary == null) - { - throw new ArgumentNullException(nameof(dictionary)); - } - if (valueFactory == null) - { - throw new ArgumentNullException(nameof(valueFactory)); - } - - TValue value; - if (dictionary.TryGetValue(key, out value)) - { - return value; - } - - value = valueFactory(key); - dictionary.Add(key, value); - return value; - } - } -} diff --git a/MLS.Agent/(Recipes)/JsonContent.cs b/MLS.Agent/(Recipes)/JsonContent.cs deleted file mode 100644 index bca0054bc..000000000 --- a/MLS.Agent/(Recipes)/JsonContent.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Net.Http; -using System.Text; - -namespace Recipes -{ - internal class JsonContent : StringContent - { - public JsonContent(object content) - : base(content.ToJson(), - Encoding.UTF8, - "application/json") - { - } - - public JsonContent(string content) - : base(content, - Encoding.UTF8, - "application/json") - { - } - } -} diff --git a/MLS.Agent/(Recipes)/VersionSensor.cs b/MLS.Agent/(Recipes)/VersionSensor.cs deleted file mode 100644 index 24f1378f6..000000000 --- a/MLS.Agent/(Recipes)/VersionSensor.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using System.Diagnostics; -using System.IO; -using System.Reflection; - -namespace Recipes -{ -#if !RecipesProject - [DebuggerStepThrough] -#endif - internal partial class VersionSensor - { - private static readonly Lazy buildInfo = new Lazy(() => - { - var assembly = typeof(VersionSensor).GetTypeInfo().Assembly; - - var info = new BuildInfo - { - AssemblyName = assembly.GetName().Name, - AssemblyInformationalVersion = assembly - .GetCustomAttribute() - .InformationalVersion, - AssemblyVersion = assembly.GetName().Version.ToString(), - BuildDate = new FileInfo(assembly.Location).CreationTimeUtc.ToString("o") - }; - - AssignServiceVersionTo(info); - - return info; - }); - - public static BuildInfo Version() - { - return buildInfo.Value; - } - - public class BuildInfo - { - public string AssemblyVersion { get; set; } - public string BuildDate { get; set; } - public string AssemblyInformationalVersion { get; set; } - public string AssemblyName { get; set; } - public string ServiceVersion { get; set; } - } - - static partial void AssignServiceVersionTo(BuildInfo buildInfo); - } -} diff --git a/MLS.Agent/ApplicationBuilderExtensions.cs b/MLS.Agent/ApplicationBuilderExtensions.cs deleted file mode 100644 index 6b9a40ee2..000000000 --- a/MLS.Agent/ApplicationBuilderExtensions.cs +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.StaticFiles.Infrastructure; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.FileProviders; -using Microsoft.Net.Http.Headers; -using Recipes; - -namespace MLS.Agent -{ - internal static class ApplicationBuilderExtensions - { - public static IApplicationBuilder EnableCachingBlazorContent(this IApplicationBuilder app) - { - return app.Use((context, next) => - { - if (HttpMethods.IsGet(context.Request.Method)) - { - context.Response.Headers[HeaderNames.CacheControl] = "public, max-age=604800"; - } - - return next(); - }); - } - - public static IApplicationBuilder UseStaticFilesFromToolLocationAndRootDirectory(this IApplicationBuilder app, DirectoryInfo rootDirectory) - { - var options = GetStaticFilesOptions(rootDirectory); - - app.UseStaticFiles(); - if (options != null) - { - app.UseStaticFiles(options); - } - - - return app; - } - - private static StaticFileOptions GetStaticFilesOptions(DirectoryInfo rootDirectory) - { - var paths = new List - { - Path.Combine(Path.GetDirectoryName(typeof(Startup).Assembly.Location), "wwwroot"), - rootDirectory.FullName - }; - - var providers = paths.Where(Directory.Exists).Select(p => new PhysicalFileProvider(p)).ToArray(); - - StaticFileOptions options = null; - - if (providers.Length > 0) - { - var combinedProvider = new CompositeFileProvider(providers); - - var sharedOptions = new SharedOptions { FileProvider = combinedProvider }; - options = new StaticFileOptions(sharedOptions); - } - - return options; - } - } -} \ No newline at end of file diff --git a/MLS.Agent/Blazor/BlazorPackageConfiguration.cs b/MLS.Agent/Blazor/BlazorPackageConfiguration.cs deleted file mode 100644 index 567d820c5..000000000 --- a/MLS.Agent/Blazor/BlazorPackageConfiguration.cs +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using Clockwise; -using Microsoft.AspNetCore.Builder; -using WorkspaceServer; -using WorkspaceServer.Packaging; - -namespace MLS.Agent.Blazor -{ - internal sealed class BlazorPackageConfiguration - { - public static void Configure( - IApplicationBuilder app, - IServiceProvider serviceProvider, - PackageRegistry registry, - Budget budget, - bool prepareIfNeeded) - { - List prepareTasks = new List(); - - foreach (var builderFactory in registry) - { - var builder = builderFactory.Result; - if (builder.BlazorSupported) - { - var package = (BlazorPackage) builder.GetPackage(); - if (PackageHasBeenBuiltAndHasBlazorStuff(package)) - { - SetupMappingsForBlazorContentsOfPackage(package, app); - } - else if(prepareIfNeeded) - { - prepareTasks.Add(Task.Run(() => package.EnsureReady(budget)).ContinueWith(t => { - if (t.IsCompletedSuccessfully) - { - SetupMappingsForBlazorContentsOfPackage(package, app); - } - })); - } - } - } - - Task.WaitAll(prepareTasks.ToArray()); - } - - private static void SetupMappingsForBlazorContentsOfPackage(BlazorPackage package, IApplicationBuilder builder) - { - builder.Map(package.CodeRunnerPath, appBuilder => - { - var blazorEntryPoint = package.BlazorEntryPointAssemblyPath; - appBuilder.UsePathBase(package.CodeRunnerPathBase); - appBuilder.UseClientSideBlazorFiles(blazorEntryPoint.FullName); - }); - } - - private static bool PackageHasBeenBuiltAndHasBlazorStuff(BlazorPackage package) - { - return package.BlazorEntryPointAssemblyPath.Exists; - } - } -} diff --git a/MLS.Agent/BrowserLaunchUri.cs b/MLS.Agent/BrowserLaunchUri.cs deleted file mode 100644 index ca54225be..000000000 --- a/MLS.Agent/BrowserLaunchUri.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; - -namespace MLS.Agent -{ - public class BrowserLaunchUri - { - public BrowserLaunchUri(string scheme, string host, ushort port) - { - Scheme = scheme ?? throw new ArgumentNullException(nameof(scheme)); - Host = host ?? throw new ArgumentNullException(nameof(host)); - Port = port; - } - - public string Scheme { get; } - public string Host { get; } - public ushort Port { get; } - - public override string ToString() - { - return $"{Scheme}://{Host}:{Port}"; - } - } -} \ No newline at end of file diff --git a/MLS.Agent/BrowserLauncher.cs b/MLS.Agent/BrowserLauncher.cs deleted file mode 100644 index dbe4e26fc..000000000 --- a/MLS.Agent/BrowserLauncher.cs +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Diagnostics; -using System.Runtime.InteropServices; - -namespace MLS.Agent -{ - internal class BrowserLauncher : IBrowserLauncher - { - public void LaunchBrowser(Uri uri) - { - if (uri == null) - { - throw new ArgumentNullException(nameof(uri)); - } - - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - Process.Start(new ProcessStartInfo("cmd", $"/c start {uri}")); - } - else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) - { - Process.Start("xdg-open", uri.ToString()); - } - else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - Process.Start("open", uri.ToString()); - } - } - } -} \ No newline at end of file diff --git a/MLS.Agent/CommandLine/CommandLineParser.cs b/MLS.Agent/CommandLine/CommandLineParser.cs deleted file mode 100644 index 25c8e96e6..000000000 --- a/MLS.Agent/CommandLine/CommandLineParser.cs +++ /dev/null @@ -1,430 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.CommandLine; -using System.CommandLine.Builder; -using System.CommandLine.Invocation; -using System.CommandLine.IO; -using System.CommandLine.Parsing; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Clockwise; -using Microsoft.AspNetCore.Hosting; -using Microsoft.DotNet.Interactive.Telemetry; -using Microsoft.Extensions.DependencyInjection; -using MLS.Agent.Markdown; -using MLS.Agent.Tools; -using MLS.Repositories; -using Recipes; -using WorkspaceServer; -using WorkspaceServer.Packaging; -using CommandHandler = System.CommandLine.Invocation.CommandHandler; - -namespace MLS.Agent.CommandLine -{ - public static class CommandLineParser - { - public delegate void StartServer( - StartupOptions options, - InvocationContext context); - - public delegate Task Install( - InstallOptions options, - IConsole console); - - public delegate Task Demo( - DemoOptions options, - IConsole console, - StartServer startServer = null, - InvocationContext invocationContext = null); - - public delegate Task TryGitHub( - TryGitHubOptions options, - IConsole console); - - public delegate Task Pack( - PackOptions options, - IConsole console); - - public delegate Task Verify( - VerifyOptions options, - IConsole console, - StartupOptions startupOptions, - MarkdownProcessingContext context); - - public delegate Task Publish( - PublishOptions options, - IConsole console, - StartupOptions startupOptions, - MarkdownProcessingContext context); - - public static Parser Create( - IServiceCollection services, - StartServer startServer = null, - Install install = null, - Demo demo = null, - TryGitHub tryGithub = null, - Pack pack = null, - Verify verify = null, - Publish publish = null, - ITelemetry telemetry = null, - IFirstTimeUseNoticeSentinel firstTimeUseNoticeSentinel = null) - { - if (services == null) - { - throw new ArgumentNullException(nameof(services)); - } - - startServer ??= (startupOptions, invocationContext) => - Program.ConstructWebHost(startupOptions).Run(); - - demo ??= DemoCommand.Do; - - tryGithub ??= (repo, console) => - GitHubHandler.Handler(repo, - console, - new GitHubRepoLocator()); - - verify ??= VerifyCommand.Do; - - publish ??= PublishCommand.Do; - - pack ??= PackCommand.Do; - - install ??= InstallCommand.Do; - - // Setup first time use notice sentinel. - firstTimeUseNoticeSentinel ??= - new FirstTimeUseNoticeSentinel(VersionSensor.Version().AssemblyInformationalVersion); - - // Setup telemetry. - telemetry ??= new Telemetry( - VersionSensor.Version().AssemblyInformationalVersion, - firstTimeUseNoticeSentinel); - var filter = new TelemetryFilter(Sha256Hasher.HashWithNormalizedCasing); - - var dirArgument = new Argument(result => - { - var directory = result.Tokens - .Select(t => t.Value) - .FirstOrDefault(); - - if (!string.IsNullOrEmpty(directory) && - !Directory.Exists(directory)) - { - result.ErrorMessage = $"Directory does not exist: {directory}"; - return null; - } - - return new FileSystemDirectoryAccessor( - directory ?? - Directory.GetCurrentDirectory()); - }, isDefault: true) - { - Name = "root-directory", - Arity = ArgumentArity.ZeroOrOne, - Description = "The root directory for your documentation" - }; - - var rootCommand = StartInTryMode(); - - rootCommand.AddCommand(StartInHostedMode()); - rootCommand.AddCommand(Demo()); - rootCommand.AddCommand(GitHub()); - rootCommand.AddCommand(Install()); - rootCommand.AddCommand(Pack()); - rootCommand.AddCommand(Verify()); - rootCommand.AddCommand(Publish()); - - return new CommandLineBuilder(rootCommand) - .UseDefaults() - .UseMiddleware(async (context, next) => - { - if (context.ParseResult.Errors.Count == 0) - { - telemetry.SendFiltered(filter, context.ParseResult); - } - - // If sentinel does not exist, print the welcome message showing the telemetry notification. - if (!firstTimeUseNoticeSentinel.Exists() && !Telemetry.SkipFirstTimeExperience) - { - context.Console.Out.WriteLine(); - context.Console.Out.WriteLine(Telemetry.WelcomeMessage); - - firstTimeUseNoticeSentinel.CreateIfNotExists(); - } - - if (context.ParseResult.Directives.Contains("debug") && - !(Clock.Current is VirtualClock)) - { - VirtualClock.Start(); - } - - await next(context); - }) - .Build(); - - RootCommand StartInTryMode() - { - var command = new RootCommand - { - Name = "dotnet-try", - Description = "Interactive documentation in your browser" - }; - - command.AddArgument(dirArgument); - - command.AddOption(new Option( - "--add-package-source", - "Specify an additional NuGet package source") - { - Argument = new Argument(() => new PackageSource(Directory.GetCurrentDirectory())) - { - Name = "NuGet source" - } - }); - - command.AddOption(new Option( - "--package", - "Specify a Try .NET package or path to a .csproj to run code samples with") - { - Argument = new Argument - { - Name = "name or .csproj" - } - }); - - command.AddOption(new Option( - "--package-version", - "Specify a Try .NET package version to use with the --package option") - { - Argument = new Argument - { - Name = "version" - } - }); - - command.AddOption(new Option( - "--uri", - "Specify a URL or a relative path to a Markdown file")); - - command.AddOption(new Option( - "--enable-preview-features", - "Enable preview features")); - - command.AddOption(new Option( - "--log-path", - "Enable file logging to the specified directory") - { - Argument = new Argument - { - Name = "dir" - } - }); - - command.AddOption(new Option( - "--verbose", - "Enable verbose logging to the console")); - - var portArgument = new Argument(); - - portArgument.AddValidator(symbolResult => - { - if (symbolResult.Tokens - .Select(t => t.Value) - .Count(value => !ushort.TryParse(value, out _)) > 0) - { - return "Invalid argument for --port option"; - } - - return null; - }); - - command.AddOption(new Option( - "--port", - "Specify the port for dotnet try to listen on") - { - Argument = portArgument - }); - - command.Handler = CommandHandler.Create((context, options) => - { - services.AddSingleton(_ => PackageRegistry.CreateForTryMode( - options.RootDirectory, - options.AddPackageSource)); - - startServer(options, context); - }); - - return command; - } - - Command StartInHostedMode() - { - var command = new Command("hosted") - { - new Option( - "--id", - description: "A unique id for the agent instance (e.g. its development environment id).", - getDefaultValue: () => Environment.MachineName), - new Option( - "--production", - "Specifies whether the agent is being run using production resources"), - new Option( - "--language-service", - "Specifies whether the agent is being run in language service-only mode"), - new Option( - new[] - { - "-k", - "--key" - }, - "The encryption key"), - new Option( - new[] - { - "--ai-key", - "--application-insights-key" - }, - "Application Insights key."), - new Option( - "--region-id", - "A unique id for the agent region"), - new Option( - "--log-to-file", - "Writes a log file") - }; - - command.Description = "Starts the Try .NET agent"; - - command.IsHidden = true; - - command.Handler = CommandHandler.Create((context, options) => - { - services.AddSingleton(_ => PackageRegistry.CreateForHostedMode()); - services.AddSingleton(c => new MarkdownProject(c.GetRequiredService())); - startServer(options, context); - }); - - return command; - } - - Command Demo() - { - var demoCommand = new Command( - "demo", - "Learn how to create Try .NET content with an interactive demo") - { - new Option( - "--output", - description: "Where should the demo project be written to?", - getDefaultValue: () => new DirectoryInfo(Directory.GetCurrentDirectory())) - }; - - demoCommand.Handler = CommandHandler.Create((options, context) => { demo(options, context.Console, startServer, context); }); - - return demoCommand; - } - - Command GitHub() - { - var argument = new Argument - { - // System.CommandLine parameter binding does lookup by name, - // so name the argument after the github command's string param - Name = nameof(TryGitHubOptions.Repo) - }; - - var github = new Command("github", "Try a GitHub repo") - { - argument - }; - - github.IsHidden = true; - - github.Handler = CommandHandler.Create(tryGithub); - - return github; - } - - Command Install() - { - var installCommand = new Command("install", "Install a Try .NET package") - { - new Argument - { - Name = nameof(InstallOptions.PackageName), - Arity = ArgumentArity.ExactlyOne - }, - new Option("--add-source") - }; - - installCommand.IsHidden = true; - - installCommand.Handler = CommandHandler.Create(install); - - return installCommand; - } - - Command Pack() - { - var packCommand = new Command("pack", "Create a Try .NET package") - { - new Argument - { - Name = nameof(PackOptions.PackTarget) - }, - new Option("--version", "The version of the Try .NET package"), - new Option("--enable-wasm", "Enables web assembly code execution") - }; - - packCommand.IsHidden = true; - - packCommand.Handler = CommandHandler.Create(pack); - - return packCommand; - } - - Command Verify() - { - var verifyCommand = new Command("verify", "Verify Markdown files found under the root directory.") - { - dirArgument - }; - - verifyCommand.Handler = CommandHandler.Create(verify); - - return verifyCommand; - } - - Command Publish() - { - var publishCommand = new Command("publish", "Publish code from sample projects found under the root directory into Markdown files in the target directory") - { - new Option( - "--format", - description: "Format of the files to publish", - getDefaultValue: () => PublishFormat.Markdown), - new Option( - "--target-directory", - description: "The path where the output files should go. This can be the same as the root directory, which will overwrite files in place.", - parseArgument: result => - { - var directory = result.Tokens - .Select(t => t.Value) - .Single(); - - return new FileSystemDirectoryAccessor(directory); - } - ), - dirArgument - }; - publishCommand.Handler = CommandHandler.Create(publish); - - return publishCommand; - } - } - } -} \ No newline at end of file diff --git a/MLS.Agent/CommandLine/DemoCommand.cs b/MLS.Agent/CommandLine/DemoCommand.cs deleted file mode 100644 index 073e3f1b3..000000000 --- a/MLS.Agent/CommandLine/DemoCommand.cs +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using MLS.Agent.Tools; -using System; -using System.CommandLine; -using System.CommandLine.Invocation; -using System.CommandLine.IO; -using System.IO; -using System.IO.Compression; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.DotNet.Interactive.Utility; - -namespace MLS.Agent.CommandLine -{ - public static class DemoCommand - { - public static Task Do( - DemoOptions options, - IConsole console, - CommandLineParser.StartServer startServer = null, - InvocationContext context = null) - { - var extractDemoFiles = true; - - if (!options.Output.Exists) - { - options.Output.Create(); - } - else - { - if (options.Output.GetFiles().Any()) - { - if (options.Output.GetFiles().All(f => f.Name != "QuickStart.md")) - { - console.Out.WriteLine($"Directory {options.Output} must be empty. To specify a directory to create the demo sample in, use: dotnet try demo --output "); - return Task.FromResult(-1); - } - - extractDemoFiles = false; - } - } - - if (extractDemoFiles) - { - using (var disposableDirectory = DisposableDirectory.Create()) - { - var assembly = typeof(Program).Assembly; - - using (var resourceStream = assembly.GetManifestResourceStream("demo.zip")) - { - var zipPath = Path.Combine(disposableDirectory.Directory.FullName, "demo.zip"); - - using (var fileStream = new FileStream(zipPath, FileMode.Create, FileAccess.Write)) - { - resourceStream.CopyTo(fileStream); - } - - ZipFile.ExtractToDirectory(zipPath, options.Output.FullName); - } - } - } - - startServer?.Invoke(new StartupOptions( - uri: new Uri("QuickStart.md", UriKind.Relative), - rootDirectory: new FileSystemDirectoryAccessor(options.Output)), - context); - - return Task.FromResult(0); - } - } -} \ No newline at end of file diff --git a/MLS.Agent/CommandLine/DemoOptions.cs b/MLS.Agent/CommandLine/DemoOptions.cs deleted file mode 100644 index 949d136e7..000000000 --- a/MLS.Agent/CommandLine/DemoOptions.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.IO; - -namespace MLS.Agent.CommandLine -{ - public class DemoOptions - { - public DemoOptions(DirectoryInfo output) - { - Output = output; - } - - public DirectoryInfo Output { get; } - } -} \ No newline at end of file diff --git a/MLS.Agent/CommandLine/DirectoryExtensions.cs b/MLS.Agent/CommandLine/DirectoryExtensions.cs deleted file mode 100644 index 77fdf49f5..000000000 --- a/MLS.Agent/CommandLine/DirectoryExtensions.cs +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.IO; -using MLS.Agent.Tools; - -namespace MLS.Agent.CommandLine -{ - internal static class DirectoryExtensions - { - private static readonly RelativeDirectoryPath _here = new RelativeDirectoryPath("./"); - - public static bool IsChildOf(this FileSystemInfo file, IDirectoryAccessor directory) - { - var parent = directory.GetFullyQualifiedPath(_here).FullName; - var child = Path.GetDirectoryName(file.FullName); - - child = child.EndsWith('/') || child.EndsWith('\\') ? child : child + "/"; - return IsBaseOf(parent, child, selfIsChild: true); - } - - public static bool IsSubDirectoryOf(this IDirectoryAccessor potentialChild, IDirectoryAccessor directory) - { - var child = potentialChild.GetFullyQualifiedPath(_here).FullName; - var parent = directory.GetFullyQualifiedPath(_here).FullName; - return IsBaseOf(parent, child, selfIsChild: false); - } - - private static bool IsBaseOf(string parent, string child, bool selfIsChild) - { - var parentUri = new Uri(parent); - var childUri = new Uri(child); - return (selfIsChild || parentUri != childUri) && parentUri.IsBaseOf(childUri); - } - - public static void EnsureDirectoryExists(this IDirectoryAccessor directoryAccessor, RelativePath path) - { - var relativeDirectoryPath = path.Match( - directory => directory, - file => file.Directory - ); - directoryAccessor.EnsureDirectoryExists(relativeDirectoryPath); - } - } -} \ No newline at end of file diff --git a/MLS.Agent/CommandLine/GithubHandler.cs b/MLS.Agent/CommandLine/GithubHandler.cs deleted file mode 100644 index 711cda4ea..000000000 --- a/MLS.Agent/CommandLine/GithubHandler.cs +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using MLS.Repositories; -using System.CommandLine; -using System.CommandLine.IO; -using System.Linq; -using System.Threading.Tasks; - -namespace MLS.Agent.CommandLine -{ - public static class GitHubHandler - { - public static async Task Handler(TryGitHubOptions options, IConsole console, IRepoLocator locator) - { - var repos = (await locator.LocateRepo(options.Repo)).ToArray(); - - if (repos.Length == 0) - { - console.Out.WriteLine($"Didn't find any repos called `{options.Repo}`"); - } - else if (repos[0].Name == options.Repo) - { - console.Out.WriteLine(GenerateCommandExample(repos[0].Name, repos[0].CloneUrl)); - - } - else - { - console.Out.WriteLine("Which of the following did you mean?"); - foreach (var instance in repos) - { - console.Out.WriteLine($"\t{instance.Name}"); - } - } - - string GenerateCommandExample(string name, string cloneUrl) - { - var text = $"Found repo `{name}`\n"; - text += $"To try `{name}`, cd to your desired directory and run the following command:\n\n"; - text += $"\tgit clone {cloneUrl} && dotnet try ."; - - return text; - } - } - } -} diff --git a/MLS.Agent/CommandLine/InstallCommand.cs b/MLS.Agent/CommandLine/InstallCommand.cs deleted file mode 100644 index 9020dd74f..000000000 --- a/MLS.Agent/CommandLine/InstallCommand.cs +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.CommandLine; -using System.Threading.Tasks; -using Microsoft.DotNet.Interactive.Utility; -using MLS.Agent.Tools; - -namespace MLS.Agent.CommandLine -{ - public static class InstallCommand - { - public static async Task Do(InstallOptions options, IConsole console) - { - var dotnet = new Dotnet(); - (await dotnet.ToolInstall( - options.PackageName, - options.Location, - options.AddSource.ToString())).ThrowOnFailure(); - - var tool = WorkspaceServer.WorkspaceFeatures.PackageTool.TryCreateFromDirectory(options.PackageName, new FileSystemDirectoryAccessor(options.Location)); - await tool.Prepare(); - } - } -} diff --git a/MLS.Agent/CommandLine/InstallOptions.cs b/MLS.Agent/CommandLine/InstallOptions.cs deleted file mode 100644 index 27bf43d50..000000000 --- a/MLS.Agent/CommandLine/InstallOptions.cs +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.IO; -using Microsoft.DotNet.Interactive.Utility; -using WorkspaceServer; -using WorkspaceServer.Packaging; - -namespace MLS.Agent.CommandLine -{ - public class InstallOptions - { - public InstallOptions(string packageName, PackageSource addSource = null, DirectoryInfo location = null) - { - if (string.IsNullOrWhiteSpace(packageName)) - { - throw new ArgumentException("Value cannot be null or whitespace.", nameof(packageName)); - } - AddSource = addSource; - PackageName = packageName; - Location = location ?? Package.DefaultPackagesDirectory; - } - - public PackageSource AddSource { get; } - - public string PackageName { get; } - public DirectoryInfo Location { get; } - } -} \ No newline at end of file diff --git a/MLS.Agent/CommandLine/MarkdownProcessingContext.cs b/MLS.Agent/CommandLine/MarkdownProcessingContext.cs deleted file mode 100644 index 03a46802a..000000000 --- a/MLS.Agent/CommandLine/MarkdownProcessingContext.cs +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.CommandLine; -using System.CommandLine.IO; -using System.IO; -using Microsoft.DotNet.Try.Markdown; -using MLS.Agent.Markdown; -using MLS.Agent.Tools; -using WorkspaceServer; -using WorkspaceServer.Servers; - -namespace MLS.Agent.CommandLine -{ - public class MarkdownProcessingContext - { - private readonly Lazy _lazyWorkspaceServer; - - - public MarkdownProcessingContext( - IDirectoryAccessor rootDirectory, - IDefaultCodeBlockAnnotations defaultAnnotations = null, - WriteFile writeFile = null, - IConsole console = null) - { - RootDirectory = rootDirectory; - Console = console ?? new SystemConsole(); - - var packageRegistry = PackageRegistry.CreateForTryMode(rootDirectory); - - Project = new MarkdownProject( - rootDirectory, - packageRegistry, - defaultAnnotations ?? new DefaultCodeBlockAnnotations()); - - _lazyWorkspaceServer = new Lazy(() => new WorkspaceServerMultiplexer(packageRegistry)); - - WriteFile = writeFile ?? File.WriteAllText; - } - - public IConsole Console { get; } - - public IDirectoryAccessor RootDirectory { get; } - - public WriteFile WriteFile { get; } - - public MarkdownProject Project { get; } - - public IWorkspaceServer WorkspaceServer => _lazyWorkspaceServer.Value; - - public IList Errors { get; } = new List(); - } -} \ No newline at end of file diff --git a/MLS.Agent/CommandLine/PackCommand.cs b/MLS.Agent/CommandLine/PackCommand.cs deleted file mode 100644 index 10798d735..000000000 --- a/MLS.Agent/CommandLine/PackCommand.cs +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.CommandLine; -using System.CommandLine.IO; -using System.IO; -using System.IO.Compression; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.DotNet.Interactive.Utility; -using MLS.Agent.Tools; -using WorkspaceServer.Packaging; - -namespace MLS.Agent.CommandLine -{ - public static class PackCommand - { - public static async Task Do(PackOptions options, IConsole console) - { - console.Out.WriteLine($"Creating package-tool from {options.PackTarget.FullName}"); - - using (var disposableDirectory = DisposableDirectory.Create()) - { - var temp = disposableDirectory.Directory; - var temp_projects = temp.CreateSubdirectory("projects"); - - var name = options.PackageName; - - var temp_projects_build = temp_projects.CreateSubdirectory("build"); - options.PackTarget.CopyTo(temp_projects_build); - - if (options.EnableWasm) - { - string runnerDirectoryName = "wasm"; - var temp_projects_wasm = temp_projects.CreateSubdirectory(runnerDirectoryName); - var temp_mlsblazor = temp.CreateSubdirectory("MLS.Blazor"); - await AddBlazorProject(temp_mlsblazor, GetProjectFile(temp_projects_build), name, temp_projects_wasm); - } - - var temp_toolproject = temp.CreateSubdirectory("project"); - var archivePath = Path.Combine(temp_toolproject.FullName, "package.zip"); - ZipFile.CreateFromDirectory(temp_projects.FullName, archivePath, CompressionLevel.Fastest, includeBaseDirectory: false); - - console.Out.WriteLine(archivePath); - - var projectFilePath = Path.Combine(temp_toolproject.FullName, "package-tool.csproj"); - var contentFilePath = Path.Combine(temp_toolproject.FullName, "program.cs"); - - await File.WriteAllTextAsync( - projectFilePath, - typeof(Program).ReadManifestResource("MLS.Agent.MLS.PackageTool.csproj")); - - await File.WriteAllTextAsync(contentFilePath, typeof(Program).ReadManifestResource("MLS.Agent.Program.cs")); - - var dotnet = new Dotnet(temp_toolproject); - var result = await dotnet.Build(); - - result.ThrowOnFailure("Failed to build intermediate project."); - var versionArg = ""; - - if(!string.IsNullOrEmpty(options.Version)) - { - versionArg = $"/p:PackageVersion={options.Version}"; - } - - result = await dotnet.Pack($@"/p:PackageId=""{name}"" /p:ToolCommandName=""{name}"" {versionArg} ""{projectFilePath}"" -o ""{options.OutputDirectory.FullName}"""); - - result.ThrowOnFailure("Package build failed."); - - return name; - } - } - - private static async Task AddBlazorProject(DirectoryInfo blazorTargetDirectory, FileInfo projectToReference, string name, DirectoryInfo wasmLocation) - { - var initializer = new BlazorPackageInitializer(name, new System.Collections.Generic.List<(string,string,string)>()); - await initializer.Initialize(blazorTargetDirectory); - - await AddReference(blazorTargetDirectory, projectToReference); - var dotnet = new Dotnet(blazorTargetDirectory); - var result = await dotnet.Publish($"-o {wasmLocation.FullName}"); - result.ThrowOnFailure(); - } - - private static async Task AddReference(DirectoryInfo blazorTargetDirectory, FileInfo projectToReference) - { - var dotnet = new Dotnet(blazorTargetDirectory); - (await dotnet.AddReference(projectToReference)).ThrowOnFailure(); - } - - private static FileInfo GetProjectFile(DirectoryInfo directory) - { - return directory.GetFiles("*.csproj").Single(); - } - } -} diff --git a/MLS.Agent/CommandLine/PackOptions.cs b/MLS.Agent/CommandLine/PackOptions.cs deleted file mode 100644 index 4f187ca6d..000000000 --- a/MLS.Agent/CommandLine/PackOptions.cs +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.IO; -using System.Linq; - -namespace MLS.Agent.CommandLine -{ - public class PackOptions - { - private string _packageName; - - public PackOptions( - DirectoryInfo packTarget, - string version = null, - DirectoryInfo outputDirectory = null, - bool enableWasm = false, - string packageName = null) - { - PackTarget = packTarget ?? throw new ArgumentNullException(nameof(packTarget)); - OutputDirectory = outputDirectory ?? packTarget; - EnableWasm = enableWasm; - Version = version; - _packageName = packageName; - } - - public DirectoryInfo PackTarget { get; } - public DirectoryInfo OutputDirectory { get; } - public bool EnableWasm { get; } - public string Version { get; } - public string PackageName - { - get - { - if (!string.IsNullOrEmpty(_packageName)) - { - return _packageName; - } - - var csproj = PackTarget.GetFiles("*.csproj").Single(); - _packageName = Path.GetFileNameWithoutExtension(csproj.Name); - return _packageName; - } - } - } -} \ No newline at end of file diff --git a/MLS.Agent/CommandLine/PublishCommand.cs b/MLS.Agent/CommandLine/PublishCommand.cs deleted file mode 100644 index 9dfd402f4..000000000 --- a/MLS.Agent/CommandLine/PublishCommand.cs +++ /dev/null @@ -1,204 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.CommandLine; -using System.CommandLine.IO; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Markdig; -using Markdig.Renderers; -using Markdig.Renderers.Normalize; -using Markdig.Syntax; -using Microsoft.DotNet.Try.Markdown; -using Microsoft.DotNet.Try.Protocol; -using MLS.Agent.Markdown; -using MLS.Agent.Tools; - -namespace MLS.Agent.CommandLine -{ - public delegate void WriteFile(string path, string content); - - - public static class PublishCommand - { - public static async Task Do( - PublishOptions publishOptions, - IConsole console, - StartupOptions startupOptions = null, - MarkdownProcessingContext context = null) - { - context ??= new MarkdownProcessingContext( - publishOptions.RootDirectory, - startupOptions, - console: console); - - var verifyResult = await VerifyCommand.Do( - publishOptions, - console, - startupOptions, - context); - - if (verifyResult != 0) - { - return verifyResult; - } - - var targetIsSubDirectoryOfSource = - publishOptions.TargetDirectory - .IsSubDirectoryOf(publishOptions.RootDirectory); - - foreach (var markdownFile in context.Project.GetAllMarkdownFiles()) - { - var fullSourcePath = publishOptions.RootDirectory.GetFullyQualifiedPath(markdownFile.Path); - - if (targetIsSubDirectoryOfSource && - fullSourcePath.IsChildOf(publishOptions.TargetDirectory)) - { - continue; - } - - var sessions = await markdownFile.GetSessions(); - - var outputsBySessionName = new Dictionary(); - - foreach (var session in sessions) - { - if (session.CodeBlocks.Any(b => b.Annotations is OutputBlockAnnotations)) - { - var workspace = await session.GetWorkspaceAsync(); - - var runArgs = - session.CodeBlocks - .Select(c => c.Annotations) - .OfType() - .Select(a => a.RunArgs) - .FirstOrDefault(); - - var request = new WorkspaceRequest( - workspace, - runArgs: runArgs); - - var result = await context.WorkspaceServer.Run(request); - - if (result.Succeeded) - { - var output = result.Output.Count > 0 - ? string.Join("\n", result.Output) - : result.Exception; - - outputsBySessionName.Add( - session.Name, - output); - } - else - { - context.Errors.Add( - $"Running session {session.Name} failed:\n" + result.Exception); - } - } - } - - var document = ParseMarkdownDocument(markdownFile); - - var rendered = await Render( - publishOptions.Format, - document, - outputsBySessionName); - - var targetPath = WriteTargetFile( - rendered, - markdownFile.Path, - publishOptions, - context, - publishOptions.Format); - - console.Out.WriteLine($"Published '{fullSourcePath}' to {targetPath}"); - } - - return 0; - } - - private static string WriteTargetFile( - string content, - RelativeFilePath relativePath, - PublishOptions publishOptions, - MarkdownProcessingContext context, - PublishFormat format) - { - context.Project - .DirectoryAccessor - .EnsureDirectoryExists(relativePath); - - var targetPath = publishOptions - .TargetDirectory - .GetFullyQualifiedPath(relativePath).FullName; - - if (format == PublishFormat.HTML) - { - targetPath = Path.ChangeExtension(targetPath, ".html"); - } - - context.WriteFile(targetPath, content); - - return targetPath; - } - - private static async Task Render( - PublishFormat format, - MarkdownDocument document, - Dictionary outputsBySessionName) - { - MarkdownPipeline pipeline; - IMarkdownRenderer renderer; - var writer = new StringWriter(); - switch (format) - { - case PublishFormat.Markdown: - pipeline = new MarkdownPipelineBuilder() - .UseNormalizeCodeBlockAnnotations(outputsBySessionName) - .Build(); - var normalizeRenderer = new NormalizeRenderer(writer); - normalizeRenderer.Writer.NewLine = "\n"; - renderer = normalizeRenderer; - break; - case PublishFormat.HTML: - pipeline = new MarkdownPipelineBuilder() - .UseCodeBlockAnnotations(inlineControls: false) - .Build(); - renderer = new HtmlRenderer(writer); - break; - default: - throw new ArgumentOutOfRangeException(nameof(format), format, null); - } - - pipeline.Setup(renderer); - - var blocks = document - .OfType() - .OrderBy(c => c.Order) - .ToList(); - - await Task.WhenAll(blocks.Select(b => b.InitializeAsync())); - - renderer.Render(document); - writer.Flush(); - - var rendered = writer.ToString(); - return rendered; - } - - private static MarkdownDocument ParseMarkdownDocument(MarkdownFile markdownFile) - { - var pipeline = markdownFile.Project.GetMarkdownPipelineFor(markdownFile.Path); - - var markdown = markdownFile.ReadAllText(); - - return Markdig.Markdown.Parse( - markdown, - pipeline); - } - } -} \ No newline at end of file diff --git a/MLS.Agent/CommandLine/PublishFormat.cs b/MLS.Agent/CommandLine/PublishFormat.cs deleted file mode 100644 index e9f151f84..000000000 --- a/MLS.Agent/CommandLine/PublishFormat.cs +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -namespace MLS.Agent.CommandLine -{ - public enum PublishFormat - { - Markdown, - HTML - } -} \ No newline at end of file diff --git a/MLS.Agent/CommandLine/PublishOptions.cs b/MLS.Agent/CommandLine/PublishOptions.cs deleted file mode 100644 index 448531ddf..000000000 --- a/MLS.Agent/CommandLine/PublishOptions.cs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using MLS.Agent.Tools; - -namespace MLS.Agent.CommandLine -{ - public class PublishOptions : VerifyOptions - { - public PublishOptions( - IDirectoryAccessor rootDirectory, - IDirectoryAccessor targetDirectory = null, - PublishFormat format = PublishFormat.Markdown) : base(rootDirectory) - { - Format = format; - TargetDirectory = targetDirectory ?? rootDirectory; - } - - public IDirectoryAccessor TargetDirectory { get; } - - public PublishFormat Format { get; } - } -} \ No newline at end of file diff --git a/MLS.Agent/CommandLine/StartupMode.cs b/MLS.Agent/CommandLine/StartupMode.cs deleted file mode 100644 index b9c3feec6..000000000 --- a/MLS.Agent/CommandLine/StartupMode.cs +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -namespace MLS.Agent.CommandLine -{ - public enum StartupMode - { - Hosted, - Try - } -} \ No newline at end of file diff --git a/MLS.Agent/CommandLine/StartupOptions.cs b/MLS.Agent/CommandLine/StartupOptions.cs deleted file mode 100644 index 38e978ad7..000000000 --- a/MLS.Agent/CommandLine/StartupOptions.cs +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.CommandLine.Parsing; -using System.IO; -using Microsoft.DotNet.Try.Markdown; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using MLS.Agent.Tools; -using WorkspaceServer.Packaging; - -namespace MLS.Agent.CommandLine -{ - public class StartupOptions : IDefaultCodeBlockAnnotations - { - private readonly ParseResult _parseResult; - - public static StartupOptions FromCommandLine(string commandLine) - { - StartupOptions startupOptions = null; - - CommandLineParser.Create(new ServiceCollection(), startServer: (options, context) => - { - startupOptions = options; - }) - .InvokeAsync(commandLine); - - return startupOptions; - } - - public StartupOptions( - bool production = false, - bool languageService = false, - string key = null, - string applicationInsightsKey = null, - string id = null, - string regionId = null, - PackageSource addPackageSource = null, - Uri uri = null, - DirectoryInfo logPath = null, - bool verbose = false, - bool enablePreviewFeatures = false, - string package = null, - string packageVersion = null, - ParseResult parseResult = null, - ushort? port = null, - IDirectoryAccessor rootDirectory = null) - { - _parseResult = parseResult; - LogPath = logPath; - Verbose = verbose; - Id = id; - Production = production; - IsLanguageService = languageService; - Key = key; - ApplicationInsightsKey = applicationInsightsKey; - RegionId = regionId; - RootDirectory = rootDirectory?? new FileSystemDirectoryAccessor(new DirectoryInfo(Directory.GetCurrentDirectory())); - AddPackageSource = addPackageSource; - Uri = uri; - EnablePreviewFeatures = enablePreviewFeatures; - Package = package; - PackageVersion = packageVersion; - Port = port; - } - - - public bool EnablePreviewFeatures { get; } - public string Id { get; } - public string RegionId { get; } - public IDirectoryAccessor RootDirectory { get; } - public PackageSource AddPackageSource { get; } - public Uri Uri { get; set; } - public bool Production { get; } - public bool IsLanguageService { get; set; } - public string Key { get; } - public string ApplicationInsightsKey { get; } - - public StartupMode Mode - { - get - { - switch (_parseResult?.CommandResult?.Command?.Name) - { - case "hosted": - return StartupMode.Hosted; - default: - return StartupMode.Try; - } - } - } - - public string EnvironmentName => - Production || Mode != StartupMode.Hosted - ? Environments.Production - : Environments.Development; - - public DirectoryInfo LogPath { get; } - - public bool Verbose { get; } - - public string Package { get; } - - public string PackageVersion { get; } - public ushort? Port { get; } - } -} \ No newline at end of file diff --git a/MLS.Agent/CommandLine/TryGitHubOptions.cs b/MLS.Agent/CommandLine/TryGitHubOptions.cs deleted file mode 100644 index c7dc68d81..000000000 --- a/MLS.Agent/CommandLine/TryGitHubOptions.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -namespace MLS.Agent.CommandLine -{ - public class TryGitHubOptions - { - public TryGitHubOptions(string repo) - { - Repo = repo; - } - - public string Repo { get; } - } -} \ No newline at end of file diff --git a/MLS.Agent/CommandLine/VerifyCommand.cs b/MLS.Agent/CommandLine/VerifyCommand.cs deleted file mode 100644 index dfb029eb0..000000000 --- a/MLS.Agent/CommandLine/VerifyCommand.cs +++ /dev/null @@ -1,237 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.CommandLine; -using System.CommandLine.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Microsoft.DotNet.Try.Markdown; -using Microsoft.DotNet.Try.Protocol; -using MLS.Agent.Markdown; -using MLS.Agent.Tools; - -namespace MLS.Agent.CommandLine -{ - public static class VerifyCommand - { - public static async Task Do( - VerifyOptions verifyOptions, - IConsole console, - StartupOptions startupOptions = null, - MarkdownProcessingContext context = null) - { - context ??= new MarkdownProcessingContext( - verifyOptions.RootDirectory, - startupOptions, - console: console); - - var markdownFiles = context.Project.GetAllMarkdownFiles().ToArray(); - - console.Out.WriteLine("Verifying..."); - - if (markdownFiles.Length == 0) - { - console.Error.WriteLine($"No markdown files found under {context.RootDirectory.GetFullyQualifiedRoot()}"); - return -1; - } - - foreach (var markdownFile in markdownFiles) - { - var fullName = context.RootDirectory.GetFullyQualifiedPath(markdownFile.Path).FullName; - - var markdownFileDir = context.RootDirectory.GetDirectoryAccessorForRelativePath(markdownFile.Path.Directory); - - console.Out.WriteLine(); - console.Out.WriteLine(fullName); - console.Out.WriteLine(new string('-', fullName.Length)); - - foreach (var session in await markdownFile.GetSessions()) - { - var sessionProjectOrPackageNames = - session - .CodeBlocks - .Where(a => a.Annotations is CodeBlockAnnotations) - .Select(block => block.ProjectOrPackageName()) - .Distinct(); - - if (sessionProjectOrPackageNames.Count() != 1) - { - var error = $"Session cannot span projects or packages: --session {session.Name}"; - AddError(error, context); - continue; - } - - foreach (var block in session.CodeBlocks) - { - VerifyAnnotationReferences( - block, - markdownFileDir, - console, - context); - } - - Console.ResetColor(); - - if (!session.CodeBlocks.Any(block => block.Diagnostics.Any())) - { - await Compile( - session, - context); - } - - Console.ResetColor(); - } - } - - if (context.Errors.Count > 0) - { - Console.ForegroundColor = ConsoleColor.Red; - } - else - { - Console.ForegroundColor = ConsoleColor.Green; - } - - console.Out.WriteLine($"\nFound {context.Errors.Count} error(s)"); - - Console.ResetColor(); - - return context.Errors.Count == 0 - ? 0 - : 1; - } - - private static void VerifyAnnotationReferences( - AnnotatedCodeBlock annotatedCodeBlock, - IDirectoryAccessor markdownFileDir, - IConsole console, - MarkdownProcessingContext context) - { - Console.ResetColor(); - - console.Out.WriteLine(" Checking Markdown..."); - - var diagnostics = annotatedCodeBlock.Diagnostics.ToArray(); - var hasDiagnostics = diagnostics.Any(); - - if (hasDiagnostics) - { - Console.ForegroundColor = ConsoleColor.Red; - } - else - { - Console.ForegroundColor = ConsoleColor.Green; - } - - if (annotatedCodeBlock.Annotations is LocalCodeBlockAnnotations annotations) - { - var file = annotations?.SourceFile ?? annotations?.DestinationFile; - var fullyQualifiedPath = file != null - ? markdownFileDir.GetFullyQualifiedPath(file).FullName - : "UNKNOWN"; - - var project = annotatedCodeBlock.ProjectOrPackageName() ?? "UNKNOWN"; - - var symbol = hasDiagnostics - ? "X" - : "✓"; - - var error = $" {symbol} Line {annotatedCodeBlock.Line + 1}:\t{fullyQualifiedPath} (in project {project})"; - - if (hasDiagnostics) - { - context.Errors.Add(error); - } - - console.Out.WriteLine(error); - } - - foreach (var diagnostic in diagnostics) - { - console.Out.WriteLine($"\t\t{diagnostic}"); - } - } - - internal static void AddError( - string error, - MarkdownProcessingContext context) - { - Console.ForegroundColor = ConsoleColor.Red; - - context.Errors.Add(error); - - context.Console.Out.WriteLine(error); - } - - internal static async Task Compile( - Session session, - MarkdownProcessingContext context) - { - var region = session.CodeBlocks - .Select(b => b.Annotations) - .OfType() - .Select(a => a.Region) - .Distinct() - .First(); - - var description = session.CodeBlocks.Count == 1 || string.IsNullOrWhiteSpace(session.Name) - ? $"region \"{region}\"" - : $"session \"{session.Name}\""; - - context.Console.Out.WriteLine($"\n Compiling samples for {description}\n"); - - var workspace = await session.GetWorkspaceAsync(); - - if (!session.IsProjectCompatibleWithLanguage) - { - var error = $" Build failed as project {session.ProjectOrPackageName} is not compatible with language {session.Language}"; - AddError(error, context); - } - - var result = await context.WorkspaceServer.Compile(new WorkspaceRequest(workspace)); - - var projectDiagnostics = result.GetFeature() - .Where(e => e.Severity == DiagnosticSeverity.Error) - .ToArray(); - if (projectDiagnostics.Any()) - { - var error = new StringBuilder(); - error.AppendLine($" Build failed for project {session.ProjectOrPackageName}"); - - foreach (var diagnostic in projectDiagnostics) - { - error.AppendLine($"\t\t{diagnostic.Location}: {diagnostic.Message}"); - } - - AddError(error.ToString(), context); - } - else - { - var symbol = !result.Succeeded - ? "X" - : "✓"; - - if (result.Succeeded) - { - Console.ForegroundColor = ConsoleColor.Green; - - context.Console.Out.WriteLine($" {symbol} No errors found within samples for {description}"); - } - else - { - var error = new StringBuilder(); - error.AppendLine($" {symbol} Errors found within samples for {description}"); - - foreach (var diagnostic in result.GetFeature()) - { - error.AppendLine($"\t\t{diagnostic.Message}"); - } - - AddError(error.ToString(), context); - } - } - } - } -} \ No newline at end of file diff --git a/MLS.Agent/CommandLine/VerifyOptions.cs b/MLS.Agent/CommandLine/VerifyOptions.cs deleted file mode 100644 index d07f39cc2..000000000 --- a/MLS.Agent/CommandLine/VerifyOptions.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using MLS.Agent.Tools; - -namespace MLS.Agent.CommandLine -{ - public class VerifyOptions - { - public VerifyOptions(IDirectoryAccessor rootDirectory) - { - RootDirectory = rootDirectory ?? throw new System.ArgumentNullException(nameof(rootDirectory)); - } - - public IDirectoryAccessor RootDirectory { get; } - } -} \ No newline at end of file diff --git a/MLS.Agent/CommandLine/VerifyResult.cs b/MLS.Agent/CommandLine/VerifyResult.cs deleted file mode 100644 index cf757aa53..000000000 --- a/MLS.Agent/CommandLine/VerifyResult.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -namespace MLS.Agent.CommandLine -{ - internal class VerifyResult - { - public VerifyResult(int errorCount) - { - ErrorCount = errorCount; - } - - public int ErrorCount { get; } - } -} \ No newline at end of file diff --git a/MLS.Agent/Controllers/ClientConfigurationController.cs b/MLS.Agent/Controllers/ClientConfigurationController.cs deleted file mode 100644 index 54f9d6880..000000000 --- a/MLS.Agent/Controllers/ClientConfigurationController.cs +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.IO; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.DotNet.Try.Protocol; -using Pocket; -using Recipes; -using static Pocket.Logger; -using HttpRequest = Microsoft.AspNetCore.Http.HttpRequest; - -namespace MLS.Agent.Controllers -{ - public class ClientConfigurationController : Controller - { - private const string ClientConfiguration = "/clientConfiguration"; - public static RequestDescriptor ClientConfigurationApi => new RequestDescriptor(ClientConfiguration); - - [HttpPost] - [Route(ClientConfiguration)] - public async Task ConfigurationAsync() - { - using (var operation = Log.ConfirmOnExit()) - { - var requestBody = await ReadBody(Request); - - var links = new RequestDescriptors(new RequestDescriptor(Request.Path, Request.Method, requestBody: requestBody)) - { - Configuration = ClientConfigurationController.ClientConfigurationApi, - Completion = LanguageServicesController.CompletionApi, - AcceptCompletion = new RequestDescriptor("{acceptanceUri}", templated: true), - LoadFromGist = new RequestDescriptor("/workspace/fromgist/{gistId}/{commitHash?}", method: "GET",templated: true, - properties: new[] - { - new RequestDescriptorProperty("workspaceType"), - new RequestDescriptorProperty("extractBuffers") - }), - Diagnostics = LanguageServicesController.DiagnosticsApi, - SignatureHelp = LanguageServicesController.SignatureHelpApi, - Snippet = new RequestDescriptor("/snippet",method: "GET", - properties: new[] - { - new RequestDescriptorProperty("from"), - }), - Run = RunController.RunApi, - Compile = CompileController.CompileApi, - Version = SensorsController.VersionApi, - ProjectFromGist = new RequestDescriptor("/project/fromGist"), - RegionsFromFiles = ProjectController.RegionsFromFilesApi, - GetPackage = PackagesController.GetPackageApi - }; - - var versionId = links.ComputeHash(); - var clientConfig = new ClientConfiguration(versionId, links, 30000, string.Empty, false); - operation.Succeed(); - return Ok(clientConfig); - } - } - - private static async Task ReadBody(HttpRequest request) - { - string body = null; - if (request.Body != null) - { - using (var reader = new StreamReader(request.Body)) - { - body = await reader.ReadToEndAsync(); - } - } - return body; - } - } -} \ No newline at end of file diff --git a/MLS.Agent/Controllers/CompileController.cs b/MLS.Agent/Controllers/CompileController.cs deleted file mode 100644 index e53b2a925..000000000 --- a/MLS.Agent/Controllers/CompileController.cs +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Threading.Tasks; -using Clockwise; -using Microsoft.AspNetCore.Mvc; -using Microsoft.DotNet.Try.Protocol; -using MLS.Agent.Middleware; -using Pocket; -using WorkspaceServer.Servers; -using static Pocket.Logger; - -namespace MLS.Agent.Controllers -{ - public class CompileController : Controller - { - private const string CompileRoute = "/workspace/compile"; - public static RequestDescriptor CompileApi => new RequestDescriptor(CompileRoute, timeoutMs: 600000); - - - private readonly IWorkspaceServer _workspaceServer; - private readonly CompositeDisposable _disposables = new CompositeDisposable(); - - public CompileController( - IWorkspaceServer workspaceServer) - { - _workspaceServer = workspaceServer; - } - - [HttpPost] - [Route(CompileRoute)] - [DebugEnableFilter] - public async Task Compile( - [FromBody] WorkspaceRequest request, - [FromHeader(Name = "Timeout")] string timeoutInMilliseconds = "45000") - { - using (var operation = Log.OnEnterAndConfirmOnExit()) - { - var workspaceType = request.Workspace.WorkspaceType; - - operation.Info("Compiling workspaceType {workspaceType}", workspaceType); - - if (!int.TryParse(timeoutInMilliseconds, out var timeoutMs)) - { - return BadRequest(); - } - - if (string.Equals(workspaceType, "script", StringComparison.OrdinalIgnoreCase)) - { - return BadRequest(); - } - - var runTimeout = TimeSpan.FromMilliseconds(timeoutMs); - var budget = new TimeBudget(runTimeout); - - var result = await _workspaceServer.Compile(request, budget); - budget.RecordEntry(); - operation.Succeed(); - return Ok(result); - } - } - - protected override void Dispose(bool disposing) - { - if (disposing) - { - _disposables.Dispose(); - } - - base.Dispose(disposing); - } - } -} diff --git a/MLS.Agent/Controllers/DisplayExtensions.cs b/MLS.Agent/Controllers/DisplayExtensions.cs deleted file mode 100644 index fe4bd4690..000000000 --- a/MLS.Agent/Controllers/DisplayExtensions.cs +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Linq; -using System.Net.Http; -using System.Text; -using System.Threading.Tasks; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -namespace MLS.Agent.Controllers -{ - public static class DisplayExtensions - { - public static async Task ToDisplayString(this HttpResponseMessage response) - { - var sb = new StringBuilder(); - - sb.Append("Status code: "); - sb.Append((int) response.StatusCode); - sb.Append(" "); - sb.Append(response.ReasonPhrase); - sb.AppendLine(); - - sb.AppendLine("Content headers:"); - - foreach (var header in response.Headers.Concat(response.Content.Headers)) - { - sb.Append(" "); - sb.Append(header.Key); - sb.Append(": "); - sb.Append(string.Join("; ", header.Value)); - sb.AppendLine(); - } - - sb.AppendLine("Content:"); - - var content = await response.Content.ReadAsStringAsync(); - - try - { - var json = JToken.Parse(content); - - sb.Append(json.ToString(Formatting.Indented)); - - sb.Replace("\r\n", "\n"); - } - catch (JsonReaderException) - { - sb.Append(content); - } - - return sb.ToString().Split("\n"); - } - } -} diff --git a/MLS.Agent/Controllers/DocumentationController.cs b/MLS.Agent/Controllers/DocumentationController.cs deleted file mode 100644 index 9cb825095..000000000 --- a/MLS.Agent/Controllers/DocumentationController.cs +++ /dev/null @@ -1,285 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Microsoft.ApplicationInsights.AspNetCore.Extensions; -using Microsoft.AspNetCore.Html; -using Microsoft.AspNetCore.Mvc; -using Microsoft.DotNet.Try.Markdown; -using MLS.Agent.CommandLine; -using MLS.Agent.Markdown; -using MLS.Agent.Tools; -using Recipes; -using WorkspaceServer; -using WorkspaceServer.Packaging; - -namespace MLS.Agent.Controllers -{ - public class DocumentationController : Controller - { - private readonly MarkdownProject _markdownProject; - private readonly StartupOptions _startupOptions; - private readonly PackageRegistry _packageRegistry; - private static readonly string _cacheBuster = VersionSensor.Version().AssemblyVersion; - - public DocumentationController(MarkdownProject markdownProject, StartupOptions startupOptions, PackageRegistry packageRegistry) - { - _markdownProject = markdownProject ?? - throw new ArgumentNullException(nameof(markdownProject)); - _startupOptions = startupOptions; - _packageRegistry = packageRegistry ?? - throw new ArgumentNullException(nameof(packageRegistry)); - } - - [HttpGet] - [Route("{*path:regex(.*.md?$)}")] - public async Task ShowMarkdownFile(string path) - { - if (_startupOptions.Mode != StartupMode.Try) - { - return NotFound(); - } - - var relativeFilePath = new RelativeFilePath(path); - - if (!_markdownProject.TryGetMarkdownFile(relativeFilePath, out var markdownFile)) - { - return NotFound(); - } - - var hostUrl = Request.GetUri(); - - var blocks = (await markdownFile.GetEditableAnnotatedCodeBlocks()).ToArray(); - - var maxEditorPerSession = blocks.Length > 0 - ? blocks - .GroupBy(b => b.Annotations.Session) - .Max(editors => editors.Count()) - : 0; - - var pipeline = _markdownProject.GetMarkdownPipelineFor(markdownFile.Path); - - var extension = pipeline.Extensions.FindExact(); - - if (extension != null) - { - extension.InlineControls = maxEditorPerSession <= 1; - extension.EnablePreviewFeatures = _startupOptions.EnablePreviewFeatures; - - } - - - - var content = maxEditorPerSession <= 1 - ? await OneColumnLayoutScaffold( - $"{hostUrl.Scheme}://{hostUrl.Authority}", - markdownFile) - : await TwoColumnLayoutScaffold( - $"{hostUrl.Scheme}://{hostUrl.Authority}", - markdownFile); - - return Content(content.ToString(), "text/html"); - } - - [HttpGet] - [Route("/")] - public async Task ShowIndex() - { - const string documentSvg = ""; - var links = string.Join( - "\n", - _markdownProject.GetAllMarkdownFiles() - .Select(f => - $@"
  • {documentSvg}{f.Path.Value}
  • ")); - - return Content(Index(links).ToString(), "text/html"); - } - - - public static async Task SessionControlsHtml(MarkdownFile markdownFile, bool enablePreviewFeatures = false) - { - var sessions = (await markdownFile - .GetAnnotatedCodeBlocks()) - .GroupBy(b => b.Annotations.Session); - - var sb = new StringBuilder(); - - foreach (var session in sessions) - { - sb.AppendLine( - $@""); - - sb.AppendLine(enablePreviewFeatures - ? $@"
    " - : $@"
    "); - } - - return new HtmlString(sb.ToString()); - } - - private async Task GetAutoEnableOptions(MarkdownFile file) - { - bool useWasmRunner; - - if (_startupOptions.Package != null) - { - var package = await _packageRegistry.Get(_startupOptions.Package); - useWasmRunner = package.CanSupportWasm; - } - else - { - var blocks = await file.GetAnnotatedCodeBlocks(); - - var packageUsesWasm = await Task.WhenAll(blocks - .Select(b => b.PackageName()) - .Where(p => !string.IsNullOrWhiteSpace(p)) - .Select(async name => (await _packageRegistry.Get(name))?.CanSupportWasm ?? false)); - - useWasmRunner = packageUsesWasm.Any(p => p); - } - - var requestUri = Request.GetUri(); - - var hostUrl = $"{requestUri.Scheme}://{requestUri.Authority}"; - return new AutoEnableOptions(hostUrl, useWasmRunner); - } - - private class AutoEnableOptions - { - public AutoEnableOptions(string apiBaseAddress, bool useWasmRunner) - { - ApiBaseAddress = apiBaseAddress; - UseWasmRunner = useWasmRunner; - } - - public string ApiBaseAddress { get; } - - public bool UseWasmRunner { get; } - } - - private IHtmlContent Layout( - string hostUrl, - MarkdownFile markdownFile, - IHtmlContent content, - AutoEnableOptions autoEnableOptions) => - $@" - - - - - - - - - {MathSupport()} - dotnet try - {markdownFile.Path.Value.HtmlEncode()} - - - - {Header()} -
    - {content} -
    - - {Footer()} - - - - -".ToHtmlContent(); - - private IHtmlContent MathSupport() => - @" - - ".ToHtmlContent(); - - private async Task OneColumnLayoutScaffold(string hostUrl, MarkdownFile markdownFile) => - Layout( - hostUrl, - markdownFile, - await DocumentationDiv(markdownFile), - await GetAutoEnableOptions(markdownFile)); - - private static async Task DocumentationDiv(MarkdownFile markdownFile) => - $@"
    - {await markdownFile.ToHtmlContentAsync()} -
    ".ToHtmlContent(); - - private async Task TwoColumnLayoutScaffold(string hostUrl, MarkdownFile markdownFile) => - Layout(hostUrl, markdownFile, - $@"{await DocumentationDiv(markdownFile)} -
    - {await SessionControlsHtml(markdownFile, _startupOptions.EnablePreviewFeatures)} -
    ".ToHtmlContent(), - await GetAutoEnableOptions(markdownFile)); - - private IHtmlContent Index(string html) => - $@" - - - - - - - dotnet try - {_startupOptions.RootDirectory.GetFullyQualifiedRoot().FullName.HtmlEncode()} - - - - {Header()} -
    -
      - {html} -
    -
    - - {Footer()} - - - -".ToHtmlContent(); - - private IHtmlContent Header() => $@" -
    -
    - Try .NET - {_startupOptions.RootDirectory.GetFullyQualifiedRoot().FullName.ToLowerInvariant().HtmlEncode()} -
    - Powered by Try .NET -
    ".ToHtmlContent(); - - private IHtmlContent Footer() => @" -".ToHtmlContent(); - } -} \ No newline at end of file diff --git a/MLS.Agent/Controllers/EmbeddableController.cs b/MLS.Agent/Controllers/EmbeddableController.cs deleted file mode 100644 index 18203db56..000000000 --- a/MLS.Agent/Controllers/EmbeddableController.cs +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Web; -using Microsoft.AspNetCore.Mvc; -using Newtonsoft.Json; -using Recipes; - -namespace MLS.Agent.Controllers -{ - public class EmbeddableController : Controller - { - - [HttpGet] - [Route("/ide")] - [Route("/editor")] - [Route("/v2/ide")] - [Route("/v2/editor")] - public IActionResult Html() - { - return Content($@" - - - - - - - - - -
    - - - - -", "text/html"); - } - - private string GetClientParameters() - { - // Uncomment to enable testing /ide without going through orchestrator - // var referrer = "http://localhost:4242"; - var referrer = HttpContext.Request.Headers["referer"].ToString(); - - if (!string.IsNullOrWhiteSpace(referrer) && Uri.TryCreate(referrer, UriKind.Absolute, out var uri)) - { - var parameters = new ClientParameters - { - Referrer = uri - }; - - return HttpUtility.HtmlAttributeEncode(parameters.ToJson()); - } - - return new object().ToJson(); - } - - public class ClientParameters - { - [JsonProperty("workspaceType", NullValueHandling = NullValueHandling.Ignore)] - public string WorkspaceType { get; set; } - - [JsonProperty("useWasmRunner", NullValueHandling = NullValueHandling.Ignore)] - public bool? UseWasmRunner { get; set; } - - [JsonProperty("scaffold", NullValueHandling = NullValueHandling.Ignore)] - public string Scaffold { get; set; } - - [JsonProperty("referrer", NullValueHandling = NullValueHandling.Ignore)] - public Uri Referrer { get; set; } - } - } -} \ No newline at end of file diff --git a/MLS.Agent/Controllers/LanguageServicesController.cs b/MLS.Agent/Controllers/LanguageServicesController.cs deleted file mode 100644 index 4280c8b23..000000000 --- a/MLS.Agent/Controllers/LanguageServicesController.cs +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Diagnostics; -using System.Threading.Tasks; -using Clockwise; -using Microsoft.AspNetCore.Mvc; -using Microsoft.DotNet.Try.Protocol; -using MLS.Agent.Middleware; -using Pocket; -using WorkspaceServer; -using WorkspaceServer.Servers; -using static Pocket.Logger; - -namespace MLS.Agent.Controllers -{ - public class LanguageServicesController : Controller - { - private const string CompletionRoute = "/workspace/completion"; - public static RequestDescriptor CompletionApi => new RequestDescriptor( - CompletionRoute, - timeoutMs: 60000, - properties: new[] - { - new RequestDescriptorProperty("completionProvider"), - }); - - private const string DiagnosticsRoute = "/workspace/diagnostics"; - public static RequestDescriptor DiagnosticsApi => new RequestDescriptor(DiagnosticsRoute, timeoutMs: 60000); - - private const string SignatureHelpRoute = "/workspace/signatureHelp"; - public static RequestDescriptor SignatureHelpApi => new RequestDescriptor(SignatureHelpRoute, timeoutMs: 60000); - - private readonly CompositeDisposable _disposables = new CompositeDisposable(); - private readonly IWorkspaceServer _workspaceServer; - - public LanguageServicesController(IWorkspaceServer workspaceServer) - { - _workspaceServer = workspaceServer ?? throw new ArgumentNullException(nameof(workspaceServer)); - } - - protected override void Dispose(bool disposing) - { - if (disposing) - { - _disposables.Dispose(); - } - - base.Dispose(disposing); - } - - [HttpPost] - [Route(CompletionRoute)] - [DebugEnableFilter] - public async Task Completion( - [FromBody] WorkspaceRequest request, - [FromHeader(Name = "Timeout")] string timeoutInMilliseconds = "15000") - { - using (var operation = Log.OnEnterAndConfirmOnExit()) - { - operation.Info("Processing workspaceType {workspaceType}", request.Workspace.WorkspaceType); - if (!int.TryParse(timeoutInMilliseconds, out var timeoutMs)) - { - return BadRequest(); - } - - var runTimeout = TimeSpan.FromMilliseconds(timeoutMs); - var budget = new TimeBudget(runTimeout); - var server = GetServerForWorkspace(request.Workspace); - var result = await server.GetCompletionList(request, budget); - budget.RecordEntry(); - operation.Succeed(); - - return Ok(result); - } - } - - [HttpPost] - [Route("/workspace/signaturehelp")] - public async Task SignatureHelp( - [FromBody] WorkspaceRequest request, - [FromHeader(Name = "Timeout")] string timeoutInMilliseconds = "15000") - { - if (Debugger.IsAttached && !(Clock.Current is VirtualClock)) - { - _disposables.Add(VirtualClock.Start()); - } - - using (var operation = Log.OnEnterAndConfirmOnExit()) - { - operation.Info("Processing workspaceType {workspaceType}", request.Workspace.WorkspaceType); - if (!int.TryParse(timeoutInMilliseconds, out var timeoutMs)) - { - return BadRequest(); - } - - var runTimeout = TimeSpan.FromMilliseconds(timeoutMs); - var budget = new TimeBudget(runTimeout); - var server = GetServerForWorkspace(request.Workspace); - var result = await server.GetSignatureHelp(request, budget); - budget.RecordEntry(); - operation.Succeed(); - - return Ok(result); - } - } - - [HttpPost] - [Route(DiagnosticsRoute)] - public async Task Diagnostics( - [FromBody] WorkspaceRequest request, - [FromHeader(Name = "Timeout")] string timeoutInMilliseconds = "15000") - { - if (Debugger.IsAttached && !(Clock.Current is VirtualClock)) - { - _disposables.Add(VirtualClock.Start()); - } - - using (var operation = Log.OnEnterAndConfirmOnExit()) - { - operation.Info("Processing workspaceType {workspaceType}", request.Workspace.WorkspaceType); - if (!int.TryParse(timeoutInMilliseconds, out var timeoutMs)) - { - return BadRequest(); - } - - var runTimeout = TimeSpan.FromMilliseconds(timeoutMs); - var budget = new TimeBudget(runTimeout); - var server = GetServerForWorkspace(request.Workspace); - var result = await server.GetDiagnostics(request, budget); - budget.RecordEntry(); - operation.Succeed(); - - return Ok(result); - } - } - - private ILanguageService GetServerForWorkspace(Workspace workspace) - { - return _workspaceServer; - } - } -} diff --git a/MLS.Agent/Controllers/PackagesController.cs b/MLS.Agent/Controllers/PackagesController.cs deleted file mode 100644 index 8b0dbb671..000000000 --- a/MLS.Agent/Controllers/PackagesController.cs +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using Microsoft.AspNetCore.Mvc; -using System.Threading.Tasks; -using Microsoft.DotNet.Try.Protocol; -using WorkspaceServer; -using WorkspaceServer.Packaging; - -namespace MLS.Agent.Controllers -{ - public class PackagesController : Controller - { - private const string GetPackageRoute = "/packages/{name}/{version}"; - public static RequestDescriptor GetPackageApi => new RequestDescriptor( - GetPackageRoute, - timeoutMs: 60000, - method: "GET", - templated: true); - - private readonly PackageRegistry _registry; - - public PackagesController(PackageRegistry registry) - { - _registry = registry; - } - - [HttpGet] - [Route(GetPackageRoute)] - public async Task GetPackage(string name, string version) - { - try - { - var package = await _registry.Get(name); - var isWasmSupported = package.CanSupportWasm; - return Ok(value: new Microsoft.DotNet.Try.Protocol.Package(isWasmSupported)); - } - catch (PackageNotFoundException ex) - { - return NotFound(ex.Message); - } - } - } -} \ No newline at end of file diff --git a/MLS.Agent/Controllers/ProjectController.cs b/MLS.Agent/Controllers/ProjectController.cs deleted file mode 100644 index b0625dc2d..000000000 --- a/MLS.Agent/Controllers/ProjectController.cs +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.Collections.Generic; -using Microsoft.AspNetCore.Mvc; -using System.Linq; -using Microsoft.CodeAnalysis.Text; -using Microsoft.DotNet.Try.Project; -using Microsoft.DotNet.Try.Protocol; -using Microsoft.DotNet.Try.Protocol.ClientApi; -using Pocket; -using static Pocket.Logger; -using SourceFile = Microsoft.DotNet.Try.Protocol.ClientApi.SourceFile; - -namespace MLS.Agent.Controllers -{ - public class ProjectController : Controller - { - - private const string RegionsFromFilesRoute = "/project/files/regions"; - public static RequestDescriptor RegionsFromFilesApi => new RequestDescriptor(RegionsFromFilesRoute, method: "POST"); - - [HttpPost(RegionsFromFilesRoute)] - public IActionResult GenerateRegionsFromFiles([FromBody] CreateRegionsFromFilesRequest request) - { - using (var operation = Log.OnEnterAndConfirmOnExit()) - { - var regions = request.Files.SelectMany(ExtractRegions); - var response = new CreateRegionsFromFilesResponse(request.RequestId, regions.ToArray()); - - IActionResult result = Ok(response); - operation.Succeed(); - - return result; - } - } - - private static IEnumerable ExtractRegions(SourceFile sourceFile) - { - var sc = SourceText.From(sourceFile.Content); - var regions = sc.ExtractRegions(sourceFile.Name).Select( - region => new SourceFileRegion(region.bufferId.ToString(), sc.ToString(region.span).FormatSourceCode(sourceFile.Name))).ToArray(); - return regions; - } - - } -} diff --git a/MLS.Agent/Controllers/RunController.cs b/MLS.Agent/Controllers/RunController.cs deleted file mode 100644 index 03cb04251..000000000 --- a/MLS.Agent/Controllers/RunController.cs +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Threading.Tasks; -using Clockwise; -using Microsoft.AspNetCore.Mvc; -using Microsoft.DotNet.Try.Protocol; -using MLS.Agent.Middleware; -using Pocket; -using WorkspaceServer.Models.Execution; -using WorkspaceServer.Servers.Scripting; -using static Pocket.Logger; -using MLS.Agent.CommandLine; -using WorkspaceServer.Servers; -using WorkspaceServer.WorkspaceFeatures; - -namespace MLS.Agent.Controllers -{ - public class RunController : Controller - { - private const string RunRoute = "/workspace/run"; - public static RequestDescriptor RunApi => new RequestDescriptor(RunRoute, timeoutMs:600000); - - private readonly StartupOptions _options; - private readonly IWorkspaceServer _workspaceServer; - private readonly CompositeDisposable _disposables = new CompositeDisposable(); - - public RunController( - StartupOptions options, - IWorkspaceServer workspaceServer) - { - _options = options ?? throw new ArgumentNullException(nameof(options)); - _workspaceServer = workspaceServer; - } - - [HttpPost] - [Route(RunRoute)] - [DebugEnableFilter] - public async Task Run( - [FromBody] WorkspaceRequest request, - [FromHeader(Name = "Timeout")] string timeoutInMilliseconds = "45000") - { - if (_options.IsLanguageService) - { - return NotFound(); - } - - using (var operation = Log.OnEnterAndConfirmOnExit()) - { - var workspaceType = request.Workspace.WorkspaceType; - - operation.Info("Processing workspaceType {workspaceType}", workspaceType); - - if (!int.TryParse(timeoutInMilliseconds, out var timeoutMs)) - { - return BadRequest(); - } - - RunResult result; - var runTimeout = TimeSpan.FromMilliseconds(timeoutMs); - - var budget = new TimeBudget(runTimeout); - - if (string.Equals(workspaceType, "script", StringComparison.OrdinalIgnoreCase)) - { - var server = new ScriptingWorkspaceServer(); - - result = await server.Run( - request, - budget); - } - else - { - using (result = await _workspaceServer.Run(request, budget)) - { - _disposables.Add(result); - - if (result.Succeeded && - request.HttpRequest != null) - { - var webServer = result.GetFeature(); - - if (webServer != null) - { - var response = await webServer.SendAsync( - request.HttpRequest.ToHttpRequestMessage()) - .CancelIfExceeds(budget); - - result = new RunResult( - true, - await response.ToDisplayString()); - } - } - } - } - - budget.RecordEntry(); - operation.Succeed(); - - return Ok(result); - } - } - } -} diff --git a/MLS.Agent/Controllers/SensorsController.cs b/MLS.Agent/Controllers/SensorsController.cs deleted file mode 100644 index 762da70d7..000000000 --- a/MLS.Agent/Controllers/SensorsController.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using Microsoft.AspNetCore.Mvc; -using Microsoft.DotNet.Try.Protocol; -using Recipes; - -namespace MLS.Agent.Controllers -{ - public class SensorsController : Controller - { - private const string VersionRoute = "/sensors/version"; - public static RequestDescriptor VersionApi => new RequestDescriptor(VersionRoute, method: "GET"); - - [Route(VersionRoute)] - public IActionResult GetVersion() => Ok(VersionSensor.Version()); - } -} \ No newline at end of file diff --git a/MLS.Agent/Controllers/WebAssemblyController.cs b/MLS.Agent/Controllers/WebAssemblyController.cs deleted file mode 100644 index 80e8b6786..000000000 --- a/MLS.Agent/Controllers/WebAssemblyController.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.DotNet.Try.Markdown; -using MLS.Agent.CommandLine; -using MLS.Agent.Tools; -using WorkspaceServer; -using WorkspaceServer.Packaging; - -namespace MLS.Agent.Controllers -{ - public class WebAssemblyController : Controller - { - private PackageRegistry _registry; - - public WebAssemblyController(PackageRegistry packageRegistry) - { - _registry = packageRegistry ?? throw new ArgumentNullException(nameof(packageRegistry)); - } - - [HttpGet] - [Route("/LocalCodeRunner/{packageName}/")] - [Route("/LocalCodeRunner/{packageName}/{*requestedPath}")] - public async Task GetFile(string packageName, string requestedPath = "Index.html") - { - var package = await _registry.Get(packageName); - var asset = package.Assets.OfType().FirstOrDefault(); - if (asset == null) - { - return NotFound(); - } - - var file = asset.DirectoryAccessor.GetFullyQualifiedPath(new RelativeFilePath(requestedPath)); - if (!file.Exists) - { - file = asset.DirectoryAccessor.GetFullyQualifiedFilePath("index.html"); - return await FileContents(file); - } - - return await FileContents(file); - } - - private async Task FileContents(FileSystemInfo file) - { - var contentType = GetContentType(file.FullName); - var bytes = await System.IO.File.ReadAllBytesAsync(file.FullName); - - return File(bytes, contentType); - } - - private string GetContentType(string path) - { - var extension = Path.GetExtension(path); - switch (extension) - { - case ".dll": - return "application/octet-stream"; - case ".json": - return "application/json"; - case ".wasm": - return "application/wasm"; - case ".woff": - return "application/font-woff"; - case ".woff2": - return "application/font-woff"; - case ".js": - return "application/javascript"; - default: - return "text/html"; - } - } - } -} \ No newline at end of file diff --git a/MLS.Agent/Directory.Build.Props b/MLS.Agent/Directory.Build.Props deleted file mode 100644 index 5054100f7..000000000 --- a/MLS.Agent/Directory.Build.Props +++ /dev/null @@ -1,9 +0,0 @@ - - - - true - - - - - diff --git a/MLS.Agent/ExceptionExtensions.cs b/MLS.Agent/ExceptionExtensions.cs deleted file mode 100644 index 4edff89c1..000000000 --- a/MLS.Agent/ExceptionExtensions.cs +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Linq; -using Clockwise; -using WorkspaceServer.Servers.Scripting; - -namespace MLS.Agent -{ - public static class ExceptionExtensions - { - public static int ToHttpStatusCode(this Exception exception) - { - switch (exception) - { - case BudgetExceededException budgetExceededException: - - var firstExceededEntry = budgetExceededException.Budget.Entries.FirstOrDefault(e => e.BudgetWasExceeded); - - if (firstExceededEntry?.Name == ScriptingWorkspaceServer.UserCodeCompletedBudgetEntryName) - { - return 417; - } - - return 504; - - default: - return 500; - } - } - } -} \ No newline at end of file diff --git a/MLS.Agent/HostedService.cs b/MLS.Agent/HostedService.cs deleted file mode 100644 index 0479bd3dd..000000000 --- a/MLS.Agent/HostedService.cs +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Threading; -using System.Threading.Tasks; -using Clockwise; -using Microsoft.Extensions.Hosting; - -namespace MLS.Agent -{ - public abstract class HostedService : IHostedService, IDisposable - { - private Task _executingTask; - private Budget _budget; - - public Task StartAsync(CancellationToken cancellationToken) - { - _budget = new Budget(cancellationToken); - - _executingTask = ExecuteAsync(_budget); - - // If the task is completed then return it, otherwise it's running - return _executingTask.IsCompleted - ? _executingTask - : Task.CompletedTask; - } - - public async Task StopAsync(CancellationToken cancellationToken) - { - // Stop called without start - if (_executingTask == null) - { - return; - } - - _budget.Cancel(); - - // Wait until the task completes or the stop token triggers - await Task.WhenAny( - _executingTask, - Task.Delay(-1, cancellationToken)); - - // Throw if cancellation triggered - cancellationToken.ThrowIfCancellationRequested(); - } - - protected async Task ExecuteAsync() - { - if (_budget.IsExceeded) - { - return; - } - - using (SchedulerContext.Establish(_budget)) - { - await Task.Yield(); - - await ExecuteAsync(_budget); - } - } - - protected abstract Task ExecuteAsync(Budget budget); - - public void Dispose() => _budget?.Cancel(); - } -} diff --git a/MLS.Agent/IBrowserLauncher.cs b/MLS.Agent/IBrowserLauncher.cs deleted file mode 100644 index 3b8d2ae91..000000000 --- a/MLS.Agent/IBrowserLauncher.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; - -namespace MLS.Agent -{ - public interface IBrowserLauncher - { - void LaunchBrowser(Uri uri); - } -} \ No newline at end of file diff --git a/MLS.Agent/MLS.Agent.csproj b/MLS.Agent/MLS.Agent.csproj deleted file mode 100644 index 679c5e457..000000000 --- a/MLS.Agent/MLS.Agent.csproj +++ /dev/null @@ -1,200 +0,0 @@ - - - - net6.0 - Latest - $(AssetTargetFallback);dotnet5.4;portable-net45+win8 - - - - Microsoft.dotnet-try - dotnet-try - true - true - Command line tool for developers and content authors to create interactive experiences. - dotnet interactive-programming documentation blazor interactive-tutorial csharp fsharp - Try .NET creates interactive documentation for .NET Core. - $(NoWarn);CS8034 - $(NoWarn);1998 - $(NoWarn);8002 - $(NoWarn);NU5129 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - - - all - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - - - - - - - - - - PreserveNewest - - - - - - - MLS.Agent.Program.cs - - - demo.zip - - - - - - - - - - - - $(MSBuildThisFileDirectory)wwwroot - $(MSBuildThisFileDirectory)../Microsoft.DotNet.Try.Client - $(webRootDir)/client - $(ClientOutputDir)/bundle.js - $(MSBuildThisFileDirectory)../Microsoft.DotNet.Try.js - $(webRootDir)/api - $(TryDotNetJsOutputDir)/trydotnet.min.js - $(TryDotNetJsOutputDir)/trydotnet.min.js.map - $(MSBuildThisFileDirectory)../Microsoft.DotNet.Try.Styles - $(webRootDir)/css - $(CssOutputDir)/trydotnet.css - - - - - - - - - - - - <_TryDotNetCssExists Condition="Exists('$(CssOutputFile)')">true - - - - - - - - - - - - - - - <_TryDotNetMinJsExists Condition="Exists('$(TryDotNetJsFile)')">true - - - - - - - - - - - - - - - - <_TryDotNetClientExists Condition="Exists('$(ClientOutputFile)')">true - - - - - - - - - - - - - - - PreserveNewest - - - - - - - - - - - - - - - - diff --git a/MLS.Agent/MLS.Agent.v3.ncrunchproject b/MLS.Agent/MLS.Agent.v3.ncrunchproject deleted file mode 100644 index fd18d4092..000000000 --- a/MLS.Agent/MLS.Agent.v3.ncrunchproject +++ /dev/null @@ -1,10 +0,0 @@ - - - - ..\docs\**.* - wwwroot\**.* - ..\Microsoft.DotNet.Interactive.Jupyter\ContentFiles\**.* - - - - \ No newline at end of file diff --git a/MLS.Agent/Markdown/AnnotatedCodeBlockExtensions.cs b/MLS.Agent/Markdown/AnnotatedCodeBlockExtensions.cs deleted file mode 100644 index 6b773e6d9..000000000 --- a/MLS.Agent/Markdown/AnnotatedCodeBlockExtensions.cs +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using Microsoft.DotNet.Try.Markdown; -using Microsoft.DotNet.Try.Protocol; -using MLS.Agent.Tools; -using Buffer = Microsoft.DotNet.Try.Protocol.Buffer; - -namespace MLS.Agent.Markdown -{ - public static class AnnotatedCodeBlockExtensions - { - public static Buffer GetBufferAsync( - this AnnotatedCodeBlock block, - IDirectoryAccessor directoryAccessor) - { - if (block.Annotations is LocalCodeBlockAnnotations localOptions) - { - var file = localOptions.SourceFile ?? localOptions.DestinationFile; - var absolutePath = directoryAccessor.GetFullyQualifiedPath(file).FullName; - var bufferId = new BufferId(absolutePath, localOptions.Region); - return new Buffer(bufferId, block.SourceCode); - } - - return null; - } - - public static string ProjectOrPackageName(this AnnotatedCodeBlock block) - { - if (block.Annotations is LocalCodeBlockAnnotations a1 && - a1.Project?.FullName is { } fullName) - { - return fullName; - } - - if (block.Annotations is CodeBlockAnnotations a2) - { - return a2.Package; - } - - return null; - } - - public static string PackageName(this AnnotatedCodeBlock block) - { - return (block.Annotations as CodeBlockAnnotations)?.Package; - } - - public static string Language(this AnnotatedCodeBlock block) => block.Annotations?.NormalizedLanguage; - } -} \ No newline at end of file diff --git a/MLS.Agent/Markdown/LocalCodeBlockAnnotations.cs b/MLS.Agent/Markdown/LocalCodeBlockAnnotations.cs deleted file mode 100644 index 53a661719..000000000 --- a/MLS.Agent/Markdown/LocalCodeBlockAnnotations.cs +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.CommandLine.Parsing; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.CodeAnalysis.Text; -using Microsoft.DotNet.Try.Markdown; -using Microsoft.DotNet.Try.Project; -using MLS.Agent.Tools; -using WorkspaceServer; -using WorkspaceServer.Packaging; - -namespace MLS.Agent.Markdown -{ - public class LocalCodeBlockAnnotations : CodeBlockAnnotations - { - public LocalCodeBlockAnnotations( - RelativeFilePath sourceFile = null, - RelativeFilePath destinationFile = null, - FileInfo project = null, - string package = null, - string region = null, - string session = null, - bool isProjectFileImplicit = false, - bool editable = false, - bool hidden = false, - string runArgs = null, - ParseResult parseResult = null, - string packageVersion = null) : base(destinationFile, package, region, session, editable, hidden, runArgs, parseResult ,packageVersion) - { - SourceFile = sourceFile; - Project = project; - IsProjectImplicit = isProjectFileImplicit; - } - - public FileInfo Project { get; } - - public override string Package => base.Package ?? Project?.FullName; - - public RelativeFilePath SourceFile { get; } - - public bool IsProjectImplicit { get; set; } - - public IDirectoryAccessor MarkdownProjectRoot { get; internal set; } - - internal PackageRegistry PackageRegistry { get; set; } - - public override async Task TryGetExternalContent() - { - string content = null; - - var errors = new List(); - - await Validate(errors); - - if (!errors.Any()) - { - if (SourceFile == null) - { - return CodeBlockContentFetchResult.None; - } - - content = MarkdownProjectRoot.ReadAllText(SourceFile); - - if (string.IsNullOrWhiteSpace(Region)) - { - return errors.Any() - ? CodeBlockContentFetchResult.Failed(errors) - : CodeBlockContentFetchResult.Succeeded(content); - } - - var sourceText = SourceText.From(content); - var sourceFileAbsolutePath = GetSourceFileAbsolutePath(); - - var buffers = sourceText.ExtractBuffers(sourceFileAbsolutePath) - .Where(b => b.Id.RegionName == Region) - .ToArray(); - - if (buffers.Length == 0) - { - errors.Add($"Region \"{Region}\" not found in file {sourceFileAbsolutePath}"); - } - else if (buffers.Length > 1) - { - errors.Add($"Multiple regions found: {Region}"); - } - else - { - content = buffers[0].Content; - } - } - - return errors.Any() - ? CodeBlockContentFetchResult.Failed(errors) - : CodeBlockContentFetchResult.Succeeded(content); - } - - private async Task Validate(List errors) - { - if (SourceFile != null && !MarkdownProjectRoot.FileExists(SourceFile)) - { - errors.Add($"File not found: {SourceFile.Value}"); - } - - if (string.IsNullOrEmpty(Package) && Project == null) - { - errors.Add("No project file or package specified"); - } - - if (Package != null) - { - try - { - var package = await PackageRegistry.Find(Package); - } - catch (PackageNotFoundException e) - { - errors.Add(e.Message); - return; - } - } - - if (Project != null) - { - var packageName = GetPackageNameFromProjectFile(Project); - - if (packageName == null) - { - errors.Add($"No project file could be found at path {MarkdownProjectRoot.GetFullyQualifiedPath(new RelativeDirectoryPath("."))}"); - } - } - } - - public override async Task AddAttributes(AnnotatedCodeBlock block) - { - if (Package == null && Project?.FullName != null) - { - block.AddAttribute("data-trydotnet-package", Project.FullName); - } - - var fileName = GetDestinationFileAbsolutePath(); - - if (!string.IsNullOrWhiteSpace(fileName)) - { - block.AddAttribute( - "data-trydotnet-file-name", - fileName); - } - - if (ReadOnlyRegionRoundtrip()) - { - block.AddAttribute("data-trydotnet-injection-point", "replace"); - } - - bool ReadOnlyRegionRoundtrip() - { - return !Editable && !string.IsNullOrWhiteSpace(Region) && SourceFile != null && (DestinationFile == null || SourceFile.Equals(DestinationFile)); - } - - await base.AddAttributes(block); - } - - private string GetDestinationFileAbsolutePath() - { - var file = DestinationFile ?? SourceFile; - return file == null - ? string.Empty - : MarkdownProjectRoot - .GetFullyQualifiedPath(file) - .FullName; - } - - private static string GetPackageNameFromProjectFile(FileInfo projectFile) - { - return projectFile?.FullName; - } - - private string GetSourceFileAbsolutePath() - { - return MarkdownProjectRoot.GetFullyQualifiedPath(SourceFile).FullName; - } - } -} \ No newline at end of file diff --git a/MLS.Agent/Markdown/LocalCodeFenceAnnotationsParser.cs b/MLS.Agent/Markdown/LocalCodeFenceAnnotationsParser.cs deleted file mode 100644 index 923a8b1c9..000000000 --- a/MLS.Agent/Markdown/LocalCodeFenceAnnotationsParser.cs +++ /dev/null @@ -1,157 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.CommandLine; -using System.IO; -using System.Linq; -using Markdig; -using Microsoft.DotNet.Try.Markdown; -using MLS.Agent.Tools; -using WorkspaceServer; - -namespace MLS.Agent.Markdown -{ - public class LocalCodeFenceAnnotationsParser : CodeFenceAnnotationsParser - { - private readonly IDirectoryAccessor _directoryAccessor; - private readonly PackageRegistry _packageRegistry; - - public LocalCodeFenceAnnotationsParser( - IDirectoryAccessor directoryAccessor, - PackageRegistry packageRegistry, - IDefaultCodeBlockAnnotations defaultAnnotations = null) : base(defaultAnnotations, - csharp => - { - AddCsharpProjectOption(csharp, directoryAccessor); - AddSourceFileOption(csharp); - }, - fsharp => - { - AddFsharpProjectOption(fsharp, directoryAccessor); - AddSourceFileOption(fsharp); - }) - { - _directoryAccessor = directoryAccessor; - _packageRegistry = packageRegistry ?? throw new ArgumentNullException(nameof(packageRegistry)); - } - - public override CodeFenceOptionsParseResult TryParseCodeFenceOptions( - string line, - MarkdownParserContext context = null) - { - var result = base.TryParseCodeFenceOptions(line, context); - - if (result is SuccessfulCodeFenceOptionParseResult succeeded && - succeeded.Annotations is LocalCodeBlockAnnotations local) - { - local.MarkdownProjectRoot = _directoryAccessor; - local.PackageRegistry = _packageRegistry; - - var projectResult = local.ParseResult.CommandResult["project"]; - if (projectResult?.IsImplicit ?? false) - { - local.IsProjectImplicit = true; - } - } - - return result; - } - - public override Type CodeBlockAnnotationsType => typeof(LocalCodeBlockAnnotations); - - private static void AddSourceFileOption(Command command) - { - var sourceFileArg = new Argument( - parse: result => - { - var filename = result.Tokens.Select(t => t.Value).SingleOrDefault(); - - if (filename == null) - { - return null; - } - - if (RelativeFilePath.TryParse(filename, out var relativeFilePath)) - { - return relativeFilePath; - } - - result.ErrorMessage = $"Error parsing the filename: {filename}"; - return null; - }) - { - Name = "SourceFile", - Arity = ArgumentArity.ZeroOrOne - }; - - var sourceFileOption = new Option("--source-file") - { - Argument = sourceFileArg - }; - - command.AddOption(sourceFileOption); - } - - private static void AddCsharpProjectOption( - Command command, - IDirectoryAccessor directoryAccessor) - { - AddProjectOption(command, directoryAccessor, ".csproj"); - } - - private static void AddFsharpProjectOption( - Command command, - IDirectoryAccessor directoryAccessor) - { - AddProjectOption(command,directoryAccessor, ".fsproj"); - } - - private static void AddProjectOption( - Command command, - IDirectoryAccessor directoryAccessor, - string projectFileExtension) - { - var projectOptionArgument = new Argument( - parse: (result) => - { - var projectPath = new RelativeFilePath(result.Tokens.Select(t => t.Value).Single()); - - if (directoryAccessor.FileExists(projectPath)) - { - return directoryAccessor.GetFullyQualifiedFilePath(projectPath); - } - - result.ErrorMessage = $"Project not found: {projectPath.Value}"; - return null; - }) - - { - Name = "project", - Arity = ArgumentArity.ExactlyOne - }; - - projectOptionArgument.SetDefaultValueFactory(() => - { - var rootDirectory = directoryAccessor.GetFullyQualifiedPath(new RelativeDirectoryPath(".")); - var projectFiles = directoryAccessor.GetAllFilesRecursively() - .Where(file => directoryAccessor.GetFullyQualifiedPath(file.Directory).FullName == rootDirectory.FullName && file.Extension == projectFileExtension) - .ToArray(); - - if (projectFiles.Length == 1) - { - return directoryAccessor.GetFullyQualifiedPath(projectFiles.Single()); - } - - return null; - }); - - var projectOption = new Option("--project") - { - Argument = projectOptionArgument - }; - - command.Add(projectOption); - } - } -} \ No newline at end of file diff --git a/MLS.Agent/Markdown/MarkdownFile.cs b/MLS.Agent/Markdown/MarkdownFile.cs deleted file mode 100644 index ca9e5e1ba..000000000 --- a/MLS.Agent/Markdown/MarkdownFile.cs +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Html; -using Microsoft.DotNet.Try.Markdown; -using Microsoft.DotNet.Try.Protocol; -using MLS.Agent.Tools; -using Buffer = Microsoft.DotNet.Try.Protocol.Buffer; - -namespace MLS.Agent.Markdown -{ - public class MarkdownFile - { - public MarkdownFile( - RelativeFilePath path, - MarkdownProject project) - { - Path = path; - Project = project; - } - - public RelativeFilePath Path { get; } - - public MarkdownProject Project { get; } - - public async Task> GetAnnotatedCodeBlocks() - { - var pipeline = Project.GetMarkdownPipelineFor(Path); - - var document = Markdig.Markdown.Parse( - ReadAllText(), - pipeline); - - var blocks = document - .OfType() - .OrderBy(c => c.Order) - .ToArray(); - - await Task.WhenAll(blocks.Select(b => b.InitializeAsync())); - - return blocks; - } - - public async Task> GetEditableAnnotatedCodeBlocks() => - (await GetAnnotatedCodeBlocks()) - .Where(b => b.Annotations is CodeBlockAnnotations a && - a.Editable) - .ToArray(); - - public async Task> GetNonEditableAnnotatedCodeBlocks() => - (await GetAnnotatedCodeBlocks()) - .Where(b => b.Annotations is CodeBlockAnnotations a && - !a.Editable) - .ToArray(); - - public async Task> GetSessions() => - (await GetAnnotatedCodeBlocks()) - .GroupBy(block => block.Annotations?.Session) - .Select(grouping => new Session(grouping.Key, grouping.ToArray(), this)) - .ToArray(); - - public async Task ToHtmlContentAsync() - { - var pipeline = Project.GetMarkdownPipelineFor(Path); - var html = await pipeline.RenderHtmlAsync(ReadAllText()); - return new HtmlString(html); - } - - public string ReadAllText() => - Project.DirectoryAccessor.ReadAllText(Path); - - internal async Task<(Dictionary buffers, Dictionary files)> GetIncludes(IDirectoryAccessor directoryAccessor) - { - var buffersToIncludeBySession = new Dictionary(StringComparer.InvariantCultureIgnoreCase); - - var contentBuildersByBufferBySession = new Dictionary>(StringComparer.InvariantCultureIgnoreCase); - - var filesToIncludeBySession = new Dictionary(StringComparer.InvariantCultureIgnoreCase); - - var contentBuildersByFileBySession = new Dictionary>(StringComparer.InvariantCultureIgnoreCase); - - var blocks = await GetNonEditableAnnotatedCodeBlocks(); - - foreach (var block in blocks) - { - if (!(block.Annotations is CodeBlockAnnotations annotations)) - { - continue; - } - - var sessionId = string.IsNullOrWhiteSpace(block.Annotations.Session) - ? "global" - : block.Annotations.Session; - - var filePath = (block.Annotations as LocalCodeBlockAnnotations)?.SourceFile ?? - annotations.DestinationFile ?? - new RelativeFilePath($"./generated_include_file_{sessionId}.cs"); - - var absolutePath = directoryAccessor.GetFullyQualifiedPath(filePath).FullName; - - if (string.IsNullOrWhiteSpace(annotations.Region)) - { - if (!contentBuildersByFileBySession.TryGetValue(sessionId, out var sessionFileBuffers)) - { - sessionFileBuffers = new Dictionary(StringComparer.InvariantCultureIgnoreCase); - contentBuildersByFileBySession[sessionId] = sessionFileBuffers; - } - - if (!sessionFileBuffers.TryGetValue(absolutePath, out var fileBuffer)) - { - fileBuffer = new StringBuilder(); - sessionFileBuffers[absolutePath] = fileBuffer; - } - - fileBuffer.AppendLine(block.SourceCode); - } - else - { - var bufferId = new BufferId(absolutePath, annotations.Region); - if (!contentBuildersByBufferBySession.TryGetValue(sessionId, out var sessionFileBuffers)) - { - sessionFileBuffers = new Dictionary(); - contentBuildersByBufferBySession[sessionId] = sessionFileBuffers; - } - - if (!sessionFileBuffers.TryGetValue(bufferId, out var bufferContentBuilder)) - { - bufferContentBuilder = new StringBuilder(); - sessionFileBuffers[bufferId] = bufferContentBuilder; - } - - bufferContentBuilder.AppendLine(block.SourceCode); - } - } - - foreach (var (sessionId, contentBuildersByBuffer) in contentBuildersByBufferBySession) - { - buffersToIncludeBySession[sessionId] = contentBuildersByBuffer - .Select(contentBuilder => new Buffer( - contentBuilder.Key, - contentBuilder.Value.ToString()) - ).ToArray(); - } - - foreach (var (sessionId, contentBuildersByFile) in contentBuildersByFileBySession) - { - filesToIncludeBySession[sessionId] = contentBuildersByFile - .Select(fileBuffer => new File( - fileBuffer.Key, - fileBuffer.Value.ToString() - ) - ).ToArray(); - } - - return (buffersToIncludeBySession, filesToIncludeBySession); - } - } -} \ No newline at end of file diff --git a/MLS.Agent/Markdown/MarkdownPipelineBuilderExtensions.cs b/MLS.Agent/Markdown/MarkdownPipelineBuilderExtensions.cs deleted file mode 100644 index bf019a2e4..000000000 --- a/MLS.Agent/Markdown/MarkdownPipelineBuilderExtensions.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using Markdig; -using Microsoft.DotNet.Try.Markdown; -using MLS.Agent.Tools; -using WorkspaceServer; - -namespace MLS.Agent.Markdown -{ - public static class MarkdownPipelineBuilderExtensions - { - public static MarkdownPipelineBuilder UseCodeBlockAnnotations( - this MarkdownPipelineBuilder pipeline, - IDirectoryAccessor directoryAccessor, - PackageRegistry packageRegistry, - IDefaultCodeBlockAnnotations defaultAnnotations = null) - { - return pipeline.UseCodeBlockAnnotations( - new LocalCodeFenceAnnotationsParser( - directoryAccessor, - packageRegistry, - defaultAnnotations)); - } - } -} \ No newline at end of file diff --git a/MLS.Agent/Markdown/MarkdownPipelineExtensions.cs b/MLS.Agent/Markdown/MarkdownPipelineExtensions.cs deleted file mode 100644 index 10672b0cd..000000000 --- a/MLS.Agent/Markdown/MarkdownPipelineExtensions.cs +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using Markdig; -using Markdig.Renderers; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.DotNet.Try.Markdown; - -namespace MLS.Agent.Markdown -{ - public static class MarkdownPipelineExtensions - { - public static async Task RenderHtmlAsync(this MarkdownPipeline pipeline, string text) - { - var document = Markdig.Markdown.Parse( - text, - pipeline); - - var initializeTasks = document.OfType() - .Select(c => c.InitializeAsync()); - - await Task.WhenAll(initializeTasks); - - using (var writer = new StringWriter()) - { - var renderer = new HtmlRenderer(writer); - pipeline.Setup(renderer); - renderer.Render(document); - var html = writer.ToString(); - return html; - } - } - } -} diff --git a/MLS.Agent/Markdown/MarkdownProject.cs b/MLS.Agent/Markdown/MarkdownProject.cs deleted file mode 100644 index 42ed333b7..000000000 --- a/MLS.Agent/Markdown/MarkdownProject.cs +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using Markdig; -using Microsoft.DotNet.Try.Markdown; -using MLS.Agent.Tools; -using Recipes; -using WorkspaceServer; - -namespace MLS.Agent.Markdown -{ - public class MarkdownProject - { - private readonly PackageRegistry _packageRegistry; - - private readonly Dictionary _markdownPipelines = new Dictionary(); - - private readonly IDefaultCodeBlockAnnotations _defaultAnnotations; - - internal MarkdownProject(PackageRegistry packageRegistry) : this(new NullDirectoryAccessor(), packageRegistry) - { - } - - public MarkdownProject( - IDirectoryAccessor directoryAccessor, - PackageRegistry packageRegistry, - IDefaultCodeBlockAnnotations defaultAnnotations = null) - { - DirectoryAccessor = directoryAccessor ?? throw new ArgumentNullException(nameof(directoryAccessor)); - _packageRegistry = packageRegistry ?? throw new ArgumentNullException(nameof(packageRegistry)); - _defaultAnnotations = defaultAnnotations; - } - - internal IDirectoryAccessor DirectoryAccessor { get; } - - public IReadOnlyCollection GetAllMarkdownFiles() => - Enumerable.Where(DirectoryAccessor.GetAllFilesRecursively(), file => file.Extension == ".md") - .Select(file => new MarkdownFile(file, this)) - .ToArray(); - - public bool TryGetMarkdownFile(RelativeFilePath path, out MarkdownFile markdownFile) - { - if (!DirectoryAccessor.FileExists(path) || path.Extension != ".md") - { - markdownFile = null; - return false; - } - - markdownFile = new MarkdownFile(path, this); - return true; - } - - internal MarkdownPipeline GetMarkdownPipelineFor(RelativeFilePath filePath) - { - return _markdownPipelines.GetOrAdd(filePath, key => - { - var relativeAccessor = DirectoryAccessor.GetDirectoryAccessorForRelativePath(filePath.Directory); - - return new MarkdownPipelineBuilder() - .UseCodeBlockAnnotations( - relativeAccessor, - _packageRegistry, - _defaultAnnotations) - .UseMathematics() - .UseAdvancedExtensions() - .Build(); - }); - } - - private class NullDirectoryAccessor : IDirectoryAccessor - { - public bool DirectoryExists(RelativeDirectoryPath path) - { - return false; - } - - public void EnsureDirectoryExists(RelativeDirectoryPath path) - { - } - - public bool FileExists(RelativeFilePath filePath) - { - return false; - } - - public string ReadAllText(RelativeFilePath filePath) - { - return string.Empty; - } - - public IEnumerable GetAllFilesRecursively() - { - return Enumerable.Empty(); - } - - public IEnumerable GetAllFiles() - { - return Enumerable.Empty(); - } - - public IEnumerable GetAllDirectoriesRecursively() - { - return Enumerable.Empty(); - } - - public FileSystemInfo GetFullyQualifiedPath(RelativePath path) - { - return null; - } - - public IDirectoryAccessor GetDirectoryAccessorForRelativePath(RelativeDirectoryPath relativePath) - { - return this; - } - - public void WriteAllText(RelativeFilePath path, string text) - { - } - } - } -} \ No newline at end of file diff --git a/MLS.Agent/Markdown/Session.cs b/MLS.Agent/Markdown/Session.cs deleted file mode 100644 index 460bc2d03..000000000 --- a/MLS.Agent/Markdown/Session.cs +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.DotNet.Try.Markdown; -using Microsoft.DotNet.Try.Project; -using Microsoft.DotNet.Try.Protocol; -using WorkspaceServer; - -namespace MLS.Agent.Markdown -{ - public class Session - { - internal Session( - string name, - IReadOnlyCollection codeBlocks, - MarkdownFile markdownFile) - { - Name = name; - CodeBlocks = codeBlocks; - MarkdownFile = markdownFile; - - var projectOrPackageNames = codeBlocks - .Select(block => block.ProjectOrPackageName()) - .Distinct() - .ToArray(); - - if (projectOrPackageNames.Length == 1) - { - ProjectOrPackageName = projectOrPackageNames[0]; - } - else - { - ProjectOrPackageName = projectOrPackageNames.FirstOrDefault(); - } - - Language = CodeBlocks - .Select(b => b.Language()) - .FirstOrDefault(n => !string.IsNullOrWhiteSpace(n)); - } - - public string Language { get; } - - public string Name { get; } - - public IReadOnlyCollection CodeBlocks { get; } - - public MarkdownFile MarkdownFile { get; } - - public string ProjectOrPackageName { get; } - - public async Task GetWorkspaceAsync() - { - var (buffersToInclude, filesToInclude) = await MarkdownFile.GetIncludes(MarkdownFile.Project.DirectoryAccessor); - - var markdownFileDir = MarkdownFile.Project.DirectoryAccessor.GetDirectoryAccessorForRelativePath(MarkdownFile.Path.Directory); - - var buffers = CodeBlocks - .Where(b => b.Annotations is CodeBlockAnnotations a && a.Editable) - .Select(block => block.GetBufferAsync(markdownFileDir)) - .ToList(); - - var files = new List(); - - if (filesToInclude.TryGetValue("global", out var globalIncludes)) - { - files.AddRange(globalIncludes); - } - - if (!string.IsNullOrWhiteSpace(Name) && filesToInclude.TryGetValue(Name, out var sessionIncludes)) - { - files.AddRange(sessionIncludes); - } - - if (buffersToInclude.TryGetValue("global", out var globalSessionBuffersToInclude)) - { - buffers.AddRange(globalSessionBuffersToInclude); - } - - if (!string.IsNullOrWhiteSpace(Name) && buffersToInclude.TryGetValue(Name, out var localSessionBuffersToInclude)) - { - buffers.AddRange(localSessionBuffersToInclude); - } - - var workspace = new Workspace( - workspaceType: ProjectOrPackageName, - language: Language, - files: files.ToArray(), - buffers: buffers.ToArray()); - - workspace = await workspace - .MergeAsync() - .InlineBuffersAsync(); - - return workspace; - } - - internal bool IsProjectCompatibleWithLanguage - { - get - { - var projectOrPackage = new UriOrFileInfo(ProjectOrPackageName); - - var supported = true; - - if (projectOrPackage.IsFile) - { - var extension = projectOrPackage.FileExtension.ToLowerInvariant(); - switch (extension.ToLowerInvariant()) - { - case ".csproj": - supported = StringComparer.OrdinalIgnoreCase.Compare(Language, "csharp") == 0; - break; - - case ".fsproj": - supported = StringComparer.OrdinalIgnoreCase.Compare(Language, "fsharp") == 0; - break; - - default: - supported = false; - break; - } - } - - return supported; - } - } - } -} \ No newline at end of file diff --git a/MLS.Agent/Middleware/DebugEnableFilterAttribute.cs b/MLS.Agent/Middleware/DebugEnableFilterAttribute.cs deleted file mode 100644 index e4ca44acb..000000000 --- a/MLS.Agent/Middleware/DebugEnableFilterAttribute.cs +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.Diagnostics; -using Clockwise; -using Microsoft.AspNetCore.Mvc.Filters; -using Pocket; - -namespace MLS.Agent.Middleware -{ - public class DebugEnableFilterAttribute : ActionFilterAttribute - { - private readonly CompositeDisposable _disposables = new CompositeDisposable(); - - public override void OnActionExecuting(ActionExecutingContext context) - { - if (Debugger.IsAttached && !(Clock.Current is VirtualClock)) - { - _disposables.Add(VirtualClock.Start()); - } - } - - public override void OnActionExecuted(ActionExecutedContext context) - { - _disposables.Dispose(); - } - } -} - diff --git a/MLS.Agent/Middleware/ExceptionFilter.cs b/MLS.Agent/Middleware/ExceptionFilter.cs deleted file mode 100644 index 1a4c9209e..000000000 --- a/MLS.Agent/Middleware/ExceptionFilter.cs +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Filters; -using Pocket; -using static Pocket.Logger; - -namespace MLS.Agent.Middleware -{ - public class ExceptionFilter : IExceptionFilter - { - public void OnException(ExceptionContext context) - { - var exception = context.Exception; - - if (exception == null) - { - return; - } - - if (context.ModelState.ErrorCount > 0) - { - context.Result = new BadRequestResult(); - } - else - { - context.Result = new ExceptionResult(exception); - - if (context.ExceptionHandled) - { - Log.Warning(exception); - } - else - { - Log.Error(exception); - } - } - } - - private class ExceptionResult : IActionResult - { - private readonly Exception exception; - - public ExceptionResult(Exception exception) - { - this.exception = exception; - } - - public async Task ExecuteResultAsync(ActionContext context) - { - var objectResult = new ObjectResult(new - { - message = "An unhandled exception occurred.", - exception = exception.ToString() - }) - { - StatusCode = exception.ToHttpStatusCode() - }; - - await objectResult.ExecuteResultAsync(context); - } - } - } -} diff --git a/MLS.Agent/Program.cs b/MLS.Agent/Program.cs deleted file mode 100644 index 9b14c220a..000000000 --- a/MLS.Agent/Program.cs +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using Microsoft.ApplicationInsights; -using Microsoft.ApplicationInsights.Extensibility; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.DependencyInjection; -using MLS.Agent.Tools; -using Pocket; -using Pocket.For.ApplicationInsights; -using Recipes; -using Serilog.Sinks.RollingFileAlternate; -using System; -using System.CommandLine.Parsing; -using System.IO; -using System.Reflection; -using System.Security.Cryptography.X509Certificates; -using System.Text; -using System.Threading.Tasks; -using static Pocket.Logger; -using SerilogLoggerConfiguration = Serilog.LoggerConfiguration; -using MLS.Agent.CommandLine; -using WorkspaceServer.Servers; - -namespace MLS.Agent -{ - public class Program - { - private static readonly ServiceCollection _serviceCollection = new ServiceCollection(); - - public static async Task Main(string[] args) - { - Console.OutputEncoding = Encoding.UTF8; - - return await CommandLineParser.Create( _serviceCollection ).InvokeAsync(args); - } - - public static X509Certificate2 ParseKey(string base64EncodedKey) - { - var bytes = Convert.FromBase64String(base64EncodedKey); - return new X509Certificate2(bytes); - } - - private static readonly Assembly[] _assembliesEmittingPocketLoggerLogs = { - typeof(Startup).Assembly, - typeof(AsyncLazy<>).Assembly, - typeof(IWorkspaceServer).Assembly - }; - - private static IDisposable StartAppInsightsLogging(StartupOptions options) - { - - var disposables = new CompositeDisposable(); - - if (options.Production) - { - var applicationVersion = VersionSensor.Version().AssemblyInformationalVersion; - var websiteSiteName = Environment.GetEnvironmentVariable("WEBSITE_SITE_NAME") ?? "UNKNOWN-AGENT"; - var regionId = options.RegionId ?? "undefined"; - disposables.Add( - LogEvents.Enrich(a => - { - a(("regionId", regionId)); - a(("applicationVersion", applicationVersion)); - a(("websiteSiteName", websiteSiteName)); - a(("id", options.Id)); - })); - } - - if (options.ApplicationInsightsKey != null) - { - var telemetryClient = new TelemetryClient(new TelemetryConfiguration(options.ApplicationInsightsKey)) - { - InstrumentationKey = options.ApplicationInsightsKey - }; - disposables.Add(telemetryClient.SubscribeToPocketLogger(_assembliesEmittingPocketLoggerLogs)); - } - - Log.Event("AgentStarting"); - - return disposables; - } - - internal static IDisposable StartToolLogging(StartupOptions options) - { - var disposables = new CompositeDisposable(); - - if (options.LogPath != null) - { - var log = new SerilogLoggerConfiguration() - .WriteTo - .RollingFileAlternate(options.LogPath.FullName, outputTemplate: "{Message}{NewLine}") - .CreateLogger(); - - var subscription = LogEvents.Subscribe( - e => log.Information(e.ToLogString()), - _assembliesEmittingPocketLoggerLogs); - - disposables.Add(subscription); - disposables.Add(log); - } - - if (options.Verbose) - { - disposables.Add( - LogEvents.Subscribe(e => Console.WriteLine(e.ToLogString()), - _assembliesEmittingPocketLoggerLogs)); - } - - TaskScheduler.UnobservedTaskException += (sender, args) => - { - Log.Warning($"{nameof(TaskScheduler.UnobservedTaskException)}", args.Exception); - args.SetObserved(); - }; - - return disposables; - } - - public static IWebHost ConstructWebHost(StartupOptions options) - { - var disposables = new CompositeDisposable - { - StartAppInsightsLogging(options), - StartToolLogging(options) - }; - - if (options.Key is null) - { - Log.Trace("No Key Provided"); - } - else - { - Log.Trace("Received Key: {key}", options.Key); - } - - var webHost = new WebHostBuilder() - .UseKestrel() - .UseContentRoot(Path.GetDirectoryName(typeof(Program).Assembly.Location)) - .ConfigureServices(c => - { - if (!string.IsNullOrEmpty(options.ApplicationInsightsKey)) - { - c.AddApplicationInsightsTelemetry(options.ApplicationInsightsKey); - } - - c.AddSingleton(options); - - foreach (var serviceDescriptor in _serviceCollection) - { - c.Add(serviceDescriptor); - } - }) - .UseEnvironment(options.EnvironmentName) - .UseStartup() - .ConfigureUrl(options.Mode, options.Port) - .Build(); - - return webHost; - } - } -} diff --git a/MLS.Agent/Properties/launchSettings.json b/MLS.Agent/Properties/launchSettings.json deleted file mode 100644 index 6c5badbb6..000000000 --- a/MLS.Agent/Properties/launchSettings.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:4242/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "commandLineArgs": "--port 4242 hosted", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Try": { - "commandName": "Project", - "commandLineArgs": "--port 4242 ../Samples ", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Hosted": { - "commandName": "Project", - "commandLineArgs": "--port 4242 hosted ", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Jupyter": { - "commandName": "Project", - "commandLineArgs": "../MLS.Agent.Tests/kernel_connection_file.json" - }, - "Verify": { - "commandName": "Project", - "commandLineArgs": "verify \"..\\Samples\"" - }, - "Publish": { - "commandName": "Project", - "commandLineArgs": "publish \"..\\Samples\" --format Markdown --target-directory \"..\\Samples\\published\"" - } - } -} \ No newline at end of file diff --git a/MLS.Agent/Startup.cs b/MLS.Agent/Startup.cs deleted file mode 100644 index a984e6ed9..000000000 --- a/MLS.Agent/Startup.cs +++ /dev/null @@ -1,247 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.IO; -using System.Linq; -using System.Net; -using System.Net.Mime; -using Clockwise; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting.Server.Features; -using Microsoft.AspNetCore.ResponseCompression; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.Hosting; -using MLS.Agent.Blazor; -using MLS.Agent.CommandLine; -using MLS.Agent.Markdown; -using MLS.Agent.Middleware; -using MLS.Agent.Tools; -using Newtonsoft.Json; -using Newtonsoft.Json.Serialization; -using Pocket; -using Recipes; -using WorkspaceServer; -using WorkspaceServer.Servers; -using static Pocket.Logger; - -namespace MLS.Agent -{ - public class Startup - { - private readonly CompositeDisposable _disposables = new CompositeDisposable - { - () => Logger.Log.Event("AgentStopping") - }; - - public Startup( - IHostEnvironment env, - StartupOptions startupOptions) - { - Environment = env; - StartupOptions = startupOptions; - - var configurationBuilder = new ConfigurationBuilder() - .SetBasePath(env.ContentRootPath); - - Configuration = configurationBuilder.Build(); - - } - - protected IConfigurationRoot Configuration { get; } - - protected IHostEnvironment Environment { get; } - - public StartupOptions StartupOptions { get; } - - public void ConfigureServices(IServiceCollection services) - { - using (var operation = Log.OnEnterAndConfirmOnExit()) - { - // Add framework services. - services.AddMvc(options => - { - options.EnableEndpointRouting = false; - options.Filters.Add(new ExceptionFilter()); - options.Filters.Add(new BadRequestOnInvalidModelFilter()); -#pragma warning disable CS0618 // Type or member is obsolete - }).SetCompatibilityVersion(Microsoft.AspNetCore.Mvc.CompatibilityVersion.Version_2_1) -#pragma warning restore CS0618 // Type or member is obsolete - .AddNewtonsoftJson(o => - { - o.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); - o.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; - o.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; - }); - - services.AddSingleton(Configuration); - - services.AddSingleton(c => new WorkspaceServerMultiplexer(c.GetRequiredService())); - - services.TryAddSingleton(c => new BrowserLauncher()); - - services.TryAddSingleton(c => - { - switch (StartupOptions.Mode) - { - case StartupMode.Hosted: - return PackageRegistry.CreateForHostedMode(); - - case StartupMode.Try: - return PackageRegistry.CreateForTryMode( - StartupOptions.RootDirectory, - StartupOptions.AddPackageSource); - - default: - throw new NotSupportedException($"Unrecognized value for {nameof(StartupOptions)}: {StartupOptions.Mode}"); - } - }); - - services.AddSingleton(c => new MarkdownProject( - c.GetRequiredService(), - c.GetRequiredService(), - StartupOptions)); - - services.TryAddSingleton(_ => - { - if (StartupOptions.Uri?.IsAbsoluteUri == true) - { - var client = new WebClient(); - var tempDirPath = Path.Combine( - Path.GetTempPath(), - Path.GetRandomFileName()); - - var tempDir = Directory.CreateDirectory(tempDirPath); - - var temp = Path.Combine( - tempDir.FullName, - Path.GetFileName(StartupOptions.Uri.LocalPath)); - - client.DownloadFile(StartupOptions.Uri, temp); - var fileInfo = new FileInfo(temp); - return new FileSystemDirectoryAccessor(fileInfo.Directory); - } - else - { - return StartupOptions.RootDirectory; - } - }); - - services.AddResponseCompression(options => - { - options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(new[] - { - MediaTypeNames.Application.Octet, - }); - }); - - services.Configure(options => - { - options.ForwardedHeaders = Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.All; - }); - - operation.Succeed(); - } - } - - public void Configure( - IApplicationBuilder app, - IHostApplicationLifetime lifetime, - IBrowserLauncher browserLauncher, - IDirectoryAccessor directoryAccessor, - PackageRegistry packageRegistry) - { - using (var operation = Log.OnEnterAndConfirmOnExit()) - { - lifetime.ApplicationStopping.Register(() => _disposables.Dispose()); - - ConfigureForOrchestratorProxy(app); - - // Serve Blazor on the /LocalCodeRunner/blazor-console prefix - app.Map("/LocalCodeRunner/blazor-console", blazor => - { - blazor.UseClientSideBlazorFiles(); - - blazor.UseRouting(); - - blazor.UseEndpoints(endpoints => - { - endpoints.MapFallbackToClientSideBlazor("index.html"); - }); - }); - - - var budget = new Budget(); - _disposables.Add(() => budget.Cancel()); - BlazorPackageConfiguration.Configure(app, app.ApplicationServices, packageRegistry, budget, !StartupOptions.IsLanguageService); - - app.UseMvc() - .UseDefaultFiles() - .UseStaticFilesFromToolLocationAndRootDirectory(directoryAccessor.GetFullyQualifiedRoot()); - - operation.Succeed(); - - if (StartupOptions.Mode == StartupMode.Try) - { - var uri = new Uri(app.ServerFeatures.Get().Addresses.First()); - Clock.Current - .Schedule(_ => LaunchBrowser(browserLauncher, directoryAccessor, uri), TimeSpan.FromSeconds(1)); - } - } - } - - private static void ConfigureForOrchestratorProxy(IApplicationBuilder app) - { - app.UseForwardedHeaders(); - - app.Use(async (context, next) => - { - var forwardedPath = context.Request.Headers["X-Forwarded-PathBase"].FirstOrDefault(); - if (!string.IsNullOrEmpty(forwardedPath)) - { - context.Request.Path = forwardedPath + context.Request.Path; - } - - await next(); - }); - } - - private void LaunchBrowser(IBrowserLauncher browserLauncher, IDirectoryAccessor directoryAccessor, Uri uri) - { - if (StartupOptions.Uri != null && - !StartupOptions.Uri.IsAbsoluteUri) - { - uri = new Uri(uri, StartupOptions.Uri); - } - else if (StartupOptions.Uri == null) - { - var readmeFile = FindReadmeFileAtRoot(); - if (readmeFile != null) - { - uri = new Uri(uri, readmeFile.ToString()); - } - } - - browserLauncher.LaunchBrowser(uri); - - RelativeFilePath FindReadmeFileAtRoot() - { - var files = directoryAccessor - .GetAllFilesRecursively() - .Where(f => StringComparer.InvariantCultureIgnoreCase.Compare(f.FileName, "readme.md") == 0 && IsRoot(f.Directory)) - .ToList(); - - return files.FirstOrDefault(); - } - - bool IsRoot(RelativeDirectoryPath path) - { - var isRoot = path == null || path == RelativeDirectoryPath.Root; - return isRoot; - } - } - - } -} diff --git a/MLS.Agent/StringExtensions.cs b/MLS.Agent/StringExtensions.cs deleted file mode 100644 index 1b3064551..000000000 --- a/MLS.Agent/StringExtensions.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.Web; -using Microsoft.AspNetCore.Html; - -namespace MLS.Agent -{ - public static class HtmlExtensions - { - public static IHtmlContent HtmlEncode(this string content) - { - return new HtmlString(HttpUtility.HtmlEncode(content)); - } - - public static IHtmlContent HtmlAttributeEncode(this string content) - { - return new HtmlString(HttpUtility.HtmlAttributeEncode(content)); - } - - public static IHtmlContent ToHtmlContent(this string value) - { - return new HtmlString(value); - } - } -} \ No newline at end of file diff --git a/MLS.Agent/WebHostBuilderExtensions.cs b/MLS.Agent/WebHostBuilderExtensions.cs deleted file mode 100644 index ff2ff6419..000000000 --- a/MLS.Agent/WebHostBuilderExtensions.cs +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.Net; -using System.Net.Sockets; -using Microsoft.AspNetCore.Hosting; -using MLS.Agent.CommandLine; - -namespace MLS.Agent -{ - public static class WebHostBuilderExtensions - { - public static IWebHostBuilder ConfigureUrl(this IWebHostBuilder builder, StartupMode mode, ushort? port) - { - var uri = GetBrowserLaunchUri(mode, port); - return builder.UseUrls(uri.ToString()); - } - - public static BrowserLaunchUri GetBrowserLaunchUri(StartupMode mode, ushort? port) - { - var scheme = mode == StartupMode.Hosted ? "http" : "https"; - var portToUse = port.HasValue ? port : GetFreePort(); - var host = mode == StartupMode.Hosted ? "*" : "localhost"; - return new BrowserLaunchUri(scheme, host, portToUse.Value); - } - - private static ushort GetFreePort() - { - TcpListener l = new TcpListener(IPAddress.Loopback, 0); - l.Start(); - int port = ((IPEndPoint)l.LocalEndpoint).Port; - l.Stop(); - return (ushort)port; - } - } -} \ No newline at end of file diff --git a/MLS.Agent/appsettings.Development.json b/MLS.Agent/appsettings.Development.json deleted file mode 100644 index fa8ce71a9..000000000 --- a/MLS.Agent/appsettings.Development.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "Logging": { - "IncludeScopes": false, - "LogLevel": { - "Default": "Debug", - "System": "Information", - "Microsoft": "Information" - } - } -} diff --git a/MLS.Agent/appsettings.json b/MLS.Agent/appsettings.json deleted file mode 100644 index 5fff67bac..000000000 --- a/MLS.Agent/appsettings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Logging": { - "IncludeScopes": false, - "LogLevel": { - "Default": "Warning" - } - } -} diff --git a/MLS.Agent/build-and-install-dotnet-try.ps1 b/MLS.Agent/build-and-install-dotnet-try.ps1 deleted file mode 100644 index fd4253b63..000000000 --- a/MLS.Agent/build-and-install-dotnet-try.ps1 +++ /dev/null @@ -1,20 +0,0 @@ -Set-StrictMode -version 2.0 -$ErrorActionPreference = "Stop" - -dotnet new -i Microsoft.AspNetCore.Blazor.Templates::3.1.0-preview4.19579.2 - -$thisDir = Split-Path -Parent $PSCommandPath -$toolLocation = "" -$toolVersion = "" -if (Test-Path 'env:DisableArcade') { - dotnet pack "$thisDir\MLS.Agent.csproj" /p:Version=0.0.0 - $script:toolLocation = "$thisDir\bin\debug" - $script:toolVersion = "0.0.0" -} else { - & "$thisDir\..\build.cmd" -pack - $script:toolLocation = "$thisDir\..\artifacts\packages\Debug\Shipping" - $script:toolVersion = "1.0.44142.42" -} - -dotnet tool uninstall -g Microsoft.dotnet-try -dotnet tool install -g --add-source "$toolLocation" --version $toolVersion Microsoft.dotnet-try \ No newline at end of file diff --git a/MLS.Agent/wwwroot/favicon-32x32.png b/MLS.Agent/wwwroot/favicon-32x32.png deleted file mode 100644 index 2556e979b..000000000 Binary files a/MLS.Agent/wwwroot/favicon-32x32.png and /dev/null differ diff --git a/MLS.Agent/wwwroot/fonts/materialdesignicons-webfont.eot b/MLS.Agent/wwwroot/fonts/materialdesignicons-webfont.eot deleted file mode 100644 index b9798eab8..000000000 Binary files a/MLS.Agent/wwwroot/fonts/materialdesignicons-webfont.eot and /dev/null differ diff --git a/MLS.Agent/wwwroot/fonts/materialdesignicons-webfont.svg b/MLS.Agent/wwwroot/fonts/materialdesignicons-webfont.svg deleted file mode 100644 index 4fc7cdd13..000000000 --- a/MLS.Agent/wwwroot/fonts/materialdesignicons-webfont.svg +++ /dev/null @@ -1,10188 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/MLS.Agent/wwwroot/fonts/materialdesignicons-webfont.ttf b/MLS.Agent/wwwroot/fonts/materialdesignicons-webfont.ttf deleted file mode 100644 index 75cde78f1..000000000 Binary files a/MLS.Agent/wwwroot/fonts/materialdesignicons-webfont.ttf and /dev/null differ diff --git a/MLS.Agent/wwwroot/fonts/materialdesignicons-webfont.woff b/MLS.Agent/wwwroot/fonts/materialdesignicons-webfont.woff deleted file mode 100644 index 8adbd27dd..000000000 Binary files a/MLS.Agent/wwwroot/fonts/materialdesignicons-webfont.woff and /dev/null differ diff --git a/MLS.Agent/wwwroot/fonts/materialdesignicons-webfont.woff2 b/MLS.Agent/wwwroot/fonts/materialdesignicons-webfont.woff2 deleted file mode 100644 index bc58886fa..000000000 Binary files a/MLS.Agent/wwwroot/fonts/materialdesignicons-webfont.woff2 and /dev/null differ diff --git a/MLS.Agent/wwwroot/static/docs.css b/MLS.Agent/wwwroot/static/docs.css deleted file mode 100644 index fc800b0b7..000000000 --- a/MLS.Agent/wwwroot/static/docs.css +++ /dev/null @@ -1,51 +0,0 @@ - -body { - display: flex; - flex-direction: column; - background-color: white; - font-family: Fira Code Retina, Consolas, monospace -} - -body > div { - flex: 0 1 auto; -} - -.instructions { - display: inline-flex; - flex-direction: row; - width: fit-content; -} - -.instructions > div { - margin: 4px; - padding: 4px; - flex: 0 1 auto; - display: inline-flex; - flex-direction: column; - background-color: lightblue; - border: 1px solid white -} - -.instructions > div > * { - flex: 0 1 auto; -} - -.instructions > div > button { - width: fit-content; -} - -.instructions > div > pre { - font-family: Consolas, ""Courier New"", monospace; - font-size: 12px; -} - -.messageLog { - padding: 4px; - background-color:aquamarine; - border: 1px; - width: 792px; -} -.notes { - width: 800px; - -} \ No newline at end of file diff --git a/MLS.Agent/wwwroot/static/vs_windows.png b/MLS.Agent/wwwroot/static/vs_windows.png deleted file mode 100644 index ebe82ba86..000000000 Binary files a/MLS.Agent/wwwroot/static/vs_windows.png and /dev/null differ diff --git a/MLS.PackageTool/MLS.PackageTool.csproj b/MLS.PackageTool/MLS.PackageTool.csproj deleted file mode 100644 index 0b1c33d79..000000000 --- a/MLS.PackageTool/MLS.PackageTool.csproj +++ /dev/null @@ -1,26 +0,0 @@ - - - - Exe - net6.0 - Latest - - - - true - true - - - - - - - - - - - - - - - diff --git a/MLS.PackageTool/Program.cs b/MLS.PackageTool/Program.cs deleted file mode 100644 index 30c5f20fc..000000000 --- a/MLS.PackageTool/Program.cs +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.CommandLine; -using System.CommandLine.Builder; -using System.CommandLine.Invocation; -using System.CommandLine.IO; -using System.CommandLine.Parsing; -using System.IO; -using System.IO.Compression; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MLS.PackageTool -{ - public class PackageToolConstants - { - public const string LocateProjectAsset = "locate-project-asset"; - public const string LocateWasmAsset = "locate-wasm-asset"; - public const string PreparePackage = "prepare-package"; - } - - public class Program - { - static async Task Main(string[] args) - { - var parser = CommandLineParser.Create( - LocateBuildAssetHandler, - LocateWasmAssetHandler, - Prepare); - - await parser.InvokeAsync(args); - } - - private static async Task Prepare(IConsole console) - { - await UnzipProjectAsset(console); - } - - private static async Task UnzipProjectAsset(IConsole console) - { - var directory = AssemblyDirectory(); - var zipFilePath = Path.Combine(directory, "project.zip"); - - File.Delete(zipFilePath); - - string targetDirectory = Path.Combine(directory, "project"); - try - { - Directory.Delete(targetDirectory, recursive: true); - } - catch (DirectoryNotFoundException) - { - } - - var resource = typeof(Program).Assembly.GetManifestResourceNames()[0]; - - using (var stream = typeof(Program).Assembly.GetManifestResourceStream(resource)) - { - using (var zipFileStream = File.OpenWrite(zipFilePath)) - { - await stream.CopyToAsync(zipFileStream); - await zipFileStream.FlushAsync(); - } - } - - ZipFile.ExtractToDirectory(zipFilePath, targetDirectory); - File.Delete(zipFilePath); - } - - public static void LocateBuildAssetHandler(IConsole console) - { - console.Out.WriteLine(BuildDirectoryLocation()); - } - - public static void LocateWasmAssetHandler(IConsole console) - { - console.Out.WriteLine(WasmDirectoryLocation()); - } - - public static string BuildDirectoryLocation() => - Path.Combine(Path.GetDirectoryName(AssemblyLocation()), "project", "build"); - - public static string WasmDirectoryLocation() => - Path.Combine(Path.GetDirectoryName(AssemblyLocation()), "project", "wasm", "MLS.Blazor", "dist"); - - public static string AssemblyLocation() - { - return typeof(Program).Assembly.Location; - } - - public static string AssemblyDirectory() - { - return Path.GetDirectoryName(AssemblyLocation()); - } - } - - - public class CommandLineParser - { - public static Parser Create( - Action getBuildAsset, - Action getWasmAsset, - Func prepare) - { - var rootCommand = new RootCommand - { - LocateBuildAsset(), - LocateWasmAsset(), - PreparePackage() - }; - - var parser = new CommandLineBuilder(rootCommand) - .UseDefaults() - .Build(); - - Command LocateBuildAsset() - { - return new Command(PackageToolConstants.LocateProjectAsset) - { - Handler = CommandHandler.Create(getBuildAsset) - }; - } - - Command LocateWasmAsset() - { - return new Command(PackageToolConstants.LocateWasmAsset) - { - Handler = CommandHandler.Create(getWasmAsset) - }; - } - - Command PreparePackage() - { - return new Command(PackageToolConstants.PreparePackage, "Prepares the packages") - { - Handler = CommandHandler.Create(prepare) - }; - } - - return parser; - } - } -} \ No newline at end of file diff --git a/MLS.PackageTool/package.zip b/MLS.PackageTool/package.zip deleted file mode 100644 index 1d111e7d3..000000000 --- a/MLS.PackageTool/package.zip +++ /dev/null @@ -1 +0,0 @@ -This is a temp file which will be overwritten by the actual zip file when the Try .NET package is created. \ No newline at end of file diff --git a/MLS.Repositories.Tests/GithubRepoLocatorTests.cs b/MLS.Repositories.Tests/GithubRepoLocatorTests.cs deleted file mode 100644 index aeb2a8e26..000000000 --- a/MLS.Repositories.Tests/GithubRepoLocatorTests.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; - -namespace MLS.Repositories.Tests -{ - public class GitHubRepoLocatorTests : RepoLocatorTests - { - protected override IRepoLocator GetLocator() - { - return new GitHubRepoLocator(); - } - } -} diff --git a/MLS.Repositories.Tests/MLS.Repositories.Tests.csproj b/MLS.Repositories.Tests/MLS.Repositories.Tests.csproj deleted file mode 100644 index e526eee5e..000000000 --- a/MLS.Repositories.Tests/MLS.Repositories.Tests.csproj +++ /dev/null @@ -1,34 +0,0 @@ - - - - net6.0 - - false - - - - - - - - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - diff --git a/MLS.Repositories.Tests/RepoLocatorSimulatorTests.cs b/MLS.Repositories.Tests/RepoLocatorSimulatorTests.cs deleted file mode 100644 index 7d9ad3bc3..000000000 --- a/MLS.Repositories.Tests/RepoLocatorSimulatorTests.cs +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MLS.Repositories.Tests -{ - public class RepoLocatorSimulatorTests : RepoLocatorTests - { - protected override IRepoLocator GetLocator() - { - return new RepoLocatorSimulator(); - } - } -} diff --git a/MLS.Repositories.Tests/RepoLocatorTests.cs b/MLS.Repositories.Tests/RepoLocatorTests.cs deleted file mode 100644 index 6b16f1bba..000000000 --- a/MLS.Repositories.Tests/RepoLocatorTests.cs +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using FluentAssertions; -using System; -using System.Linq; -using System.Threading.Tasks; -using Xunit; - -namespace MLS.Repositories.Tests -{ - public abstract class RepoLocatorTests - { - protected abstract IRepoLocator GetLocator(); - - [Fact] - public async Task It_does_not_find_a_certain_guid() - { - var locator = GetLocator(); - var result = await locator.LocateRepo("23e66c25-8716-41ae-985a-6cb3ddebd810"); - result.Should().BeEmpty(); - } - - [Fact] - public async Task It_does_find_a_certain_repo() - { - var locator = GetLocator(); - var result = await locator.LocateRepo("2660eaec-6af8-452d-b70d-41227d616cd9"); - result.Single().Should().BeEquivalentTo( - new Repo("rchande/2660eaec-6af8-452d-b70d-41227d616cd9", - "https://github.com/rchande/2660eaec-6af8-452d-b70d-41227d616cd9.git")); - } - - [Fact] - public async Task It_does_find_multiple_repos() - { - var locator = GetLocator(); - var result = await locator.LocateRepo("rchande/tribble"); - result.Select(r => r.Name).Should().BeEquivalentTo( - "rchande/upgraded-octo-tribble.", - "rchande/downgraded-octo-tribble."); - } - } -} diff --git a/MLS.Repositories/GithubRepoLocator.cs b/MLS.Repositories/GithubRepoLocator.cs deleted file mode 100644 index a0aea4278..000000000 --- a/MLS.Repositories/GithubRepoLocator.cs +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using Octokit; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace MLS.Repositories -{ - public class GitHubRepoLocator : IRepoLocator - { - public async Task> LocateRepo(string repo) - { - var req = new SearchRepositoriesRequest(repo); - try - { - // TODO: Should we be forcing users to log in (and thereby use their own API token)? - var client = new GitHubClient(new ProductHeaderValue("github-try-demo")); - - var result = await client.Search.SearchRepo(req); - return result.Items.Select(i => new Repo(i.FullName, i.CloneUrl)); - } - catch (RateLimitExceededException) - { - return Enumerable.Empty(); - } - } - } -} diff --git a/MLS.Repositories/IRepoLocator.cs b/MLS.Repositories/IRepoLocator.cs deleted file mode 100644 index 794c54b6e..000000000 --- a/MLS.Repositories/IRepoLocator.cs +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.Collections.Generic; -using System.Threading.Tasks; - -namespace MLS.Repositories -{ - public interface IRepoLocator - { - Task> LocateRepo(string repo); - } - - public class Repo - { - public Repo(string name, string cloneUrl) - { - Name = name; - CloneUrl = cloneUrl; - } - - public string Name { get; } - public string CloneUrl { get; } - } -} diff --git a/MLS.Repositories/MLS.Repositories.csproj b/MLS.Repositories/MLS.Repositories.csproj deleted file mode 100644 index e1f830d2e..000000000 --- a/MLS.Repositories/MLS.Repositories.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - netstandard2.0 - Latest - $(NoWarn);8002 - - - - - - - diff --git a/MLS.Repositories/RepoLocatorSimulator.cs b/MLS.Repositories/RepoLocatorSimulator.cs deleted file mode 100644 index fc216e94d..000000000 --- a/MLS.Repositories/RepoLocatorSimulator.cs +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.Collections.Generic; -using System.Threading.Tasks; - -namespace MLS.Repositories -{ - public class RepoLocatorSimulator : IRepoLocator - { - public Task> LocateRepo(string repo) - { - var result = new List(); - if (repo.Contains("2660eaec-6af8-452d-b70d-41227d616cd9")) - { - result.Add( - new Repo("rchande/2660eaec-6af8-452d-b70d-41227d616cd9", - "https://github.com/rchande/2660eaec-6af8-452d-b70d-41227d616cd9.git")); - } - else if (repo == "rchande/tribble") - { - result.Add( - new Repo("rchande/upgraded-octo-tribble.", - "https://github.com/rchande/upgraded-octo-tribble..git")); - result.Add( - new Repo("rchande/downgraded-octo-tribble.", - "https://github.com/rchande/downgraded-octo-tribble..git")); - } - - return Task.FromResult((IEnumerable)result); - } - } -} diff --git a/Microsoft.DotNet.Interactive.Telemetry.Tests/Microsoft.DotNet.Interactive.Telemetry.Tests.csproj b/Microsoft.DotNet.Interactive.Telemetry.Tests/Microsoft.DotNet.Interactive.Telemetry.Tests.csproj deleted file mode 100644 index 1d850f16d..000000000 --- a/Microsoft.DotNet.Interactive.Telemetry.Tests/Microsoft.DotNet.Interactive.Telemetry.Tests.csproj +++ /dev/null @@ -1,41 +0,0 @@ - - - - netcoreapp3.1 - portable-net45+win8+wp8+wpa81 - $(NoWarn);8002 - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - - - all - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - diff --git a/Microsoft.DotNet.Interactive.Telemetry.Tests/TelemetryCommonPropertiesTests.cs b/Microsoft.DotNet.Interactive.Telemetry.Tests/TelemetryCommonPropertiesTests.cs deleted file mode 100644 index 5280f4833..000000000 --- a/Microsoft.DotNet.Interactive.Telemetry.Tests/TelemetryCommonPropertiesTests.cs +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Runtime.InteropServices; -using FluentAssertions; -using Xunit; - -namespace Microsoft.DotNet.Interactive.Telemetry.Tests -{ - public class TelemetryCommonPropertiesTests - { - [Fact] - public void Telemetry_common_properties_should_contain_if_it_is_in_docker_or_not() - { - var unitUnderTest = new TelemetryCommonProperties("product-version", userLevelCacheWriter: new NothingUserLevelCacheWriter()); - unitUnderTest.GetTelemetryCommonProperties().Should().ContainKey("Docker Container"); - } - - [Fact] - public void Telemetry_common_properties_should_return_hashed_machine_id() - { - var unitUnderTest = new TelemetryCommonProperties("product-version", getMACAddress: () => "plaintext", userLevelCacheWriter: new NothingUserLevelCacheWriter()); - unitUnderTest.GetTelemetryCommonProperties()["Machine ID"].Should().NotBe("plaintext"); - } - - [Fact] - public void Telemetry_common_properties_should_return_new_guid_when_cannot_get_mac_address() - { - var unitUnderTest = new TelemetryCommonProperties("product-version", getMACAddress: () => null, userLevelCacheWriter: new NothingUserLevelCacheWriter()); - var assignedMachineId = unitUnderTest.GetTelemetryCommonProperties()["Machine ID"]; - - Guid.TryParse(assignedMachineId, out var _).Should().BeTrue("it should be a guid"); - } - - [Fact] - public void Telemetry_common_properties_should_contain_kernel_version() - { - var unitUnderTest = new TelemetryCommonProperties("product-version", getMACAddress: () => null, userLevelCacheWriter: new NothingUserLevelCacheWriter()); - unitUnderTest.GetTelemetryCommonProperties()["Kernel Version"].Should().Be(RuntimeInformation.OSDescription); - } - } -} \ No newline at end of file diff --git a/Microsoft.DotNet.Interactive.Telemetry/(Recipes)/Paths.cs b/Microsoft.DotNet.Interactive.Telemetry/(Recipes)/Paths.cs deleted file mode 100644 index 88503848e..000000000 --- a/Microsoft.DotNet.Interactive.Telemetry/(Recipes)/Paths.cs +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.IO; -using System.Runtime.InteropServices; - -namespace Microsoft.DotNet.Interactive.Telemetry -{ - internal static class Paths - { - private const string DotnetHomeVariableName = "DOTNET_CLI_HOME"; - private const string DotnetProfileDirectoryName = ".dotnet"; - private const string ToolsShimFolderName = "tools"; - - static Paths() - { - UserProfile = Environment.GetEnvironmentVariable( - RuntimeInformation.IsOSPlatform(OSPlatform.Windows) - ? "USERPROFILE" - : "HOME"); - - DotnetToolsPath = Path.Combine(UserProfile, DotnetProfileDirectoryName, ToolsShimFolderName); - - var nugetPackagesEnvironmentVariable = Environment.GetEnvironmentVariable("NUGET_PACKAGES"); - - NugetCache = String.IsNullOrWhiteSpace(nugetPackagesEnvironmentVariable) - ? Path.Combine(UserProfile, ".nuget", "packages") - : nugetPackagesEnvironmentVariable; - } - - public static string DotnetUserProfileFolderPath => - Path.Combine(DotnetHomePath, DotnetProfileDirectoryName); - - public static string DotnetHomePath - { - get - { - var home = Environment.GetEnvironmentVariable(DotnetHomeVariableName); - if (string.IsNullOrEmpty(home)) - { - home = UserProfile; - if (string.IsNullOrEmpty(home)) - { - throw new DirectoryNotFoundException(); - } - } - - return home; - } - } - - public static string DotnetToolsPath { get; } - - public static string UserProfile { get; } - - public static string NugetCache { get; } - - public static readonly string InstallDirectory = Path.GetDirectoryName(typeof(Paths).Assembly.Location); - } -} diff --git a/Microsoft.DotNet.Interactive.Telemetry/ApplicationInsightsEntryFormat.cs b/Microsoft.DotNet.Interactive.Telemetry/ApplicationInsightsEntryFormat.cs deleted file mode 100644 index 5e9f78330..000000000 --- a/Microsoft.DotNet.Interactive.Telemetry/ApplicationInsightsEntryFormat.cs +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Microsoft.DotNet.Interactive.Telemetry -{ - public class ApplicationInsightsEntryFormat - { - public ApplicationInsightsEntryFormat( - string eventName = null, - IDictionary properties = null, - IDictionary measurements = null) - { - EventName = eventName; - Properties = properties; - Measurements = measurements; - } - - public string EventName { get; } - public IDictionary Properties { get; } - public IDictionary Measurements { get; } - - public ApplicationInsightsEntryFormat WithAppliedToPropertiesValue(Func func) - { - var appliedProperties = Properties.ToDictionary(p => p.Key, p => func(p.Value)); - return new ApplicationInsightsEntryFormat(EventName, appliedProperties, Measurements); - } - } -} diff --git a/Microsoft.DotNet.Interactive.Telemetry/DockerContainerDetector.cs b/Microsoft.DotNet.Interactive.Telemetry/DockerContainerDetector.cs deleted file mode 100644 index 9cda54661..000000000 --- a/Microsoft.DotNet.Interactive.Telemetry/DockerContainerDetector.cs +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.IO; -using System.Security; -using Microsoft.DotNet.PlatformAbstractions; -using Microsoft.Win32; - -namespace Microsoft.DotNet.Interactive.Telemetry -{ - internal class DockerContainerDetectorForTelemetry : IDockerContainerDetector - { - public IsDockerContainerResult IsDockerContainer() - { - switch (RuntimeEnvironment.OperatingSystemPlatform) - { - case Platform.Windows: - try - { - using (RegistryKey subkey - = Registry.LocalMachine.OpenSubKey("System\\CurrentControlSet\\Control")) - { - return subkey?.GetValue("ContainerType") != null - ? IsDockerContainerResult.True - : IsDockerContainerResult.False; - } - } - catch (SecurityException) - { - return IsDockerContainerResult.Unknown; - } - case Platform.Linux: - return ReadProcToDetectDockerInLinux() - ? IsDockerContainerResult.True - : IsDockerContainerResult.False; - case Platform.Unknown: - return IsDockerContainerResult.Unknown; - case Platform.Darwin: - default: - return IsDockerContainerResult.False; - } - } - - private static bool ReadProcToDetectDockerInLinux() - { - return Telemetry.IsRunningInDockerContainer || File.ReadAllText("/proc/1/cgroup").Contains("/docker/"); - } - } -} diff --git a/Microsoft.DotNet.Interactive.Telemetry/FirstTimeuseNoticeSentinel.cs b/Microsoft.DotNet.Interactive.Telemetry/FirstTimeuseNoticeSentinel.cs deleted file mode 100644 index b161dc93a..000000000 --- a/Microsoft.DotNet.Interactive.Telemetry/FirstTimeuseNoticeSentinel.cs +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.IO; - -namespace Microsoft.DotNet.Interactive.Telemetry -{ - public sealed class FirstTimeUseNoticeSentinel : IFirstTimeUseNoticeSentinel - { - public const string SkipFirstTimeExperienceEnvironmentVariableName = "DOTNET_TRY_SKIP_FIRST_TIME_EXPERIENCE"; - - private readonly string _sentinel; - private readonly string _dotnetTryUserProfileFolderPath; - private readonly Func _fileExists; - private readonly Func _directoryExists; - private readonly Action _createDirectory; - private readonly Action _createEmptyFile; - - private string SentinelPath => Path.Combine(_dotnetTryUserProfileFolderPath, _sentinel); - - public FirstTimeUseNoticeSentinel(string productVersion) : - this( - productVersion, - Paths.DotnetUserProfileFolderPath, - File.Exists, - Directory.Exists, - path => Directory.CreateDirectory(path), - path => File.WriteAllBytes(path, new byte[] { })) - { - } - - public FirstTimeUseNoticeSentinel( - string productVersion, - string dotnetTryUserProfileFolderPath, - Func fileExists, - Func directoryExists, - Action createDirectory, - Action createEmptyFile) - { - _sentinel = $"{productVersion}.dotnetTryFirstUseSentinel"; - _dotnetTryUserProfileFolderPath = dotnetTryUserProfileFolderPath; - _fileExists = fileExists; - _directoryExists = directoryExists; - _createDirectory = createDirectory; - _createEmptyFile = createEmptyFile; - } - - public bool Exists() - { - return _fileExists(SentinelPath); - } - - public void CreateIfNotExists() - { - if (!Exists()) - { - if (!_directoryExists(_dotnetTryUserProfileFolderPath)) - { - _createDirectory(_dotnetTryUserProfileFolderPath); - } - - _createEmptyFile(SentinelPath); - } - } - } -} \ No newline at end of file diff --git a/Microsoft.DotNet.Interactive.Telemetry/IDockerContainerDetector.cs b/Microsoft.DotNet.Interactive.Telemetry/IDockerContainerDetector.cs deleted file mode 100644 index 7cc780d4d..000000000 --- a/Microsoft.DotNet.Interactive.Telemetry/IDockerContainerDetector.cs +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -namespace Microsoft.DotNet.Interactive.Telemetry -{ - public interface IDockerContainerDetector - { - IsDockerContainerResult IsDockerContainer(); - } -} diff --git a/Microsoft.DotNet.Interactive.Telemetry/IFirstTimeUseNoticeSentinel.cs b/Microsoft.DotNet.Interactive.Telemetry/IFirstTimeUseNoticeSentinel.cs deleted file mode 100644 index 1830d4d8e..000000000 --- a/Microsoft.DotNet.Interactive.Telemetry/IFirstTimeUseNoticeSentinel.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -namespace Microsoft.DotNet.Interactive.Telemetry -{ - public interface IFirstTimeUseNoticeSentinel - { - bool Exists(); - - void CreateIfNotExists(); - } -} diff --git a/Microsoft.DotNet.Interactive.Telemetry/ITelemetry.cs b/Microsoft.DotNet.Interactive.Telemetry/ITelemetry.cs deleted file mode 100644 index b8ed16b35..000000000 --- a/Microsoft.DotNet.Interactive.Telemetry/ITelemetry.cs +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.Collections.Generic; - -namespace Microsoft.DotNet.Interactive.Telemetry -{ - public interface ITelemetry - { - bool Enabled { get; } - - void TrackEvent(string eventName, IDictionary properties, IDictionary measurements); - } -} diff --git a/Microsoft.DotNet.Interactive.Telemetry/ITelemetryFilter.cs b/Microsoft.DotNet.Interactive.Telemetry/ITelemetryFilter.cs deleted file mode 100644 index 8e4d1f5a3..000000000 --- a/Microsoft.DotNet.Interactive.Telemetry/ITelemetryFilter.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.Collections.Generic; - -namespace Microsoft.DotNet.Interactive.Telemetry -{ - public interface ITelemetryFilter - { - IEnumerable Filter(object o); - } -} diff --git a/Microsoft.DotNet.Interactive.Telemetry/IUserLevelCacheWriter.cs b/Microsoft.DotNet.Interactive.Telemetry/IUserLevelCacheWriter.cs deleted file mode 100644 index 865d3db6b..000000000 --- a/Microsoft.DotNet.Interactive.Telemetry/IUserLevelCacheWriter.cs +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; - -namespace Microsoft.DotNet.Interactive.Telemetry -{ - public interface IUserLevelCacheWriter - { - string RunWithCache( - string cacheKey, - Func getValueToCache); - } -} \ No newline at end of file diff --git a/Microsoft.DotNet.Interactive.Telemetry/IsDockerContainerResult.cs b/Microsoft.DotNet.Interactive.Telemetry/IsDockerContainerResult.cs deleted file mode 100644 index 7e1a12272..000000000 --- a/Microsoft.DotNet.Interactive.Telemetry/IsDockerContainerResult.cs +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. -namespace Microsoft.DotNet.Interactive.Telemetry -{ - public enum IsDockerContainerResult - { - True, - False, - Unknown - } -} \ No newline at end of file diff --git a/Microsoft.DotNet.Interactive.Telemetry/MacAddressGetter.cs b/Microsoft.DotNet.Interactive.Telemetry/MacAddressGetter.cs deleted file mode 100644 index 91e8a8420..000000000 --- a/Microsoft.DotNet.Interactive.Telemetry/MacAddressGetter.cs +++ /dev/null @@ -1,189 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Linq; -using System.Net.NetworkInformation; -using System.Runtime.InteropServices; -using System.Text.RegularExpressions; - -namespace Microsoft.DotNet.Interactive.Telemetry -{ - internal static class MacAddressGetter - { - private const string InvalidMacAddress = "00-00-00-00-00-00"; - private const string MacRegex = @"(?:[a-z0-9]{2}[:\-]){5}[a-z0-9]{2}"; - private const string ZeroRegex = @"(?:00[:\-]){5}00"; - private const int ErrorFileNotFound = 0x2; - - public static string GetMacAddress() - { - try - { - var macAddress = GetMacAddressCore(); - if (String.IsNullOrWhiteSpace(macAddress) || macAddress.Equals(InvalidMacAddress, StringComparison.OrdinalIgnoreCase)) - { - return GetMacAddressByNetworkInterface(); - } - else - { - return macAddress; - } - } - catch - { - return null; - } - } - - private static string GetMacAddressCore() - { - try - { - var shelloutput = GetShellOutMacAddressOutput(); - if (String.IsNullOrWhiteSpace(shelloutput)) - { - return null; - } - - return ParseMACAddress(shelloutput); - } - catch (Win32Exception e) - { - if (e.NativeErrorCode == ErrorFileNotFound) - { - return GetMacAddressByNetworkInterface(); - } - else - { - throw; - } - } - } - - private static string ParseMACAddress(string shelloutput) - { - string macAddress = null; - foreach (Match match in Regex.Matches(shelloutput, MacRegex, RegexOptions.IgnoreCase)) - { - if (!Regex.IsMatch(match.Value, ZeroRegex)) - { - macAddress = match.Value; - break; - } - } - - if (macAddress != null) - { - return macAddress; - } - return null; - } - - private static string GetIpCommandOutput() - { - var ipResult = new ProcessStartInfo - { - FileName = "ip", - Arguments = "link", - UseShellExecute = false - }.ExecuteAndCaptureOutput(out string ipStdOut, out string ipStdErr); - - if (ipResult == 0) - { - return ipStdOut; - } - else - { - return null; - } - } - - private static string GetShellOutMacAddressOutput() - { - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - var result = new ProcessStartInfo - { - FileName = "getmac.exe", - UseShellExecute = false - }.ExecuteAndCaptureOutput(out string stdOut, out string stdErr); - - if (result == 0) - { - return stdOut; - } - else - { - return null; - } - } - else - { - try - { - var ifconfigResult = new ProcessStartInfo - { - FileName = "ifconfig", - Arguments = "-a", - UseShellExecute = false - }.ExecuteAndCaptureOutput(out string ifconfigStdOut, out string ifconfigStdErr); - - if (ifconfigResult == 0) - { - return ifconfigStdOut; - } - else - { - return GetIpCommandOutput(); - } - } - catch (Win32Exception e) - { - if (e.NativeErrorCode == ErrorFileNotFound) - { - return GetIpCommandOutput(); - } - else - { - throw; - } - } - } - } - - private static string GetMacAddressByNetworkInterface() - { - return GetMacAddressesByNetworkInterface().Where(x => !x.Equals(InvalidMacAddress, StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); - } - - private static List GetMacAddressesByNetworkInterface() - { - NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); - var macs = new List(); - - if (nics == null || nics.Length < 1) - { - macs.Add(string.Empty); - return macs; - } - - foreach (NetworkInterface adapter in nics) - { - IPInterfaceProperties properties = adapter.GetIPProperties(); - - PhysicalAddress address = adapter.GetPhysicalAddress(); - byte[] bytes = address.GetAddressBytes(); - macs.Add(string.Join("-", bytes.Select(x => x.ToString("X2")))); - if (macs.Count >= 10) - { - break; - } - } - return macs; - } - } -} diff --git a/Microsoft.DotNet.Interactive.Telemetry/Microsoft.DotNet.Interactive.Telemetry.csproj b/Microsoft.DotNet.Interactive.Telemetry/Microsoft.DotNet.Interactive.Telemetry.csproj deleted file mode 100644 index cc6ab5f8b..000000000 --- a/Microsoft.DotNet.Interactive.Telemetry/Microsoft.DotNet.Interactive.Telemetry.csproj +++ /dev/null @@ -1,14 +0,0 @@ - - - - net6.0 - latest - - - - - - - - - diff --git a/Microsoft.DotNet.Interactive.Telemetry/NopFirstTimeUseNoticeSentinel.cs b/Microsoft.DotNet.Interactive.Telemetry/NopFirstTimeUseNoticeSentinel.cs deleted file mode 100644 index 03b636eab..000000000 --- a/Microsoft.DotNet.Interactive.Telemetry/NopFirstTimeUseNoticeSentinel.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -namespace Microsoft.DotNet.Interactive.Telemetry -{ - public sealed class NopFirstTimeUseNoticeSentinel : IFirstTimeUseNoticeSentinel - { - public void CreateIfNotExists() - { - } - - public bool Exists() - { - return false; - } - } -} diff --git a/Microsoft.DotNet.Interactive.Telemetry/NothingUserLevelCacheWriter.cs b/Microsoft.DotNet.Interactive.Telemetry/NothingUserLevelCacheWriter.cs deleted file mode 100644 index 0b9b7126b..000000000 --- a/Microsoft.DotNet.Interactive.Telemetry/NothingUserLevelCacheWriter.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; - -namespace Microsoft.DotNet.Interactive.Telemetry -{ - public sealed class NothingUserLevelCacheWriter : IUserLevelCacheWriter - { - public string RunWithCache(string cacheKey, Func getValueToCache) - { - return getValueToCache(); - } - } -} diff --git a/Microsoft.DotNet.Interactive.Telemetry/ProcessStartInfoExtensions.cs b/Microsoft.DotNet.Interactive.Telemetry/ProcessStartInfoExtensions.cs deleted file mode 100644 index ebf4863ef..000000000 --- a/Microsoft.DotNet.Interactive.Telemetry/ProcessStartInfoExtensions.cs +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.Diagnostics; - -namespace Microsoft.DotNet.Interactive.Telemetry -{ - internal static class ProcessStartInfoExtensions - { - public static int ExecuteAndCaptureOutput(this ProcessStartInfo startInfo, out string stdOut, out string stdErr) - { - var outStream = new StreamForwarder().Capture(); - var errStream = new StreamForwarder().Capture(); - - startInfo.RedirectStandardOutput = true; - startInfo.RedirectStandardError = true; - - using var process = new Process - { - StartInfo = startInfo - }; - - process.EnableRaisingEvents = true; - - process.Start(); - - var taskOut = outStream.BeginRead(process.StandardOutput); - var taskErr = errStream.BeginRead(process.StandardError); - - process.WaitForExit(); - - taskOut.Wait(); - taskErr.Wait(); - - stdOut = outStream.CapturedOutput; - stdErr = errStream.CapturedOutput; - - return process.ExitCode; - } - } -} diff --git a/Microsoft.DotNet.Interactive.Telemetry/Sha256Hasher.cs b/Microsoft.DotNet.Interactive.Telemetry/Sha256Hasher.cs deleted file mode 100644 index 8668d6f62..000000000 --- a/Microsoft.DotNet.Interactive.Telemetry/Sha256Hasher.cs +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.Security.Cryptography; -using System.Text; - -namespace Microsoft.DotNet.Interactive.Telemetry -{ - public static class Sha256Hasher - { - /// - /// The hashed mac address needs to be the same hashed value as produced by the other distinct sources given the same input. (e.g. VsCode) - /// - public static string Hash(string text) - { - var sha256 = SHA256.Create(); - return HashInFormat(sha256, text); - } - - public static string HashWithNormalizedCasing(string text) - { - return Hash(text.ToUpperInvariant()); - } - - private static string HashInFormat(SHA256 sha256, string text) - { - byte[] bytes = Encoding.UTF8.GetBytes(text); - byte[] hash = sha256.ComputeHash(bytes); - StringBuilder hashString = new StringBuilder(); - foreach (byte x in hash) - { - hashString.AppendFormat("{0:x2}", x); - } - return hashString.ToString(); - } - } -} diff --git a/Microsoft.DotNet.Interactive.Telemetry/StreamForwarder.cs b/Microsoft.DotNet.Interactive.Telemetry/StreamForwarder.cs deleted file mode 100644 index 45590a0e1..000000000 --- a/Microsoft.DotNet.Interactive.Telemetry/StreamForwarder.cs +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Microsoft.DotNet.Interactive.Telemetry -{ - public sealed class StreamForwarder - { - private static readonly char[] s_ignoreCharacters = new char[] { '\r' }; - private static readonly char s_flushBuilderCharacter = '\n'; - - private StringBuilder _builder; - private StringWriter _capture; - private Action _writeLine; - - public string CapturedOutput - { - get - { - return _capture?.GetStringBuilder()?.ToString(); - } - } - - public StreamForwarder Capture() - { - ThrowIfCaptureSet(); - - _capture = new StringWriter(); - - return this; - } - - public StreamForwarder ForwardTo(Action writeLine) - { - ThrowIfNull(writeLine); - - ThrowIfForwarderSet(); - - _writeLine = writeLine; - - return this; - } - - public Task BeginRead(TextReader reader) - { - return Task.Run(() => Read(reader)); - } - - public void Read(TextReader reader) - { - var bufferSize = 1; - - int readCharacterCount; - char currentCharacter; - - var buffer = new char[bufferSize]; - _builder = new StringBuilder(); - - // Using Read with buffer size 1 to prevent looping endlessly - // like we would when using Read() with no buffer - while ((readCharacterCount = reader.Read(buffer, 0, bufferSize)) > 0) - { - currentCharacter = buffer[0]; - - if (currentCharacter == s_flushBuilderCharacter) - { - WriteBuilder(); - } - else if (!s_ignoreCharacters.Contains(currentCharacter)) - { - _builder.Append(currentCharacter); - } - } - - // Flush anything else when the stream is closed - // Which should only happen if someone used console.Write - WriteBuilder(); - } - - private void WriteBuilder() - { - if (_builder.Length == 0) - { - return; - } - - WriteLine(_builder.ToString()); - _builder.Clear(); - } - - private void WriteLine(string str) - { - if (_capture != null) - { - _capture.WriteLine(str); - } - - if (_writeLine != null) - { - _writeLine(str); - } - } - - private void ThrowIfNull(object obj) - { - if (obj == null) - { - throw new ArgumentNullException(nameof(obj)); - } - } - - private void ThrowIfForwarderSet() - { - if (_writeLine != null) - { - throw new InvalidOperationException("WriteLine forwarder set previously"); // TODO: Localize this? - } - } - - private void ThrowIfCaptureSet() - { - if (_capture != null) - { - throw new InvalidOperationException("Already capturing stream!"); // TODO: Localize this? - } - } - } -} diff --git a/Microsoft.DotNet.Interactive.Telemetry/Telemetry.cs b/Microsoft.DotNet.Interactive.Telemetry/Telemetry.cs deleted file mode 100644 index d70ac39b5..000000000 --- a/Microsoft.DotNet.Interactive.Telemetry/Telemetry.cs +++ /dev/null @@ -1,199 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Threading.Tasks; -using Microsoft.ApplicationInsights; -using Microsoft.DotNet.PlatformAbstractions; - -namespace Microsoft.DotNet.Interactive.Telemetry -{ - public sealed class Telemetry : ITelemetry - { - internal static string CurrentSessionId = null; - private TelemetryClient _client = null; - private Dictionary _commonProperties = null; - private Dictionary _commonMeasurements = null; - private Task _trackEventTask = null; - - private const string InstrumentationKey = "b0dafad5-1430-4852-bc61-95c836b3e612"; - public const string TelemetryOptout = "DOTNET_TRY_CLI_TELEMETRY_OPTOUT"; - - public const string WelcomeMessage = @"Welcome to Try .NET! ---------------------- -Telemetry ---------- -The .NET Core tools collect usage data in order to help us improve your experience.The data is anonymous and doesn't include command-line arguments. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_TRY_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell. -"; - - public Telemetry( - string productVersion, - IFirstTimeUseNoticeSentinel sentinel, - string sessionId = null, - bool blockThreadInitialization = false) - { - Enabled = !GetEnvironmentVariableAsBool(TelemetryOptout) && PermissionExists(sentinel); - - if (!Enabled) - { - return; - } - - // Store the session ID in a static field so that it can be reused - CurrentSessionId = sessionId ?? Guid.NewGuid().ToString(); - - if (blockThreadInitialization) - { - InitializeTelemetry(productVersion); - } - else - { - //initialize in task to offload to parallel thread - _trackEventTask = Task.Factory.StartNew(() => InitializeTelemetry(productVersion)); - } - } - - public bool Enabled { get; } - - public static bool SkipFirstTimeExperience => GetEnvironmentVariableAsBool(FirstTimeUseNoticeSentinel.SkipFirstTimeExperienceEnvironmentVariableName, false); - - public static bool IsRunningInDockerContainer => GetEnvironmentVariableAsBool("DOTNET_RUNNING_IN_CONTAINER", false); - - private static bool GetEnvironmentVariableAsBool(string name, bool defaultValue=false) - { - var str = Environment.GetEnvironmentVariable(name); - if (string.IsNullOrEmpty(str)) - { - return defaultValue; - } - - switch (str.ToLowerInvariant()) - { - case "true": - case "1": - case "yes": - return true; - case "false": - case "0": - case "no": - return false; - default: - return defaultValue; - } - } - - private bool PermissionExists(IFirstTimeUseNoticeSentinel sentinel) - { - if (sentinel == null) - { - return false; - } - - return sentinel.Exists(); - } - - public void TrackEvent(string eventName, IDictionary properties, - IDictionary measurements) - { - if (!Enabled) - { - return; - } - - //continue task in existing parallel thread - _trackEventTask = _trackEventTask.ContinueWith( - x => TrackEventTask(eventName, properties, measurements) - ); - } - - private void ThreadBlockingTrackEvent(string eventName, IDictionary properties, IDictionary measurements) - { - if (!Enabled) - { - return; - } - TrackEventTask(eventName, properties, measurements); - } - - private void InitializeTelemetry(string productVersion) - { - try - { - _client = new TelemetryClient(); - _client.InstrumentationKey = InstrumentationKey; - _client.Context.Session.Id = CurrentSessionId; - _client.Context.Device.OperatingSystem = RuntimeEnvironment.OperatingSystem; - - _commonProperties = new TelemetryCommonProperties(productVersion).GetTelemetryCommonProperties(); - _commonMeasurements = new Dictionary(); - } - catch (Exception e) - { - _client = null; - // we dont want to fail the tool if telemetry fails. - Debug.Fail(e.ToString()); - } - } - - private void TrackEventTask( - string eventName, - IDictionary properties, - IDictionary measurements) - { - if (_client == null) - { - return; - } - - try - { - Dictionary eventProperties = GetEventProperties(properties); - Dictionary eventMeasurements = GetEventMeasures(measurements); - - _client.TrackEvent(PrependProducerNamespace(eventName), eventProperties, eventMeasurements); - _client.Flush(); - } - catch (Exception e) - { - Debug.Fail(e.ToString()); - } - } - - private static string PrependProducerNamespace(string eventName) - { - return "dotnet/try/cli/" + eventName; - } - - private Dictionary GetEventMeasures(IDictionary measurements) - { - Dictionary eventMeasurements = new Dictionary(_commonMeasurements); - if (measurements != null) - { - foreach (KeyValuePair measurement in measurements) - { - eventMeasurements[measurement.Key] = measurement.Value; - } - } - return eventMeasurements; - } - - private Dictionary GetEventProperties(IDictionary properties) - { - if (properties != null) - { - var eventProperties = new Dictionary(_commonProperties); - foreach (KeyValuePair property in properties) - { - eventProperties[property.Key] = property.Value; - } - return eventProperties; - } - else - { - return _commonProperties; - } - } - } -} diff --git a/Microsoft.DotNet.Interactive.Telemetry/TelemetryCommonProperties.cs b/Microsoft.DotNet.Interactive.Telemetry/TelemetryCommonProperties.cs deleted file mode 100644 index 15d051b5c..000000000 --- a/Microsoft.DotNet.Interactive.Telemetry/TelemetryCommonProperties.cs +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using RuntimeEnvironment = Microsoft.DotNet.PlatformAbstractions.RuntimeEnvironment; - -namespace Microsoft.DotNet.Interactive.Telemetry -{ - public class TelemetryCommonProperties - { - private readonly string _productVersion; - - public TelemetryCommonProperties( - string productVersion, - Func hasher = null, - Func getMACAddress = null, - IDockerContainerDetector dockerContainerDetector = null, - IUserLevelCacheWriter userLevelCacheWriter = null) - { - _productVersion = productVersion; - _hasher = hasher ?? Sha256Hasher.Hash; - _getMACAddress = getMACAddress ?? MacAddressGetter.GetMacAddress; - _dockerContainerDetector = dockerContainerDetector ?? new DockerContainerDetectorForTelemetry(); - _userLevelCacheWriter = userLevelCacheWriter ?? new UserLevelCacheWriter(productVersion); - } - - private readonly IUserLevelCacheWriter _userLevelCacheWriter; - private readonly IDockerContainerDetector _dockerContainerDetector; - private readonly Func _hasher; - private readonly Func _getMACAddress; - private const string OSVersion = "OS Version"; - private const string OSPlatform = "OS Platform"; - private const string RuntimeId = "Runtime Id"; - private const string ProductVersion = "Product Version"; - private const string DockerContainer = "Docker Container"; - private const string MachineId = "Machine ID"; - private const string KernelVersion = "Kernel Version"; - - private const string MachineIdCacheKey = "MachineId"; - private const string IsDockerContainerCacheKey = "IsDockerContainer"; - - public Dictionary GetTelemetryCommonProperties() - { - return new Dictionary - { - {OSVersion, RuntimeEnvironment.OperatingSystemVersion}, - {OSPlatform, RuntimeEnvironment.OperatingSystemPlatform.ToString()}, - {RuntimeId, RuntimeEnvironment.GetRuntimeIdentifier()}, - {ProductVersion, _productVersion}, - {DockerContainer, IsDockerContainer()}, - {MachineId, GetMachineId()}, - {KernelVersion, GetKernelVersion()} - }; - } - - private string GetMachineId() - { - return _userLevelCacheWriter.RunWithCache(MachineIdCacheKey, () => - { - var macAddress = _getMACAddress(); - if (macAddress != null) - { - return _hasher(macAddress); - } - else - { - return Guid.NewGuid().ToString(); - } - }); - } - - private string IsDockerContainer() - { - return _userLevelCacheWriter.RunWithCache(IsDockerContainerCacheKey, () => - { - return _dockerContainerDetector.IsDockerContainer().ToString("G"); - }); - } - - /// - /// Returns a string identifying the OS kernel. - /// For Unix this currently comes from "uname -srv". - /// For Windows this currently comes from RtlGetVersion(). - /// - /// Here are some example values: - /// - /// Alpine.36 Linux 4.9.60-linuxkit-aufs #1 SMP Mon Nov 6 16:00:12 UTC 2017 - /// Centos.73 Linux 3.10.0-514.26.2.el7.x86_64 #1 SMP Tue Jul 4 15:04:05 UTC 2017 - /// Debian.87 Linux 3.16.0-4-amd64 #1 SMP Debian 3.16.39-1+deb8u2 (2017-03-07) - /// Debian.90 Linux 4.9.0-2-amd64 #1 SMP Debian 4.9.18-1 (2017-03-30) - /// fedora.25 Linux 4.11.3-202.fc25.x86_64 #1 SMP Mon Jun 5 16:38:21 UTC 2017 - /// Fedora.26 Linux 4.14.15-200.fc26.x86_64 #1 SMP Wed Jan 24 04:26:15 UTC 2018 - /// Fedora.27 Linux 4.14.14-300.fc27.x86_64 #1 SMP Fri Jan 19 13:19:54 UTC 2018 - /// OpenSuse.423 Linux 4.4.104-39-default #1 SMP Thu Jan 4 08:11:03 UTC 2018 (7db1912) - /// RedHat.69 Linux 2.6.32-696.20.1.el6.x86_64 #1 SMP Fri Jan 12 15:07:59 EST 2018 - /// RedHat.72 Linux 3.10.0-514.21.1.el7.x86_64 #1 SMP Sat Apr 22 02:41:35 EDT 2017 - /// RedHat.73 Linux 3.10.0-514.21.1.el7.x86_64 #1 SMP Sat Apr 22 02:41:35 EDT 2017 - /// SLES.12 Linux 4.4.103-6.38-default #1 SMP Mon Dec 25 20:44:33 UTC 2017 (e4b9067) - /// suse.422 Linux 4.4.49-16-default #1 SMP Sun Feb 19 17:40:35 UTC 2017 (70e9954) - /// Ubuntu.1404 Linux 3.19.0-65-generic #73~14.04.1-Ubuntu SMP Wed Jun 29 21:05:22 UTC 2016 - /// Ubuntu.1604 Linux 4.13.0-1005-azure #7-Ubuntu SMP Mon Jan 8 21:37:36 UTC 2018 - /// Ubuntu.1604.WSL Linux 4.4.0-43-Microsoft #1-Microsoft Wed Dec 31 14:42:53 PST 2014 - /// Ubuntu.1610 Linux 4.8.0-45-generic #48-Ubuntu SMP Fri Mar 24 11:46:39 UTC 2017 - /// Ubuntu.1704 Linux 4.10.0-19-generic #21-Ubuntu SMP Thu Apr 6 17:04:57 UTC 2017 - /// Ubuntu.1710 Linux 4.13.0-25-generic #29-Ubuntu SMP Mon Jan 8 21:14:41 UTC 2018 - /// OSX1012 Darwin 16.7.0 Darwin Kernel Version 16.7.0: Thu Jan 11 22:59:40 PST 2018; root:xnu-3789.73.8~1/RELEASE_X86_64 - /// OSX1013 Darwin 17.4.0 Darwin Kernel Version 17.4.0: Sun Dec 17 09:19:54 PST 2017; root:xnu-4570.41.2~1/RELEASE_X86_64 - /// Windows.10 Microsoft Windows 10.0.14393 - /// Windows.10.Core Microsoft Windows 10.0.14393 - /// Windows.10.Nano Microsoft Windows 10.0.14393 - /// Windows.7 Microsoft Windows 6.1.7601 S - /// Windows.81 Microsoft Windows 6.3.9600 - /// - private static string GetKernelVersion() - { - return RuntimeInformation.OSDescription; - } - } -} diff --git a/Microsoft.DotNet.Interactive.Telemetry/TelemetryExtensions.cs b/Microsoft.DotNet.Interactive.Telemetry/TelemetryExtensions.cs deleted file mode 100644 index 49afb2f33..000000000 --- a/Microsoft.DotNet.Interactive.Telemetry/TelemetryExtensions.cs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -namespace Microsoft.DotNet.Interactive.Telemetry -{ - public static class TelemetryExtensions - { - public static void SendFiltered(this ITelemetry telemetry, ITelemetryFilter filter, object o) - { - if (o == null || !telemetry.Enabled || filter == null) - { - return; - } - - foreach (ApplicationInsightsEntryFormat entry in filter.Filter(o)) - { - telemetry.TrackEvent(entry.EventName, entry.Properties, entry.Measurements); - } - } - } -} diff --git a/Microsoft.DotNet.Interactive.Telemetry/TelemetryFilter.cs b/Microsoft.DotNet.Interactive.Telemetry/TelemetryFilter.cs deleted file mode 100644 index 8f3ae73f5..000000000 --- a/Microsoft.DotNet.Interactive.Telemetry/TelemetryFilter.cs +++ /dev/null @@ -1,274 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.CommandLine.Parsing; -using System.Linq; - -namespace Microsoft.DotNet.Interactive.Telemetry -{ - public sealed class TelemetryFilter : ITelemetryFilter - { - private readonly Func _hash; - - public TelemetryFilter(Func hash) - { - _hash = hash ?? throw new ArgumentNullException(nameof(hash)); - } - - public IEnumerable Filter(object objectToFilter) - { - if (objectToFilter == null) - { - return new List(); - } - - var result = new List(); - - if (objectToFilter is ParseResult parseResult) - { - var mainCommand = - // The first command will in the tokens collection will be our main command. - parseResult.Tokens?.FirstOrDefault(x => x.Type == TokenType.Command); - var mainCommandName = mainCommand?.Value; - - var tokens = - parseResult.Tokens - // skip directives as we do not care right now - ?.Where(x => x.Type != TokenType.Directive) - .SkipWhile(x => x != mainCommand) - // We skip one to not include the main command as part of the collection we want to filter. - .Skip(1); - - var entryItems = FilterCommand(mainCommandName, tokens, parseResult.CommandResult); - - if (entryItems != null) - { - result.Add(CreateEntry(entryItems)); - } - } - - return result.Select(r => r.WithAppliedToPropertiesValue(_hash)).ToList(); - } - - private Nullable>> - FilterCommand(string commandName, IEnumerable tokens, CommandResult commandResult) - { - if (commandName == null || tokens == null) - { - return null; - } - - return Rules.Select(rule => - { - if (rule.CommandName == commandName) - { - return TryMatchRule(rule, tokens, commandResult); - } - else - { - return null; - } - }).FirstOrDefault(x => x != null); - } - - /// - /// Tries to see if the tokens follow or match the specified command rule. - /// - ImmutableArray>? - TryMatchRule(CommandRule rule, IEnumerable tokens, CommandResult commandResult) - { - var entryItems = ImmutableArray.CreateBuilder>(); - entryItems.Add(new KeyValuePair("verb", rule.CommandName)); - - // Filter out option tokens as we query the command result for them when processing a rule. - var tokenQueue = new Queue(tokens.Where(x => x.Type != TokenType.Option)); - Token NextToken() - { - if (tokenQueue.TryDequeue(out var firstToken)) - { - return firstToken; - } - else - { - return null; - } - } - - var currentToken = NextToken(); - - // We have a valid rule so far. - var passed = true; - - foreach (var item in rule.Items) - { - // Stop checking items since our rule already failed. - if (!passed) - { - break; - } - - switch (item) - { - case OptionItem optItem: - { - var optionValue = commandResult.OptionResult(optItem.Option)?.Tokens?.FirstOrDefault()?.Value; - if (optionValue != null && optItem.Values.Contains(optionValue)) - { - entryItems.Add(new KeyValuePair(optItem.EntryKey, optionValue)); - } - else - { - passed = false; - } - break; - } - case ArgumentItem argItem: - { - if (argItem.TokenType == currentToken?.Type && - argItem.Value == currentToken?.Value) - { - entryItems.Add(new KeyValuePair(argItem.EntryKey, argItem.Value)); - currentToken = NextToken(); - } - else if (argItem.IsOptional) - { - currentToken = NextToken(); - } - else - { - passed = false; - } - break; - } - case IgnoreItem ignoreItem: - { - if (ignoreItem.TokenType == currentToken?.Type) - { - currentToken = NextToken(); - } - else if (ignoreItem.IsOptional) - { - currentToken = NextToken(); - } - else - { - passed = false; - } - break; - } - default: - passed = false; - break; - } - } - - if (passed) - { - return entryItems.ToImmutable(); - } - else - { - return null; - } - } - - private ApplicationInsightsEntryFormat CreateEntry(IEnumerable> entryItems) - { - return new ApplicationInsightsEntryFormat("command", new Dictionary(entryItems)); - } - - private abstract class CommandRuleItem - { - } - - private class OptionItem : CommandRuleItem - { - public OptionItem(string option, string[] values, string entryKey) - { - Option = option; - Values = values.ToImmutableArray(); - EntryKey = entryKey; - } - - public string Option { get; } - public ImmutableArray Values { get; } - public string EntryKey { get; } - } - - private class ArgumentItem : CommandRuleItem - { - public ArgumentItem(string value, TokenType type, string entryKey, bool isOptional) - { - Value = value; - TokenType = type; - EntryKey = entryKey; - IsOptional = isOptional; - } - - public string Value { get; } - public TokenType TokenType { get; } - public string EntryKey { get; } - public bool IsOptional { get; } - } - - private class IgnoreItem : CommandRuleItem - { - public IgnoreItem(TokenType type, bool isOptional) - { - TokenType = type; - IsOptional = isOptional; - } - - public TokenType TokenType { get; } - public bool IsOptional { get; } - } - - private class CommandRule - { - public CommandRule(string commandName, IEnumerable items) - { - CommandName = commandName; - Items = ImmutableArray.CreateRange(items); - } - - public string CommandName { get; } - public ImmutableArray Items { get; } - } - - private static CommandRuleItem Option(string option, string[] values, string entryKey) - { - return new OptionItem(option, values, entryKey); - } - - private static CommandRuleItem Arg(string value, TokenType type, string entryKey, bool isOptional) - { - return new ArgumentItem(value, type, entryKey, isOptional); - } - - private static CommandRuleItem Ignore(TokenType type, bool isOptional) - { - return new IgnoreItem(type, isOptional); - } - - private static CommandRule[] Rules => new CommandRule[] - { - new CommandRule("jupyter", - new CommandRuleItem[]{ - Arg("install", TokenType.Command, "subcommand", isOptional: false) }), - - new CommandRule("jupyter", - new CommandRuleItem[]{ - Option("--default-kernel", new string[]{ "csharp", "fsharp" }, "default-kernel"), - Ignore(TokenType.Argument, isOptional: true) // connection file - }), - - new CommandRule("kernel-server", - new CommandRuleItem[]{ - Option("--default-kernel", new string[]{ "csharp", "fsharp" }, "default-kernel") - }) - }; - } -} diff --git a/Microsoft.DotNet.Interactive.Telemetry/UserLevelCacheWriter.cs b/Microsoft.DotNet.Interactive.Telemetry/UserLevelCacheWriter.cs deleted file mode 100644 index ea7bbd557..000000000 --- a/Microsoft.DotNet.Interactive.Telemetry/UserLevelCacheWriter.cs +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.IO; - -namespace Microsoft.DotNet.Interactive.Telemetry -{ - public sealed class UserLevelCacheWriter : IUserLevelCacheWriter - { - private readonly string _productVersion; - private readonly string _dotnetTryUserProfileFolderPath; - private readonly Func _fileExists; - private readonly Func _directoryExists; - private readonly Action _createDirectory; - private readonly Action _writeAllText; - private readonly Func _readAllText; - - public UserLevelCacheWriter(string productVersion) : - this( - productVersion, - Paths.DotnetUserProfileFolderPath, - File.Exists, - Directory.Exists, - path => Directory.CreateDirectory(path), - File.WriteAllText, - File.ReadAllText) - { - } - - public UserLevelCacheWriter( - string productVersion, - string dotnetTryUserProfileFolderPath, - Func fileExists, - Func directoryExists, - Action createDirectory, - Action writeAllText, - Func readAllText) - { - _productVersion = productVersion; - _dotnetTryUserProfileFolderPath = dotnetTryUserProfileFolderPath; - _fileExists = fileExists; - _directoryExists = directoryExists; - _createDirectory = createDirectory; - _writeAllText = writeAllText; - _readAllText = readAllText; - } - - public string RunWithCache(string cacheKey, Func getValueToCache) - { - var cacheFilepath = GetCacheFilePath(cacheKey); - try - { - if (!_fileExists(cacheFilepath)) - { - if (!_directoryExists(_dotnetTryUserProfileFolderPath)) - { - _createDirectory(_dotnetTryUserProfileFolderPath); - } - - var runResult = getValueToCache(); - - _writeAllText(cacheFilepath, runResult); - return runResult; - } - else - { - return _readAllText(cacheFilepath); - } - } - catch (Exception ex) - { - if (ex is UnauthorizedAccessException - || ex is PathTooLongException - || ex is IOException) - { - return getValueToCache(); - } - - throw; - } - } - - private string GetCacheFilePath(string cacheKey) - { - return Path.Combine(_dotnetTryUserProfileFolderPath, $"{_productVersion}_{cacheKey}.dotnetTryUserLevelCache"); - } - } -} diff --git a/Microsoft.DotNet.Interactive/Utility/AddPackageResult.cs b/Microsoft.DotNet.Interactive/Utility/AddPackageResult.cs deleted file mode 100644 index fb0df1d50..000000000 --- a/Microsoft.DotNet.Interactive/Utility/AddPackageResult.cs +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.Collections.Generic; -using System.Linq; - -namespace Microsoft.DotNet.Interactive.Utility -{ - public class AddPackageResult : CommandLineResult - { - public AddPackageResult(int exitCode, IReadOnlyCollection output = null, IReadOnlyCollection error = null) : base(exitCode, output, error) - { - if (exitCode == 0) - { - InstalledVersion = GetInstalledVersion(output); - } - - DetailedErrors = GetDetailedErrors(output, error); - } - - public string InstalledVersion { get; } - - public IEnumerable DetailedErrors { get; } - - private IEnumerable GetDetailedErrors(IReadOnlyCollection output, IReadOnlyCollection error) - { - return output.Concat(error).Where(l => l.StartsWith("error:")); - } - - private string GetInstalledVersion(IReadOnlyCollection output) - { - foreach (var line in output) - { - if (line.StartsWith("info : PackageReference for package")) - { - // Successful installation will print a message like - // @"info : PackageReference for package 'xunit' version '2.4.1' added to file 'E:\testdll\testdll.csproj'."; - var quote1 = line.IndexOf('\''); - if (quote1 == -1) - { - continue; - } - - var quote2 = line.IndexOf('\'', quote1 + 1); - var quote3 = line.IndexOf('\'', quote2 + 1); - var quote4 = line.IndexOf('\'', quote3 + 1); - var start = quote3 + 1; - var length = quote4 - start; - return line.Substring(start, length); - } - } - - return ""; - } - } -} \ No newline at end of file diff --git a/Microsoft.DotNet.Interactive/Utility/CommandLine.cs b/Microsoft.DotNet.Interactive/Utility/CommandLine.cs deleted file mode 100644 index 19b856ad9..000000000 --- a/Microsoft.DotNet.Interactive/Utility/CommandLine.cs +++ /dev/null @@ -1,194 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Runtime.CompilerServices; -using System.Text; -using System.Threading.Tasks; -using Pocket; - -namespace Microsoft.DotNet.Interactive.Utility -{ - public static class CommandLine - { - public static Task Execute( - FileInfo exePath, - string args, - DirectoryInfo workingDir = null) => - Execute(exePath.FullName, - args, - workingDir); - - public static async Task Execute( - string command, - string args, - DirectoryInfo workingDir = null, - TimeSpan? timeout = null) - { - args ??= ""; - - var stdOut = new StringBuilder(); - var stdErr = new StringBuilder(); - - using (var operation = ConfirmOnExit(command, args)) - using (var process = StartProcess( - command, - args, - workingDir, - output: data => - { - stdOut.AppendLine(data); - }, - error: data => - { - stdErr.AppendLine(data); - })) - { - var exitCode = await process.Complete().Timeout(timeout ?? TimeSpan.FromMinutes(1)); - - var output = stdOut.Replace("\r\n", "\n").ToString().Split('\n'); - - var error = stdErr.Replace("\r\n", "\n").ToString().Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries); - - if (error.All(string.IsNullOrWhiteSpace)) - { - error = null; - } - - var result = new CommandLineResult( - exitCode: exitCode, - output: output, - error: error); - - if (exitCode == 0) - { - operation.Succeed( - "> {command} {args} -> exited with {code}", - process.StartInfo.FileName, - process.StartInfo.Arguments, - process.ExitCode); - } - else - { - operation.Fail(new CommandLineInvocationException(result)); - } - - return result; - } - } - - public static async Task Complete( - this Process process) => - await Task.Run(() => - { - process.WaitForExit(); - - return process.ExitCode; - }); - - public static async Task Timeout( - this Task source, - TimeSpan timeout) - { - if (await Task.WhenAny( - source, - Task.Delay(timeout)) != source) - { - throw new TimeoutException(); - } - - return await source; - } - - public static Process StartProcess( - string command, - string args, - DirectoryInfo workingDir, - Action output = null, - Action error = null, - params (string key, string value)[] environmentVariables) - { - using (var operation = Log.OnEnterAndExit()) - { - args ??= ""; - - var process = new Process - { - StartInfo = - { - Arguments = args, - FileName = command, - RedirectStandardError = true, - RedirectStandardOutput = true, - RedirectStandardInput = true, - WorkingDirectory = workingDir?.FullName ?? string.Empty, - StandardOutputEncoding = Encoding.UTF8 - } - }; - - operation.Info("> {process} {args}", command, args); - - if (environmentVariables?.Length > 0) - { - foreach (var tuple in environmentVariables) - { - operation.Trace("Adding environment variable {tuple}", tuple); - process.StartInfo.Environment.Add(tuple.key, tuple.value); - } - } - - if (output != null) - { - process.OutputDataReceived += (sender, eventArgs) => - { - if (eventArgs.Data != null) - { - output(eventArgs.Data); - } - }; - } - - if (error != null) - { - process.ErrorDataReceived += (sender, eventArgs) => - { - if (eventArgs.Data != null) - { - error(eventArgs.Data); - } - }; - } - - process.Start(); - - process.BeginOutputReadLine(); - process.BeginErrorReadLine(); - - return process; - } - } - - public static string AppendArgs(this string initial, string append = null) => - string.IsNullOrWhiteSpace(append) - ? initial - : $"{initial} {append}"; - - private static ConfirmationLogger ConfirmOnExit( - object command, - string args, - [CallerMemberName] string operationName = null) - { - return new ConfirmationLogger( - operationName: operationName, - category: Log.Category, - message: "> {command} {args}", - args: new[] { command, args }, - logOnStart: true); - } - - private static Logger Log { get; } = new Logger(nameof(CommandLine)); - } -} diff --git a/Microsoft.DotNet.Interactive/Utility/CommandLineInvocationException.cs b/Microsoft.DotNet.Interactive/Utility/CommandLineInvocationException.cs deleted file mode 100644 index 85cd3afc2..000000000 --- a/Microsoft.DotNet.Interactive/Utility/CommandLineInvocationException.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; - -namespace Microsoft.DotNet.Interactive.Utility -{ - public class CommandLineInvocationException : Exception - { - public CommandLineInvocationException(CommandLineResult result, string message = null) : base( - $"{message}{Environment.NewLine}Exit code {result.ExitCode}: {string.Join("\n", result.Error)}".Trim()) - { - } - } -} diff --git a/Microsoft.DotNet.Interactive/Utility/CommandLineResult.cs b/Microsoft.DotNet.Interactive/Utility/CommandLineResult.cs deleted file mode 100644 index 1a6626c35..000000000 --- a/Microsoft.DotNet.Interactive/Utility/CommandLineResult.cs +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Microsoft.DotNet.Interactive.Utility -{ - public class CommandLineResult - { - public CommandLineResult( - int exitCode, - IReadOnlyCollection output = null, - IReadOnlyCollection error = null) - { - ExitCode = exitCode; - Output = output ?? Array.Empty(); - Error = error ?? Array.Empty(); - } - - public int ExitCode { get; } - - public IReadOnlyCollection Output { get; } - - public IReadOnlyCollection Error { get; } - - public void ThrowOnFailure(string message = null) - { - if (ExitCode != 0) - { - throw new CommandLineInvocationException( - this, - $"{message ?? string.Empty}{Environment.NewLine}{string.Join(Environment.NewLine, Error.Concat(Output))}"); - } - } - } -} \ No newline at end of file diff --git a/Microsoft.DotNet.Interactive/Utility/ConsoleOutput.cs b/Microsoft.DotNet.Interactive/Utility/ConsoleOutput.cs deleted file mode 100644 index c78df162b..000000000 --- a/Microsoft.DotNet.Interactive/Utility/ConsoleOutput.cs +++ /dev/null @@ -1,422 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Reactive.Disposables; -using System.Reactive.Subjects; -using System.Text; -using System.Threading; -using System.Threading.Tasks; - -namespace Microsoft.DotNet.Interactive.Utility -{ - public class ConsoleOutput : IDisposable - { - private TextWriter _originalOutputWriter; - private TextWriter _originalErrorWriter; - private readonly TrackingStringWriter _outputWriter = new TrackingStringWriter(); - private readonly TrackingStringWriter _errorWriter = new TrackingStringWriter(); - - private const int NOT_DISPOSED = 0; - private const int DISPOSED = 1; - - private int _alreadyDisposed = NOT_DISPOSED; - - private static readonly SemaphoreSlim _consoleLock = new SemaphoreSlim(1, 1); - - private ConsoleOutput() - { - } - - public static async Task Capture() - { - var redirector = new ConsoleOutput(); - await _consoleLock.WaitAsync(); - - try - { - redirector._originalOutputWriter = Console.Out; - redirector._originalErrorWriter = Console.Error; - - Console.SetOut(redirector._outputWriter); - Console.SetError(redirector._errorWriter); - } - catch - { - _consoleLock.Release(); - throw; - } - - return redirector; - } - - public IDisposable SubscribeToStandardOutput(Action action) - { - return _outputWriter.Subscribe(action); - } - - public IDisposable SubscribeToStandardError(Action action) - { - return _errorWriter.Subscribe(action); - } - - public void Dispose() - { - if (Interlocked.CompareExchange(ref _alreadyDisposed, DISPOSED, NOT_DISPOSED) == NOT_DISPOSED) - { - if (_originalOutputWriter != null) - { - Console.SetOut(_originalOutputWriter); - } - - if (_originalErrorWriter != null) - { - Console.SetError(_originalErrorWriter); - } - - _consoleLock.Release(); - } - } - - public string StandardOutput => _outputWriter.ToString(); - - public string StandardError => _errorWriter.ToString(); - - public void Clear() - { - _outputWriter.GetStringBuilder().Clear(); - _errorWriter.GetStringBuilder().Clear(); - } - - public bool IsEmpty() => _outputWriter.ToString().Length == 0 && _errorWriter.ToString().Length == 0; - - private class TrackingStringWriter : StringWriter, IObservable - { - private class Region - { - public int Start { get; set; } - public int Length { get; set; } - } - - private readonly Subject _writeEvents = new Subject(); - private readonly List _regions = new List(); - private bool _trackingWriteOperation; - private int _observerCount; - - private readonly CompositeDisposable _disposable; - - public TrackingStringWriter() - { - _disposable = new CompositeDisposable - { - _writeEvents - }; - } - - protected override void Dispose(bool disposing) - { - if (disposing) - { - _disposable.Dispose(); - } - - base.Dispose(disposing); - } - - public bool WriteOccurred { get; set; } - - public override void Write(char value) - { - TrackWriteOperation(() => base.Write(value)); - } - - private void TrackWriteOperation(Action action) - { - WriteOccurred = true; - if (_trackingWriteOperation) - { - action(); - return; - } - - _trackingWriteOperation = true; - var sb = base.GetStringBuilder(); - - var region = new Region - { - Start = sb.Length - }; - - _regions.Add(region); - - action(); - - region.Length = sb.Length - region.Start; - _trackingWriteOperation = false; - PumpStringIfObserved(sb, region); - } - - private void PumpStringIfObserved(StringBuilder sb, Region region) - { - if (_observerCount > 0) - { - _writeEvents.OnNext(sb.ToString(region.Start, region.Length)); - } - } - - private async Task TrackWriteOperationAsync(Func action) - { - WriteOccurred = true; - if (_trackingWriteOperation) - { - await action(); - return; - } - - _trackingWriteOperation = true; - var sb = base.GetStringBuilder(); - - var region = new Region - { - Start = sb.Length - }; - - _regions.Add(region); - - await action(); - - region.Length = sb.Length - region.Start; - - _trackingWriteOperation = false; - - PumpStringIfObserved(sb, region); - } - - public override void Write(char[] buffer, int index, int count) - { - TrackWriteOperation(() => base.Write(buffer, index, count)); - } - - public override void Write(string value) - { - TrackWriteOperation(() => base.Write(value)); - } - - public override Task WriteAsync(char value) - { - return TrackWriteOperationAsync(() => base.WriteAsync(value)); - } - - public override Task WriteAsync(char[] buffer, int index, int count) - { - return TrackWriteOperationAsync(() => base.WriteAsync(buffer, index, count)); - } - - public override Task WriteAsync(string value) - { - return TrackWriteOperationAsync(() => base.WriteAsync(value)); - } - - public override Task WriteLineAsync(char value) - { - return TrackWriteOperationAsync(() => base.WriteLineAsync(value)); - } - - public override Task WriteLineAsync(char[] buffer, int index, int count) - { - return TrackWriteOperationAsync(() => base.WriteLineAsync(buffer, index, count)); - } - - public override Task WriteLineAsync(string value) - { - return TrackWriteOperationAsync(() => base.WriteLineAsync(value)); - } - - public override void Write(bool value) - { - TrackWriteOperation(() => base.Write(value)); - } - - public override void Write(char[] buffer) - { - TrackWriteOperation(() => base.Write(buffer)); - } - - public override void Write(decimal value) - { - TrackWriteOperation(() => base.Write(value)); - } - - public override void Write(double value) - { - TrackWriteOperation(() => base.Write(value)); - } - - public override void Write(int value) - { - TrackWriteOperation(() => base.Write(value)); - } - - public override void Write(long value) - { - TrackWriteOperation(() => base.Write(value)); - } - - public override void Write(object value) - { - TrackWriteOperation(() => base.Write(value)); - } - - public override void Write(float value) - { - TrackWriteOperation(() => base.Write(value)); - } - - public override void Write(string format, object arg0) - { - TrackWriteOperation(() => base.Write(format, arg0)); - } - - public override void Write(string format, object arg0, object arg1) - { - TrackWriteOperation(() => base.Write(format, arg0, arg1)); - } - - public override void Write(string format, object arg0, object arg1, object arg2) - { - TrackWriteOperation(() => base.Write(format, arg0, arg1, arg2)); - } - - public override void Write(string format, params object[] arg) - { - TrackWriteOperation(() => base.Write(format, arg)); - } - - public override void Write(uint value) - { - TrackWriteOperation(() => base.Write(value)); - } - - public override void Write(ulong value) - { - TrackWriteOperation(() => base.Write(value)); - } - - public override void WriteLine() - { - TrackWriteOperation(() => base.WriteLine()); - } - - public override void WriteLine(bool value) - { - TrackWriteOperation(() => base.WriteLine(value)); - } - - public override void WriteLine(char value) - { - TrackWriteOperation(() => base.WriteLine(value)); - } - - public override void WriteLine(char[] buffer) - { - TrackWriteOperation(() => base.WriteLine(buffer)); - } - - public override void WriteLine(char[] buffer, int index, int count) - { - TrackWriteOperation(() => base.WriteLine(buffer, index, count)); - } - - public override void WriteLine(decimal value) - { - TrackWriteOperation(() => base.WriteLine(value)); - } - - public override void WriteLine(double value) - { - TrackWriteOperation(() => base.WriteLine(value)); - } - - public override void WriteLine(int value) - { - TrackWriteOperation(() => base.WriteLine(value)); - } - - public override void WriteLine(long value) - { - TrackWriteOperation(() => base.WriteLine(value)); - } - - public override void WriteLine(object value) - { - TrackWriteOperation(() => base.WriteLine(value)); - } - - public override void WriteLine(float value) - { - TrackWriteOperation(() => base.WriteLine(value)); - } - - public override void WriteLine(string value) - { - TrackWriteOperation(() => base.WriteLine(value)); - } - - public override void WriteLine(string format, object arg0) - { - TrackWriteOperation(() => base.WriteLine(format, arg0)); - } - - public override void WriteLine(string format, object arg0, object arg1) - { - TrackWriteOperation(() => base.WriteLine(format, arg0, arg1)); - } - - public override void WriteLine(string format, object arg0, object arg1, object arg2) - { - TrackWriteOperation(() => base.WriteLine(format, arg0, arg1, arg2)); - } - - public override void WriteLine(string format, params object[] arg) - { - TrackWriteOperation(() => base.WriteLine(format, arg)); - } - - public override void WriteLine(uint value) - { - TrackWriteOperation(() => base.WriteLine(value)); - } - - public override void WriteLine(ulong value) - { - TrackWriteOperation(() => base.WriteLine(value)); - } - - public override Task WriteLineAsync() - { - return TrackWriteOperationAsync(() => base.WriteLineAsync()); - } - - public IEnumerable Writes() - { - var src = base.GetStringBuilder().ToString(); - foreach (var region in _regions) - { - yield return src.Substring(region.Start, region.Length); - } - } - - public IDisposable Subscribe(IObserver observer) - { - Interlocked.Increment(ref _observerCount); - return new CompositeDisposable - { - Disposable.Create(() => Interlocked.Decrement(ref _observerCount)), - _writeEvents.Subscribe(observer) - }; - } - } - } -} \ No newline at end of file diff --git a/Microsoft.DotNet.Interactive/Utility/DirectoryUtility.cs b/Microsoft.DotNet.Interactive/Utility/DirectoryUtility.cs deleted file mode 100644 index 18a040c62..000000000 --- a/Microsoft.DotNet.Interactive/Utility/DirectoryUtility.cs +++ /dev/null @@ -1,89 +0,0 @@ -using System; -using System.IO; -using System.Runtime.CompilerServices; - -namespace Microsoft.DotNet.Interactive.Utility -{ - public static class DirectoryUtility - { - private static readonly object CreateDirectoryLock = new object(); - - private static readonly DirectoryInfo _defaultDirectory = new DirectoryInfo( - Path.Combine( - Paths.UserProfile, - ".net-interactive-tests")); - - public static DirectoryInfo CreateDirectory( - [CallerMemberName] string folderNameStartsWith = null, - DirectoryInfo parentDirectory = null) - { - if (string.IsNullOrWhiteSpace(folderNameStartsWith)) - { - throw new ArgumentException("Value cannot be null or whitespace.", nameof(folderNameStartsWith)); - } - - parentDirectory = parentDirectory ?? _defaultDirectory; - - DirectoryInfo created; - - lock (CreateDirectoryLock) - { - if (!parentDirectory.Exists) - { - parentDirectory.Create(); - } - - var existingFolders = parentDirectory.GetDirectories($"{folderNameStartsWith}.*"); - - created = parentDirectory.CreateSubdirectory($"{folderNameStartsWith}.{existingFolders.Length + 1}"); - } - - return created; - } - - public static void DeleteFileSystemObject(this string path) - { - if (Directory.Exists(path)) - { - Directory.Delete(path, recursive: true); - } - else if (File.Exists(path)) - { - File.Delete(path); - } - else - { - throw new ArgumentException($"Couldn't find a file or directory called {path}"); - } - } - - public static void Populate( - this DirectoryInfo directory, - params (string relativePath, string content)[] contents) - { - EnsureExists(directory); - - foreach (var t in contents) - { - File.WriteAllText( - Path.Combine(directory.FullName, t.relativePath), - t.content); - } - } - - private static DirectoryInfo EnsureExists(this DirectoryInfo directory) - { - if (directory == null) - { - throw new ArgumentNullException(nameof(directory)); - } - - if (!directory.Exists) - { - directory.Create(); - } - - return directory; - } - } -} \ No newline at end of file diff --git a/Microsoft.DotNet.Interactive/Utility/DisposableDirectory.cs b/Microsoft.DotNet.Interactive/Utility/DisposableDirectory.cs deleted file mode 100644 index 7f9aeae6e..000000000 --- a/Microsoft.DotNet.Interactive/Utility/DisposableDirectory.cs +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.IO; - -namespace Microsoft.DotNet.Interactive.Utility -{ - public class DisposableDirectory : IDisposable - { - public DisposableDirectory(DirectoryInfo directory) - { - Directory = directory; - } - - public static DisposableDirectory Create() - { - var tempDir = System.IO.Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), Path.GetRandomFileName())); - return new DisposableDirectory(tempDir); - } - - public DirectoryInfo Directory { get; } - - public void Dispose() - { - Directory.Delete(recursive: true); - } - } -} diff --git a/Microsoft.DotNet.Interactive/Utility/Dotnet.cs b/Microsoft.DotNet.Interactive/Utility/Dotnet.cs deleted file mode 100644 index 43dbd6549..000000000 --- a/Microsoft.DotNet.Interactive/Utility/Dotnet.cs +++ /dev/null @@ -1,173 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Threading.Tasks; - -namespace Microsoft.DotNet.Interactive.Utility -{ - public class Dotnet - { - protected readonly DirectoryInfo _workingDirectory; - - public Dotnet(DirectoryInfo workingDirectory = null) - { - _workingDirectory = workingDirectory ?? - new DirectoryInfo(Directory.GetCurrentDirectory()); - } - - public Task New(string templateName, string args = null) - { - if (string.IsNullOrWhiteSpace(templateName)) - { - throw new ArgumentException("Value cannot be null or whitespace.", nameof(templateName)); - } - - return Execute($@"new ""{templateName}"" {args}"); - } - - public async Task AddPackage(string packageId, string version = null) - { - var versionArg = string.IsNullOrWhiteSpace(version) - ? "" - : $"--version {version}"; - var executionResult = await Execute($"add package {versionArg} {packageId}"); - return new AddPackageResult(executionResult.ExitCode, executionResult.Output, executionResult.Error); - } - - public Task AddReference(FileInfo projectToReference) - { - return Execute($@"add reference ""{projectToReference.FullName}"""); - } - - public Task Build(string args = null) => - Execute("build".AppendArgs(args)); - - public Task Clean() => - Execute("clean"); - - public Task Execute(string args) => - CommandLine.Execute( - Path, - args, - _workingDirectory); - - public Process StartProcess(string args, Action output = null, Action error = null) => - CommandLine.StartProcess( - Path.FullName, - args, - _workingDirectory, - output, - error); - - public Task Publish(string args = null) => - Execute("publish".AppendArgs(args)); - - public Task VSTest(string args) => - Execute("vstest".AppendArgs(args)); - - public Task ToolInstall( - string packageName, - DirectoryInfo toolPath, - string addSource = null, - string version = null) - { - if (string.IsNullOrWhiteSpace(packageName)) - { - throw new ArgumentException("Value cannot be null or whitespace.", nameof(packageName)); - } - - var versionArg = version != null ? $"--version {version}" : ""; - - var args = $@"{packageName} --tool-path ""{toolPath.FullName.TrimTrailingSeparators()}"" {versionArg}"; - - if (addSource != null) - { - args += $@" --add-source ""{addSource}"""; - } - - return Execute("tool install".AppendArgs(args)); - } - - public async Task> ToolList(DirectoryInfo directory) - { - var result = await Execute("tool list".AppendArgs($@"--tool-path ""{directory.FullName}""")); - if (result.ExitCode != 0) - { - return Enumerable.Empty(); - } - - // Output of dotnet tool list is: - // Package Id Version Commands - // ------------------------------------------- - // dotnettry.p1 1.0.0 dotnettry.p1 - - string[] separator = new[] { " " }; - return result.Output - .Skip(2) - .Where(s => !string.IsNullOrWhiteSpace(s)) - .Select(s => s.Split(separator, StringSplitOptions.RemoveEmptyEntries)[2]); - } - - public Task Pack(string args = null) => - Execute("pack".AppendArgs(args)); - - private static readonly Lazy _getPath = new Lazy(() => - FindDotnetFromAppContext() ?? - FindDotnetFromPath()); - - public static FileInfo Path => _getPath.Value; - - private static FileInfo FindDotnetFromPath() - { - FileInfo fileInfo = null; - - using (var process = Process.Start("dotnet")) - { - if (process != null) - { - fileInfo = new FileInfo(process.MainModule.FileName); - } - } - - return fileInfo; - } - - private static FileInfo FindDotnetFromAppContext() - { - var muxerFileName = "dotnet".ExecutableName(); - - var fxDepsFile = GetDataFromAppDomain("FX_DEPS_FILE"); - - if (!string.IsNullOrEmpty(fxDepsFile)) - { - var muxerDir = new FileInfo(fxDepsFile).Directory?.Parent?.Parent?.Parent; - - if (muxerDir != null) - { - var muxerCandidate = new FileInfo(System.IO.Path.Combine(muxerDir.FullName, muxerFileName)); - - if (muxerCandidate.Exists) - { - return muxerCandidate; - } - } - } - - return null; - } - - public static string GetDataFromAppDomain(string propertyName) - { - var appDomainType = typeof(object).GetTypeInfo().Assembly?.GetType("System.AppDomain"); - var currentDomain = appDomainType?.GetProperty("CurrentDomain")?.GetValue(null); - var deps = appDomainType?.GetMethod("GetData")?.Invoke(currentDomain, new[] { propertyName }); - return deps as string; - } - } -} diff --git a/Microsoft.DotNet.Interactive/Utility/FileNameUtilities.cs b/Microsoft.DotNet.Interactive/Utility/FileNameUtilities.cs deleted file mode 100644 index 8957ad085..000000000 --- a/Microsoft.DotNet.Interactive/Utility/FileNameUtilities.cs +++ /dev/null @@ -1,190 +0,0 @@ -// adpated from http://source.roslyn.io/#Microsoft.CodeAnalysis/InternalUtilities/FileNameUtilities.cs,c5e9631691356ed7 - -using System.Runtime.InteropServices; - -namespace Microsoft.DotNet.Interactive.Utility -{ - /// - /// Implements a few file name utilities that are needed by the compiler. - /// In general the compiler is not supposed to understand the format of the paths. - /// In rare cases it needs to check if a string is a valid file name or change the extension - /// (embedded resources, netmodules, output name). - /// The APIs are intentionally limited to cover just these rare cases. Do not add more APIs. - /// - public static class FileNameUtilities - { - private const string DirectorySeparatorStr = "\\"; - internal const char DirectorySeparatorChar = '\\'; - internal const char AltDirectorySeparatorChar = '/'; - internal const char VolumeSeparatorChar = ':'; - - /// - /// Returns true if the string represents an unqualified file name. - /// The name may contain any characters but directory and volume separators. - /// - /// Path. - /// - /// True if is a simple file name, false if it is null or includes a directory specification. - /// - internal static bool IsFileName(string path) - { - return IndexOfFileName(path) == 0; - } - - /// - /// Returns the offset in where the dot that starts an extension is, or -1 if the path doesn't have an extension. - /// - /// - /// Returns 0 for path ".goo". - /// Returns -1 for path "goo.". - /// - private static int IndexOfExtension(string path) - { - if (path == null) - { - return -1; - } - - int length = path.Length; - int i = length; - - while (--i >= 0) - { - char c = path[i]; - if (c == '.') - { - if (i != length - 1) - { - return i; - } - - return -1; - } - - if (c == DirectorySeparatorChar || c == AltDirectorySeparatorChar || c == VolumeSeparatorChar) - { - break; - } - } - - return -1; - } - - /// - /// Returns an extension of the specified path string. - /// - /// - /// The same functionality as but doesn't throw an exception - /// if there are invalid characters in the path. - /// - internal static string GetExtension(string path) - { - if (path == null) - { - return null; - } - - int index = IndexOfExtension(path); - return (index >= 0) ? path.Substring(index) : string.Empty; - } - - /// - /// Removes extension from path. - /// - /// - /// Returns "goo" for path "goo.". - /// Returns "goo.." for path "goo...". - /// - private static string RemoveExtension(string path) - { - if (path == null) - { - return null; - } - - int index = IndexOfExtension(path); - if (index >= 0) - { - return path.Substring(0, index); - } - - // trim last ".", if present - if (path.Length > 0 && path[path.Length - 1] == '.') - { - return path.Substring(0, path.Length - 1); - } - - return path; - } - - /// - /// Returns path with the extension changed to . - /// - /// - /// Equivalent of - /// - /// If is null, returns null. - /// If path does not end with an extension, the new extension is appended to the path. - /// If extension is null, equivalent to . - /// - internal static string ChangeExtension(string path, string extension) - { - if (path == null) - { - return null; - } - - var pathWithoutExtension = RemoveExtension(path); - if (extension == null || path.Length == 0) - { - return pathWithoutExtension; - } - - if (extension.Length == 0 || extension[0] != '.') - { - return pathWithoutExtension + "." + extension; - } - - return pathWithoutExtension + extension; - } - - /// - /// Returns the position in given path where the file name starts. - /// - /// -1 if path is null. - internal static int IndexOfFileName(string path) - { - if (path == null) - { - return -1; - } - - for (int i = path.Length - 1; i >= 0; i--) - { - char ch = path[i]; - if (ch == DirectorySeparatorChar || ch == AltDirectorySeparatorChar || ch == VolumeSeparatorChar) - { - return i + 1; - } - } - - return 0; - } - - /// - /// Get file name from path. - /// - /// Unlike doesn't check for invalid path characters. - internal static string GetFileName(string path, bool includeExtension = true) - { - int fileNameStart = IndexOfFileName(path); - var fileName = (fileNameStart <= 0) ? path : path.Substring(fileNameStart); - return includeExtension ? fileName : RemoveExtension(fileName); - } - - public static string ExecutableName(this string withoutExtension) => - RuntimeInformation.IsOSPlatform(OSPlatform.Windows) - ? withoutExtension + ".exe" - : withoutExtension; - } -} \ No newline at end of file diff --git a/Microsoft.DotNet.Interactive/Utility/PathUtilities.cs b/Microsoft.DotNet.Interactive/Utility/PathUtilities.cs deleted file mode 100644 index b29465d85..000000000 --- a/Microsoft.DotNet.Interactive/Utility/PathUtilities.cs +++ /dev/null @@ -1,878 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Runtime.InteropServices; -using System.Text; - -// adapted from http://source.roslyn.io/#System.Reflection.Metadata/System/Reflection/Internal/Utilities/PathUtilities.cs,36b27d7696df4d1e - -namespace Microsoft.DotNet.Interactive.Utility -{ - // Contains path parsing utilities. - // We need our own because System.IO.Path is insufficient for our purposes - // For example we need to be able to work with invalid paths or paths containing wildcards - public static class PathUtilities - { - // We consider '/' a directory separator on Unix like systems. - // On Windows both / and \ are equally accepted. - internal static readonly char DirectorySeparatorChar = IsUnixLikePlatform ? '/' : '\\'; - internal const char AltDirectorySeparatorChar = '/'; - internal const string ParentRelativeDirectory = ".."; - internal const string ThisDirectory = "."; - internal static readonly string DirectorySeparatorStr = new string(DirectorySeparatorChar, 1); - internal const char VolumeSeparatorChar = ':'; - - internal static bool IsUnixLikePlatform => !RuntimeInformation.IsOSPlatform(OSPlatform.Windows); - - /// - /// True if the character is the platform directory separator character or the alternate directory separator. - /// - public static bool IsDirectorySeparator(char c) => c == DirectorySeparatorChar || c == AltDirectorySeparatorChar; - - /// - /// True if the character is any recognized directory separator character. - /// - public static bool IsAnyDirectorySeparator(char c) => c == '\\' || c == '/'; - - /// - /// Removes trailing directory separator characters - /// - /// - /// This will trim the root directory separator: - /// "C:\" maps to "C:", and "/" maps to "" - /// - public static string TrimTrailingSeparators(this string s) - { - int lastSeparator = s.Length; - while (lastSeparator > 0 && IsDirectorySeparator(s[lastSeparator - 1])) - { - lastSeparator = lastSeparator - 1; - } - - if (lastSeparator != s.Length) - { - s = s.Substring(0, lastSeparator); - } - - return s; - } - - /// - /// Ensures a trailing directory separator character - /// - public static string EnsureTrailingSeparator(this string s) - { - if (s.Length == 0 || IsAnyDirectorySeparator(s[s.Length - 1])) - { - return s; - } - - // Use the existing slashes in the path, if they're consistent - bool hasSlash = s.IndexOf('/') >= 0; - bool hasBackslash = s.IndexOf('\\') >= 0; - if (hasSlash && !hasBackslash) - { - return s + '/'; - } - else if (!hasSlash && hasBackslash) - { - return s + '\\'; - } - else - { - // If there are no slashes or they are inconsistent, use the current platform's slash. - return s + DirectorySeparatorChar; - } - } - - public static string GetExtension(string path) - { - return FileNameUtilities.GetExtension(path); - } - - public static string ChangeExtension(string path, string extension) - { - return FileNameUtilities.ChangeExtension(path, extension); - } - - public static string RemoveExtension(string path) - { - return FileNameUtilities.ChangeExtension(path, extension: null); - } - - public static string GetFileName(string path, bool includeExtension = true) - { - return FileNameUtilities.GetFileName(path, includeExtension); - } - - /// - /// Get directory name from path. - /// - /// - /// Unlike it doesn't check for invalid path characters - /// - /// Prefix of path that represents a directory - public static string GetDirectoryName(string path) - { - return GetDirectoryName(path, IsUnixLikePlatform); - } - - // Exposed for testing purposes only. - internal static string GetDirectoryName(string path, bool isUnixLike) - { - if (path != null) - { - var rootLength = GetPathRoot(path, isUnixLike).Length; - if (path.Length > rootLength) - { - var i = path.Length; - while (i > rootLength) - { - i--; - if (IsDirectorySeparator(path[i])) - { - if (i > 0 && IsDirectorySeparator(path[i - 1])) - { - continue; - } - - break; - } - } - - return path.Substring(0, i); - } - } - - return null; - } - - internal static bool IsSameDirectoryOrChildOf(string child, string parent) - { - parent = RemoveTrailingDirectorySeparator(parent); - - while (child != null) - { - child = RemoveTrailingDirectorySeparator(child); - - if (child.Equals(parent, StringComparison.OrdinalIgnoreCase)) - { - return true; - } - - child = GetDirectoryName(child); - } - - return false; - } - - /// - /// Gets the root part of the path. - /// - public static string GetPathRoot(string path) - { - return GetPathRoot(path, IsUnixLikePlatform); - } - - private static string GetPathRoot(string path, bool isUnixLike) - { - if (path == null) - { - return null; - } - - if (isUnixLike) - { - return GetUnixRoot(path); - } - else - { - return GetWindowsRoot(path); - } - } - - private static string GetWindowsRoot(string path) - { - // Windows - int length = path.Length; - if (length >= 1 && IsDirectorySeparator(path[0])) - { - if (length < 2 || !IsDirectorySeparator(path[1])) - { - // It was of the form: - // \ - // \f - // in this case, just return \ as the root. - return path.Substring(0, 1); - } - - // First consume all directory separators. - int i = 2; - i = ConsumeDirectorySeparators(path, length, i); - - // We've got \\ so far. If we have a path of the form \\x\y\z - // then we want to return "\\x\y" as the root portion. - bool hitSeparator = false; - while (true) - { - if (i == length) - { - // We reached the end of the path. The entire path is - // considered the root. - return path; - } - - if (!IsDirectorySeparator(path[i])) - { - // We got a non separator character. Just keep consuming. - i++; - continue; - } - - if (!hitSeparator) - { - // This is the first separator group we've hit after some server path. - // Consume them and keep going. - hitSeparator = true; - i = ConsumeDirectorySeparators(path, length, i); - continue; - } - - // We hit the second separator. The root is the path up to this point. - return path.Substring(0, i); - } - } - else if (length >= 2 && path[1] == VolumeSeparatorChar) - { - // handles c: and c:\ - return length >= 3 && IsDirectorySeparator(path[2]) - ? path.Substring(0, 3) - : path.Substring(0, 2); - } - else - { - // No path root. - return ""; - } - } - - private static int ConsumeDirectorySeparators(string path, int length, int i) - { - while (i < length && IsDirectorySeparator(path[i])) - { - i++; - } - - return i; - } - - private static string GetUnixRoot(string path) - { - // either it starts with "/" and thus has "/" as the root. Or it has no root. - return path.Length > 0 && IsDirectorySeparator(path[0]) - ? path.Substring(0, 1) - : ""; - } - - /// - /// Gets the specific kind of relative or absolute path. - /// - public static PathKind GetPathKind(string path) - { - if (string.IsNullOrWhiteSpace(path)) - { - return PathKind.Empty; - } - - // "C:\" - // "\\machine" (UNC) - // "/etc" (Unix) - if (IsAbsolute(path)) - { - return PathKind.Absolute; - } - - // "." - // ".." - // ".\" - // "..\" - if (path.Length > 0 && path[0] == '.') - { - if (path.Length == 1 || IsDirectorySeparator(path[1])) - { - return PathKind.RelativeToCurrentDirectory; - } - - if (path[1] == '.') - { - if (path.Length == 2 || IsDirectorySeparator(path[2])) - { - return PathKind.RelativeToCurrentParent; - } - } - } - - if (!IsUnixLikePlatform) - { - // "\" - // "\goo" - if (path.Length >= 1 && IsDirectorySeparator(path[0])) - { - return PathKind.RelativeToCurrentRoot; - } - - // "C:goo" - - if (path.Length >= 2 && path[1] == VolumeSeparatorChar && (path.Length <= 2 || !IsDirectorySeparator(path[2]))) - { - return PathKind.RelativeToDriveDirectory; - } - } - - // "goo.dll" - return PathKind.Relative; - } - - /// - /// True if the path is an absolute path (rooted to drive or network share) - /// - public static bool IsAbsolute(string path) - { - if (string.IsNullOrEmpty(path)) - { - return false; - } - - if (IsUnixLikePlatform) - { - return path[0] == DirectorySeparatorChar; - } - - // "C:\" - if (IsDriveRootedAbsolutePath(path)) - { - // Including invalid paths (e.g. "*:\") - return true; - } - - // "\\machine\share" - // Including invalid/incomplete UNC paths (e.g. "\\goo") - return path.Length >= 2 && - IsDirectorySeparator(path[0]) && - IsDirectorySeparator(path[1]); - } - - /// - /// Returns true if given path is absolute and starts with a drive specification ("C:\"). - /// - private static bool IsDriveRootedAbsolutePath(string path) - { - Debug.Assert(!IsUnixLikePlatform); - return path.Length >= 3 && path[1] == VolumeSeparatorChar && IsDirectorySeparator(path[2]); - } - - /// - /// Combines an absolute path with a relative. - /// - /// Absolute root path. - /// Relative path. - /// - /// An absolute combined path, or null if is - /// absolute (e.g. "C:\abc", "\\machine\share\abc"), - /// relative to the current root (e.g. "\abc"), - /// or relative to a drive directory (e.g. "C:abc\def"). - /// - /// - public static string CombineAbsoluteAndRelativePaths(string root, string relativePath) - { - Debug.Assert(IsAbsolute(root)); - - return CombinePossiblyRelativeAndRelativePaths(root, relativePath); - } - - /// - /// Combine two paths, the first of which may be absolute. - /// - /// First path: absolute, relative, or null. - /// Second path: relative and non-null. - /// null, if is null; a combined path, otherwise. - /// - public static string CombinePossiblyRelativeAndRelativePaths(string rootOpt, string relativePath) - { - if (string.IsNullOrEmpty(rootOpt)) - { - return null; - } - - switch (GetPathKind(relativePath)) - { - case PathKind.Empty: - return rootOpt; - - case PathKind.Absolute: - case PathKind.RelativeToCurrentRoot: - case PathKind.RelativeToDriveDirectory: - return null; - } - - return CombinePathsUnchecked(rootOpt, relativePath); - } - - public static string CombinePathsUnchecked(string root, string relativePath) - { - Debug.Assert(!string.IsNullOrEmpty(root)); - - char c = root[root.Length - 1]; - if (!IsDirectorySeparator(c) && c != VolumeSeparatorChar) - { - return root + DirectorySeparatorStr + relativePath; - } - - return root + relativePath; - } - - private static string RemoveTrailingDirectorySeparator(string path) - { - if (path.Length > 0 && IsDirectorySeparator(path[path.Length - 1])) - { - return path.Substring(0, path.Length - 1); - } - else - { - return path; - } - } - - /// - /// Determines whether an assembly reference is considered an assembly file path or an assembly name. - /// used, for example, on values of /r and #r. - /// - public static bool IsFilePath(string assemblyDisplayNameOrPath) - { - Debug.Assert(assemblyDisplayNameOrPath != null); - - string extension = FileNameUtilities.GetExtension(assemblyDisplayNameOrPath); - return string.Equals(extension, ".dll", StringComparison.OrdinalIgnoreCase) - || string.Equals(extension, ".exe", StringComparison.OrdinalIgnoreCase) - || assemblyDisplayNameOrPath.IndexOf(DirectorySeparatorChar) != -1 - || assemblyDisplayNameOrPath.IndexOf(AltDirectorySeparatorChar) != -1; - } - - /// - /// Determines if "path" contains 'component' within itself. - /// i.e. asking if the path "c:\goo\bar\baz" has component "bar" would return 'true'. - /// On the other hand, if you had "c:\goo\bar1\baz" then it would not have "bar" as a - /// component. - /// - /// A path contains a component if any file name or directory name in the path - /// matches 'component'. As such, if you had something like "\\goo" then that would - /// not have "goo" as a component. That's because here "goo" is the server name portion - /// of the UNC path, and not an actual directory or file name. - /// - public static bool ContainsPathComponent(string path, string component, bool ignoreCase) - { - var comparison = ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal; - if (path?.IndexOf(component, comparison) >= 0) - { - var comparer = ignoreCase ? StringComparer.OrdinalIgnoreCase : StringComparer.Ordinal; - - int count = 0; - var currentPath = path; - while (currentPath != null) - { - var currentName = GetFileName(currentPath); - if (comparer.Equals(currentName, component)) - { - return true; - } - - currentPath = GetDirectoryName(currentPath); - count++; - } - } - - return false; - } - - /// - /// Gets a path relative to a directory. - /// - public static string GetRelativePath(string directory, string fullPath) - { - string relativePath = string.Empty; - - if (IsChildPath(directory, fullPath)) - { - return GetRelativeChildPath(directory, fullPath); - } - - if (IsChildPath(fullPath, directory)) - { - return GetRelativeParentPath(directory, fullPath); - } - - var directoryPathParts = GetPathParts(directory); - var fullPathParts = GetPathParts(fullPath); - - if (directoryPathParts.Length == 0 || fullPathParts.Length == 0) - { - return fullPath; - } - - int index = 0; - - // find index where full path diverges from base path - for (; index < directoryPathParts.Length; index++) - { - if (!PathsEqual(directoryPathParts[index], fullPathParts[index])) - { - break; - } - } - - // if the first part doesn't match, they don't even have the same volume - // so there can be no relative path. - if (index == 0) - { - return fullPath; - } - - // add backup notation for remaining base path levels beyond the index - var remainingParts = directoryPathParts.Length - index; - if (remainingParts > 0) - { - for (int i = 0; i < remainingParts; i++) - { - relativePath = relativePath + ParentRelativeDirectory + DirectorySeparatorStr; - } - } - - // add the rest of the full path parts - for (int i = index; i < fullPathParts.Length; i++) - { - relativePath = CombinePathsUnchecked(relativePath, fullPathParts[i]); - } - - return relativePath; - } - - private static string GetRelativeParentPath(string childPath, string parentPath) - { - var childPathParts = GetPathParts(childPath); - var parentPathParts = GetPathParts(parentPath); - - var relativePath = new StringBuilder(); - for (int i = 0; i < childPathParts.Length - parentPathParts.Length; i++) - { - relativePath.Append(ParentRelativeDirectory + DirectorySeparatorStr); - } - - return relativePath.ToString(); - } - - /// - /// True if the child path is a child of the parent path. - /// - public static bool IsChildPath(string parentPath, string childPath) - { - return parentPath.Length > 0 - && childPath.Length > parentPath.Length - && PathsEqual(childPath, parentPath, parentPath.Length) - && (IsDirectorySeparator(parentPath[parentPath.Length - 1]) || IsDirectorySeparator(childPath[parentPath.Length])); - } - - private static string GetRelativeChildPath(string parentPath, string childPath) - { - var relativePath = childPath.Substring(parentPath.Length); - - // trim any leading separators left over after removing leading directory - int start = ConsumeDirectorySeparators(relativePath, relativePath.Length, 0); - if (start > 0) - { - relativePath = relativePath.Substring(start); - } - - return relativePath; - } - - private static readonly char[] s_pathChars = new char[] { VolumeSeparatorChar, DirectorySeparatorChar, AltDirectorySeparatorChar }; - - private static string[] GetPathParts(string path) - { - var pathParts = path.Split(s_pathChars).Where(p => !string.IsNullOrWhiteSpace(p)); - - // remove references to self directories ('.') - if (pathParts.Contains(ThisDirectory)) - { - pathParts = pathParts.Where(s => s != ThisDirectory).ToArray(); - } - - return pathParts.ToArray(); - } - - /// - /// True if the two paths are the same. - /// - public static bool PathsEqual(string path1, string path2) - { - return PathsEqual(path1, path2, Math.Max(path1.Length, path2.Length)); - } - - /// - /// True if the two paths are the same. (but only up to the specified length) - /// - private static bool PathsEqual(string path1, string path2, int length) - { - if (path1.Length < length || path2.Length < length) - { - return false; - } - - for (int i = 0; i < length; i++) - { - if (!PathCharEqual(path1[i], path2[i])) - { - return false; - } - } - - return true; - } - - private static bool PathCharEqual(char x, char y) - { - if (IsDirectorySeparator(x) && IsDirectorySeparator(y)) - { - return true; - } - - return IsUnixLikePlatform - ? x == y - : char.ToUpperInvariant(x) == char.ToUpperInvariant(y); - } - - private static int PathHashCode(string path) - { - int hc = 0; - - if (path != null) - { - foreach (var ch in path) - { - if (!IsDirectorySeparator(ch)) - { - hc = Hash.Combine((int) char.ToUpperInvariant(ch), hc); - } - } - } - - return hc; - } - - public static string NormalizePathPrefix(string filePath, ImmutableArray> pathMap) - { - if (pathMap.IsDefaultOrEmpty) - { - return filePath; - } - - // find the first key in the path map that matches a prefix of the normalized path. - // Note that we expect the client to use consistent capitalization; we use ordinal (case-sensitive) comparisons. - foreach (var kv in pathMap) - { - var oldPrefix = kv.Key; - if (!(oldPrefix?.Length > 0)) continue; - - // oldPrefix always ends with a path separator, so there's no need to check if it was a partial match - // e.g. for the map /goo=/bar and filename /goooo - if (filePath.StartsWith(oldPrefix, StringComparison.Ordinal)) - { - var replacementPrefix = kv.Value; - - // Replace that prefix. - var replacement = replacementPrefix + filePath.Substring(oldPrefix.Length); - - // Normalize the path separators if used uniformly in the replacement - bool hasSlash = replacementPrefix.IndexOf('/') >= 0; - bool hasBackslash = replacementPrefix.IndexOf('\\') >= 0; - return - (hasSlash && !hasBackslash) ? replacement.Replace('\\', '/') : - (hasBackslash && !hasSlash) ? replacement.Replace('/', '\\') : - replacement; - } - } - - return filePath; - } - - /// - /// Unfortunatelly, we cannot depend on Path.GetInvalidPathChars() or Path.GetInvalidFileNameChars() - /// From MSDN: The array returned from this method is not guaranteed to contain the complete set of characters - /// that are invalid in file and directory names. The full set of invalid characters can vary by file system. - /// https://msdn.microsoft.com/en-us/library/system.io.path.getinvalidfilenamechars.aspx - /// - /// Additionally, Path.GetInvalidPathChars() doesn't include "?" or "*" which are invalid characters, - /// and Path.GetInvalidFileNameChars() includes ":" and "\" which are valid characters. - /// - /// The more accurate way is to let the framework parse the path and throw on any errors. - /// - public static bool IsValidFilePath(string fullPath) - { - try - { - if (string.IsNullOrEmpty(fullPath)) - { - return false; - } - - // Uncomment when this is fixed: https://github.com/dotnet/roslyn/issues/19592 - // Debug.Assert(IsAbsolute(fullPath)); - - var fileInfo = new FileInfo(fullPath); - return !string.IsNullOrEmpty(fileInfo.Name); - } - catch (Exception ex) when ( - ex is ArgumentException || // The file name is empty, contains only white spaces, or contains invalid characters. - ex is PathTooLongException || // The specified path, file name, or both exceed the system-defined maximum length. - ex is NotSupportedException) // fileName contains a colon (:) in the middle of the string. - { - return false; - } - } - - public static readonly IEqualityComparer Comparer = new PathComparer(); - - private class PathComparer : IEqualityComparer - { - public bool Equals(string x, string y) - { - if (x == null && y == null) - { - return true; - } - - if (x == null || y == null) - { - return false; - } - - return PathsEqual(x, y); - } - - public int GetHashCode(string s) - { - return PathHashCode(s); - } - } - } - - internal static class Hash - { - internal static int Combine(int newKey, int currentKey) - { - return unchecked((currentKey * (int) 0xA5555529) + newKey); - } - - internal static int Combine(uint newKey, int currentKey) - { - return unchecked((currentKey * (int) 0xA5555529) + (int) newKey); - } - - internal static int Combine(bool newKeyPart, int currentKey) - { - return Combine(currentKey, newKeyPart ? 1 : 0); - } - - /// - /// The offset bias value used in the FNV-1a algorithm - /// See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function - /// - internal const int FnvOffsetBias = unchecked((int) 2166136261); - - /// - /// The generative factor used in the FNV-1a algorithm - /// See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function - /// - internal const int FnvPrime = 16777619; - - /// - /// Compute the FNV-1a hash of a sequence of bytes - /// See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function - /// - /// The sequence of bytes - /// The FNV-1a hash of - internal static int GetFNVHashCode(byte[] data) - { - int hashCode = FnvOffsetBias; - - for (int i = 0; i < data.Length; i++) - { - hashCode = unchecked((hashCode ^ data[i]) * FnvPrime); - } - - return hashCode; - } - - /// - /// Compute the FNV-1a hash of a sequence of bytes - /// See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function - /// - /// The sequence of bytes - /// The FNV-1a hash of - internal static int GetFNVHashCode(ImmutableArray data) - { - int hashCode = FnvOffsetBias; - - for (int i = 0; i < data.Length; i++) - { - hashCode = unchecked((hashCode ^ data[i]) * FnvPrime); - } - - return hashCode; - } - } - - public enum PathKind - { - /// - /// Null or empty. - /// - Empty, - - /// - /// "file" - /// - Relative, - - /// - /// ".\file" - /// - RelativeToCurrentDirectory, - - /// - /// "..\file" - /// - RelativeToCurrentParent, - - /// - /// "\dir\file" - /// - RelativeToCurrentRoot, - - /// - /// "C:dir\file" - /// - RelativeToDriveDirectory, - - /// - /// "C:\file" or "\\machine" (UNC). - /// - Absolute, - } -} diff --git a/Microsoft.DotNet.Interactive/Utility/Paths.cs b/Microsoft.DotNet.Interactive/Utility/Paths.cs deleted file mode 100644 index 429d92fa7..000000000 --- a/Microsoft.DotNet.Interactive/Utility/Paths.cs +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.IO; -using System.Runtime.InteropServices; - -namespace Microsoft.DotNet.Interactive.Utility -{ - public static class Paths - { - private const string DotnetHomeVariableName = "DOTNET_CLI_HOME"; - private const string DotnetProfileDirectoryName = ".dotnet"; - private const string ToolsShimFolderName = "tools"; - - static Paths() - { - UserProfile = Environment.GetEnvironmentVariable( - RuntimeInformation.IsOSPlatform(OSPlatform.Windows) - ? "USERPROFILE" - : "HOME"); - - DotnetToolsPath = Path.Combine(UserProfile, DotnetProfileDirectoryName, ToolsShimFolderName); - - var nugetPackagesEnvironmentVariable = Environment.GetEnvironmentVariable("NUGET_PACKAGES"); - - NugetCache = String.IsNullOrWhiteSpace(nugetPackagesEnvironmentVariable) - ? Path.Combine(UserProfile, ".nuget", "packages") - : nugetPackagesEnvironmentVariable; - } - - public static string DotnetUserProfileFolderPath => - Path.Combine(DotnetHomePath, DotnetProfileDirectoryName); - - public static string DotnetHomePath - { - get - { - var home = Environment.GetEnvironmentVariable(DotnetHomeVariableName); - if (string.IsNullOrEmpty(home)) - { - home = UserProfile; - if (string.IsNullOrEmpty(home)) - { - throw new DirectoryNotFoundException(); - } - } - - return home; - } - } - - public static string DotnetToolsPath { get; } - - public static string UserProfile { get; } - - public static string NugetCache { get; } - - public static readonly string InstallDirectory = Path.GetDirectoryName(typeof(Paths).Assembly.Location); - } -} diff --git a/Microsoft.DotNet.Interactive/Utility/ResolvedPackageReference.cs b/Microsoft.DotNet.Interactive/Utility/ResolvedPackageReference.cs deleted file mode 100644 index e63a8229d..000000000 --- a/Microsoft.DotNet.Interactive/Utility/ResolvedPackageReference.cs +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; - -namespace Microsoft.DotNet.Interactive.Utility -{ - public class ResolvedPackageReference : PackageReference - { - public ResolvedPackageReference( - string packageName, - string packageVersion, - IReadOnlyList assemblyPaths, - DirectoryInfo packageRoot = null, - IReadOnlyList probingPaths = null) : base(packageName, packageVersion) - { - if (string.IsNullOrWhiteSpace(packageVersion)) - { - throw new ArgumentException("Value cannot be null or whitespace.", nameof(packageVersion)); - } - - AssemblyPaths = assemblyPaths ?? throw new ArgumentNullException(nameof(assemblyPaths)); - ProbingPaths = probingPaths ?? Array.Empty(); - PackageRoot = packageRoot ?? AssemblyPaths.FirstOrDefault()?.Directory?.Parent?.Parent; - } - - public IReadOnlyList AssemblyPaths { get; } - - public IReadOnlyList ProbingPaths { get; } - - public DirectoryInfo PackageRoot { get; } - - public override string ToString() => $"{PackageName},{PackageVersion}"; - } -} \ No newline at end of file diff --git a/Microsoft.DotNet.Interactive/Utility/SourceUtilities.cs b/Microsoft.DotNet.Interactive/Utility/SourceUtilities.cs deleted file mode 100644 index 939511f62..000000000 --- a/Microsoft.DotNet.Interactive/Utility/SourceUtilities.cs +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Text.RegularExpressions; - -namespace Microsoft.DotNet.Interactive.Utility -{ - public static class SourceUtilities - { - private static readonly Regex _lastToken = new Regex(@"(?\S+)$", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); - - /// - /// Given the specified code and cursor position, finds the location where replacement text will begin - /// insertion, usually the location of the last dot ('.'). - /// - public static int ComputeReplacementStartPosition(string code, int cursorPosition) - { - var pos = cursorPosition; - - if (pos > 0) - { - var codeToCursor = code.Substring(0, pos); - var match = _lastToken.Match(codeToCursor); - if (match.Success) - { - var token = match.Groups["lastToken"]; - if (token.Success) - { - var lastDotPosition = token.Value.LastIndexOf(".", StringComparison.InvariantCultureIgnoreCase); - if (lastDotPosition >= 0) - { - pos = token.Index + lastDotPosition + 1; - } - else - { - pos = token.Index; - } - } - } - } - - return pos; - } - } -} diff --git a/Microsoft.DotNet.Try.Client/.babelrc b/Microsoft.DotNet.Try.Client/.babelrc deleted file mode 100644 index ded77bf11..000000000 --- a/Microsoft.DotNet.Try.Client/.babelrc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "presets" : [ - "es2015", - "react", - "stage-0" - ], - "plugins": [ - "transform-class-properties", - "transform-decorators", - "transform-react-constant-elements", - "transform-react-inline-elements" - ] -} \ No newline at end of file diff --git a/Microsoft.DotNet.Try.Client/.eslintrc.json b/Microsoft.DotNet.Try.Client/.eslintrc.json deleted file mode 100644 index 7b598cc21..000000000 --- a/Microsoft.DotNet.Try.Client/.eslintrc.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "env": { - "browser": true, - "commonjs": true, - "es6": true, - "node": true - }, - "extends": "react", - "parserOptions": { - "ecmaFeatures": { - "jsx": true - }, - "sourceType": "module" - }, - "rules": { - "no-const-assign": "warn", - "no-this-before-super": "warn", - "no-undef": "warn", - "no-unreachable": "warn", - "no-unused-vars": "warn", - "constructor-super": "warn", - "max-len": "off", - "valid-typeof": "warn" - } -} \ No newline at end of file diff --git a/Microsoft.DotNet.Try.Client/jsconfig.json b/Microsoft.DotNet.Try.Client/jsconfig.json deleted file mode 100644 index 84f674006..000000000 --- a/Microsoft.DotNet.Try.Client/jsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "compilerOptions": { - "target": "ES6" - }, - "exclude": [ - "node_modules", - "obj", - "bin", - "wwwroot", - "Properties", - "etc", - "Controllers" - ] -} \ No newline at end of file diff --git a/Microsoft.DotNet.Try.Client/mocha.opts b/Microsoft.DotNet.Try.Client/mocha.opts deleted file mode 100644 index d923ccf97..000000000 --- a/Microsoft.DotNet.Try.Client/mocha.opts +++ /dev/null @@ -1,7 +0,0 @@ ---ui bdd ---require ignore-styles ---require source-map-support/register ---webpack-config webpack.config/test/webpack.config.ts ---require babel-polyfill -"test/**/*.specs.@(tsx|ts)" ---timeout 5000 diff --git a/Microsoft.DotNet.Try.Client/package-lock.json b/Microsoft.DotNet.Try.Client/package-lock.json deleted file mode 100644 index c942e42c6..000000000 --- a/Microsoft.DotNet.Try.Client/package-lock.json +++ /dev/null @@ -1,24908 +0,0 @@ -{ - "name": "trydotnet-client", - "version": "0.1.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "trydotnet-client", - "version": "0.1.0", - "dependencies": { - "@types/enzyme-adapter-react-16": "1.0.3", - "applicationinsights-js": "1.0.20", - "cross-fetch": "3.1.5", - "deep-equal": "1.0.1", - "is-absolute-url": "2.1.0", - "monaco-editor": "0.14.3", - "prop-types": "15.6.2", - "react": "16.14.0", - "react-dom": "16.14.0", - "react-monaco-editor": "0.18.0", - "react-router-dom": "4.3.1", - "request": "2.88.0", - "rxjs": "6.4.0" - }, - "devDependencies": { - "@types/applicationinsights-js": "1.0.9", - "@types/chai": "4.1.7", - "@types/chai-as-promised": "7.1.0", - "@types/chai-subset": "1.3.2", - "@types/classnames": "2.2.7", - "@types/cookie": "0.3.1", - "@types/cookie_js": "1.2.1", - "@types/copy-webpack-plugin": "4.4.2", - "@types/deep-equal": "1.0.1", - "@types/enzyme": "3.1.16", - "@types/enzyme-redux": "0.2.1", - "@types/enzyme-to-json": "1.5.2", - "@types/is-absolute-url": "2.1.0", - "@types/isomorphic-fetch": "0.0.34", - "@types/js-cookie": "2.1.0", - "@types/jsdom": "12.2.1", - "@types/mocha": "5.2.5", - "@types/node": "10.12.21", - "@types/prop-types": "15.5.5", - "@types/react": "16.4.12", - "@types/react-dom": "16.0.7", - "@types/react-redux": "6.0.6", - "@types/react-router": "4.0.30", - "@types/react-router-dom": "4.3.0", - "@types/tough-cookie": "2.3.3", - "@types/webpack": "4.4.11", - "@types/webpack-merge": "4.1.3", - "@types/window-or-global": "1.0.0", - "autoprefixer": "9.1.3", - "babel-core": "6.26.3", - "babel-eslint": "8.2.6", - "babel-loader": "7.1.5", - "babel-plugin-transform-class-properties": "6.24.1", - "babel-plugin-transform-react-constant-elements": "6.23.0", - "babel-plugin-transform-react-inline-elements": "6.22.0", - "babel-polyfill": "6.26.0", - "babel-preset-es2015": "6.24.1", - "babel-preset-latest": "6.24.1", - "babel-preset-react": "6.24.1", - "babel-preset-stage-0": "6.24.1", - "babel-preset-stage-2": "6.24.1", - "babel-register": "6.26.0", - "chai": "4.2.0", - "chai-as-promised": "7.1.1", - "chai-exclude": "1.0.12", - "chai-subset": "1.6.0", - "classnames": "2.2.6", - "concurrently": "4.0.1", - "cookie": "0.3.1", - "cookie_js": "1.2.2", - "copy-webpack-plugin": "5.1.0", - "css-loader": "1.0.0", - "deep-eql": "3.0.1", - "enzyme": "3.8.0", - "enzyme-adapter-react-16": "1.9.1", - "enzyme-redux": "0.2.1", - "enzyme-to-json": "3.3.5", - "es6-promise": "4.2.4", - "eslint": "5.4.0", - "eslint-config-react": "1.1.7", - "eslint-plugin-react": "7.11.1", - "fetch-cookie": "0.7.2", - "fetch-ponyfill": "6.1.1", - "find-free-port": "2.0.0", - "har-validator": "5.1.3", - "ignore-styles": "5.0.1", - "js-cookie": "2.2.0", - "jsdom": "12.0.0", - "jsdom-global": "3.0.2", - "lodash": "4.17.21", - "mini-css-extract-plugin": "0.4.2", - "mkdirp": "1.0.4", - "mocha": "6.1.4", - "mocha-multi-reporters": "1.1.7", - "mocha-trx-reporter": "3.3.1", - "mocha-typescript": "1.1.17", - "mochapack": "1.1.1", - "mock-http-server": "1.0.0", - "monaco-editor-webpack-plugin": "1.5.1", - "postcss-loader": "3.0.0", - "react-jsdom": "3.0.0", - "react-redux": "5.0.7", - "react-router": "4.3.1", - "redux": "4.0.0", - "redux-thunk": "2.3.0", - "requirejs": "2.3.6", - "source-map-loader": "0.2.4", - "source-map-support": "0.5.9", - "speed-measure-webpack-plugin": "1.2.2", - "style-loader": "0.23.0", - "tough-cookie": "2.4.3", - "ts-babel-node": "1.1.1", - "ts-loader": "4.5.0", - "ts-mocha": "7.0.0", - "ts-node": "8.7.0", - "tslint": "5.11.0", - "tslint-loader": "3.6.0", - "tslint-no-unused-expression-chai": "0.1.3", - "typescript": "3.3.1", - "typings-for-css-modules-loader": "1.7.0", - "wallaby-webpack": "3.9.16", - "webpack": "4.41.2", - "webpack-cli": "3.1.0", - "webpack-merge": "4.1.4", - "webpack-monitor": "1.0.14", - "webpack-node-externals": "1.7.2" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", - "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==", - "dev": true, - "dependencies": { - "@babel/highlight": "7.0.0-beta.44" - } - }, - "node_modules/@babel/generator": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz", - "integrity": "sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ==", - "dev": true, - "dependencies": { - "@babel/types": "7.0.0-beta.44", - "jsesc": "^2.5.1", - "lodash": "^4.2.0", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - } - }, - "node_modules/@babel/generator/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz", - "integrity": "sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg==", - "dev": true, - "dependencies": { - "@babel/helper-get-function-arity": "7.0.0-beta.44", - "@babel/template": "7.0.0-beta.44", - "@babel/types": "7.0.0-beta.44" - } - }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz", - "integrity": "sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw==", - "dev": true, - "dependencies": { - "@babel/types": "7.0.0-beta.44" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz", - "integrity": "sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA==", - "dev": true, - "dependencies": { - "@babel/types": "7.0.0-beta.44" - } - }, - "node_modules/@babel/highlight": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", - "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", - "dev": true, - "dependencies": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^3.0.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/runtime": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", - "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime/node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - }, - "node_modules/@babel/template": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz", - "integrity": "sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng==", - "dev": true, - "dependencies": { - "@babel/code-frame": "7.0.0-beta.44", - "@babel/types": "7.0.0-beta.44", - "babylon": "7.0.0-beta.44", - "lodash": "^4.2.0" - } - }, - "node_modules/@babel/template/node_modules/babylon": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", - "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", - "dev": true, - "bin": { - "babylon": "bin/babylon.js" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz", - "integrity": "sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "7.0.0-beta.44", - "@babel/generator": "7.0.0-beta.44", - "@babel/helper-function-name": "7.0.0-beta.44", - "@babel/helper-split-export-declaration": "7.0.0-beta.44", - "@babel/types": "7.0.0-beta.44", - "babylon": "7.0.0-beta.44", - "debug": "^3.1.0", - "globals": "^11.1.0", - "invariant": "^2.2.0", - "lodash": "^4.2.0" - } - }, - "node_modules/@babel/traverse/node_modules/babylon": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", - "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", - "dev": true, - "bin": { - "babylon": "bin/babylon.js" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/@babel/traverse/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@babel/traverse/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/@babel/types": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz", - "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2", - "lodash": "^4.2.0", - "to-fast-properties": "^2.0.0" - } - }, - "node_modules/@types/applicationinsights-js": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/applicationinsights-js/-/applicationinsights-js-1.0.9.tgz", - "integrity": "sha512-tf2BBQFIRgaoxkii5Ys4Q2nvhPQ2PFt9FfgDc+xL7+XPi3s4ScqzRuAn8FRBCglnyzVvwEznOtdfqGREzUOkCw==", - "dev": true - }, - "node_modules/@types/chai": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.7.tgz", - "integrity": "sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA==", - "dev": true - }, - "node_modules/@types/chai-as-promised": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.0.tgz", - "integrity": "sha512-MFiW54UOSt+f2bRw8J7LgQeIvE/9b4oGvwU7XW30S9QGAiHGnU/fmiOprsyMkdmH2rl8xSPc0/yrQw8juXU6bQ==", - "dev": true, - "dependencies": { - "@types/chai": "*" - } - }, - "node_modules/@types/chai-subset": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.2.tgz", - "integrity": "sha512-VMA1aOXwPEJADlj5ykmYv77YKmbEuAxiLz/+lT6vFIWQ1EA06jF01TytVBAbVTNk0pjfW1Uhw5R5MaEq426N0A==", - "dev": true, - "dependencies": { - "@types/chai": "*" - } - }, - "node_modules/@types/cheerio": { - "version": "0.22.30", - "resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.30.tgz", - "integrity": "sha512-t7ZVArWZlq3dFa9Yt33qFBQIK4CQd1Q3UJp0V+UhP6vgLWLM6Qug7vZuRSGXg45zXeB1Fm5X2vmBkEX58LV2Tw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/classnames": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.2.7.tgz", - "integrity": "sha512-rzOhiQ55WzAiFgXRtitP/ZUT8iVNyllEpylJ5zHzR4vArUvMB39GTk+Zon/uAM0JxEFAWnwsxC2gH8s+tZ3Myg==", - "dev": true - }, - "node_modules/@types/cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha512-64Uv+8bTRVZHlbB8eXQgMP9HguxPgnOOIYrQpwHWrtLDrtcG/lILKhUl7bV65NSOIJ9dXGYD7skQFXzhL8tk1A==", - "dev": true - }, - "node_modules/@types/cookie_js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/cookie_js/-/cookie_js-1.2.1.tgz", - "integrity": "sha512-FUWgrNwHn3IjQDEJ47sLWWsX5ijaoysQQ/gKCQi5l7qUSOw4gO+l5wdIVngF1bfO2oeXITUJHmGb8w/xqAzuuA==", - "dev": true - }, - "node_modules/@types/copy-webpack-plugin": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@types/copy-webpack-plugin/-/copy-webpack-plugin-4.4.2.tgz", - "integrity": "sha512-/L0m5kc7pKGpsu97TTgAP6YcVRmau2Wj0HpRPQBGEbZXT1DZkdozZPCZHGDWXpxcvWDFTxob2JmYJj3RC7CwFA==", - "dev": true, - "dependencies": { - "@types/minimatch": "*", - "@types/webpack": "*" - } - }, - "node_modules/@types/deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha512-mMUu4nWHLBlHtxXY17Fg6+ucS/MnndyOWyOe7MmwkoMYxvfQU2ajtRaEvqSUv+aVkMqH/C0NCI8UoVfRNQ10yg==", - "dev": true - }, - "node_modules/@types/enzyme": { - "version": "3.1.16", - "resolved": "https://registry.npmjs.org/@types/enzyme/-/enzyme-3.1.16.tgz", - "integrity": "sha512-j4IAiHw+g97PWbvFv+yk601zsHf2pCYe61JZi7XW38eiRM1Lgc2LwgB7Bjssd5xi7+JMqshNfKKUP6QjMiCJ0g==", - "dependencies": { - "@types/cheerio": "*", - "@types/react": "*" - } - }, - "node_modules/@types/enzyme-adapter-react-16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.0.3.tgz", - "integrity": "sha512-9eRLBsC/Djkys05BdTWgav8v6fSCjyzjNuLwG2sfa2b2g/VAN10luP0zB0VwtOWFQ0LGjIboJJvIsVdU5gqRmg==", - "dependencies": { - "@types/enzyme": "*" - } - }, - "node_modules/@types/enzyme-redux": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@types/enzyme-redux/-/enzyme-redux-0.2.1.tgz", - "integrity": "sha512-9DSyBY9CbzpNSwCB7pfMhO64RDhE4WbFaeS6eZSKfEeKqI2COvMzi6t0D2UPqcIIMowZUcGxKlyoJJa9vhbw8w==", - "dev": true, - "dependencies": { - "@types/enzyme": "*", - "@types/react": "*" - } - }, - "node_modules/@types/enzyme-to-json": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/enzyme-to-json/-/enzyme-to-json-1.5.2.tgz", - "integrity": "sha512-3f5gJ+cf77nF4Erx/YmCdeP39Tk3iBjXl4yZOqQEHjriqqgYkYJDKDjOdKOsGsktOi/cTH+iXLbz6u66w1SUVA==", - "dev": true, - "dependencies": { - "@types/enzyme": "*" - } - }, - "node_modules/@types/history": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/history/-/history-5.0.0.tgz", - "integrity": "sha512-hy8b7Y1J8OGe6LbAjj3xniQrj3v6lsivCcrmf4TzSgPzLkhIeKgc5IZnT7ReIqmEuodjfO8EYAuoFvIrHi/+jQ==", - "deprecated": "This is a stub types definition. history provides its own type definitions, so you do not need this installed.", - "dev": true, - "dependencies": { - "history": "*" - } - }, - "node_modules/@types/is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-tHpg9gRIF3kQRDtOH05Pd5e/lpA=", - "dev": true - }, - "node_modules/@types/isomorphic-fetch": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/isomorphic-fetch/-/isomorphic-fetch-0.0.34.tgz", - "integrity": "sha1-PDSD5gbAQTeEOOlRRk8A5OYHBtY=", - "dev": true - }, - "node_modules/@types/js-cookie": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.1.0.tgz", - "integrity": "sha512-vPT5MV1pD71RFUD0ytp6Yw51W6zKJ9Qn2AcJXSD2TZqYKaXUtCxB3WZIXXFZtbAEVMgC59nmvVPSOH0EIvkaZg==", - "dev": true - }, - "node_modules/@types/jsdom": { - "version": "12.2.1", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-12.2.1.tgz", - "integrity": "sha512-VnLP1qW70OkzpMVuFsJPhxeIzEW1y+t91Fa2rE+b3UZ3ZiTwB28pYrdNj58wa0AQ+dV7eIBcdMFl3ql9C+cc9g==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/tough-cookie": "*", - "parse5": "^4.0.0" - } - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true, - "optional": true - }, - "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "node_modules/@types/mocha": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.5.tgz", - "integrity": "sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==", - "dev": true - }, - "node_modules/@types/node": { - "version": "10.12.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.21.tgz", - "integrity": "sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ==" - }, - "node_modules/@types/prop-types": { - "version": "15.5.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.5.5.tgz", - "integrity": "sha512-mOrlCEdwX3seT3n0AXNt4KNPAZZxcsABUHwBgFXOt+nvFUXkxCAO6UBJHPrDxWEa2KDMil86355fjo8jbZ+K0Q==", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react": { - "version": "16.4.12", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.4.12.tgz", - "integrity": "sha512-7XihF0BFk1wQfLNf+HAsfk6CEGMdqy592+qv0MAY38uDdSC/yYOa2k1g85oYFQkhCrWVL48c2oT1+QGfF0ABTg==", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^2.2.0" - } - }, - "node_modules/@types/react-dom": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.0.7.tgz", - "integrity": "sha512-vaq4vMaJOaNgFff1t3LnHYr6vRa09vRspMkmLdXtFZmO1fwDI2snP+dpOkwrtlU8UC8qsqemCu4RmVM2OLq/fA==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/react": "*" - } - }, - "node_modules/@types/react-redux": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-6.0.6.tgz", - "integrity": "sha512-sD/QEn45h+CH0OAhCn6/9COlihZ94bzpP58QzYYCL3tOFta/WBhuvMoyLP8khJLfwQBx1PT70HP/1GnDws9YXQ==", - "dev": true, - "dependencies": { - "@types/react": "*", - "redux": "^4.0.0" - } - }, - "node_modules/@types/react-router": { - "version": "4.0.30", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-4.0.30.tgz", - "integrity": "sha512-zWt5RpWy7x7semeBIHqLZ31A1Tle0jb3R/KD2wguZqO43DjP4n8kYsH7UIpve6I4hzlSObnoIieDcp5qfyKwaQ==", - "dev": true, - "dependencies": { - "@types/history": "*", - "@types/react": "*" - } - }, - "node_modules/@types/react-router-dom": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-4.3.0.tgz", - "integrity": "sha512-vaq+nVUGyMnIhAl+svKHmfqhCoCNe5lf1UWmvVcsBlAcX0kznF25711DNFQ7B8/QZ+ZF1zzGq1dIi9bzxIu85w==", - "dev": true, - "dependencies": { - "@types/history": "*", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "node_modules/@types/tapable": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-2.2.2.tgz", - "integrity": "sha512-ujqOVJEeLcwpDVJPnp/k3u1UXmTKq5urJq9fO8aUKg8Vlel5RNOFbVKEfqfh6wGfF/M+HiTJlBJMLC1aDfyf0Q==", - "dev": true, - "dependencies": { - "tapable": "^2.2.0" - } - }, - "node_modules/@types/tough-cookie": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha512-MDQLxNFRLasqS4UlkWMSACMKeSm1x4Q3TxzUC7KQUsh6RK1ZrQ0VEyE3yzXcBu+K8ejVj4wuX32eUG02yNp+YQ==", - "dev": true - }, - "node_modules/@types/uglify-js": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz", - "integrity": "sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==", - "dev": true, - "dependencies": { - "source-map": "^0.6.1" - } - }, - "node_modules/@types/webpack": { - "version": "4.4.11", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.4.11.tgz", - "integrity": "sha512-NdESmbpvVEtJgs15kyZYKr5ouLYPMYt9DNG5JEgCekbG/ezFLPCzf4XcAv8caOb+b7x6ieAuSt0eoR0UkSI7RA==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/tapable": "*", - "@types/uglify-js": "*", - "source-map": "^0.6.0" - } - }, - "node_modules/@types/webpack-merge": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@types/webpack-merge/-/webpack-merge-4.1.3.tgz", - "integrity": "sha512-VdmNuYIvIouYlCI73NLKOE1pOVAxv5m5eupvTemojZz9dqghoQXmeEveI6CqeuWpCH6x6FLp6+tXM2sls20/MA==", - "dev": true, - "dependencies": { - "@types/webpack": "*" - } - }, - "node_modules/@types/window-or-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/window-or-global/-/window-or-global-1.0.0.tgz", - "integrity": "sha1-tLyEgMN/5LrCNV96ksn/zYSCLJQ=", - "dev": true - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "node_modules/@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "node_modules/@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true - }, - "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", - "dev": true, - "dependencies": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true, - "peerDependencies": { - "ajv": ">=5.0.0" - } - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/applicationinsights-js": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/applicationinsights-js/-/applicationinsights-js-1.0.20.tgz", - "integrity": "sha512-vN6fEv2fNPZtw76/mv5OJ44cTP/VzSDahdXVIGnRB5Apnf2/9PIl4IyWpwS9biG53I1sWvkw83RjdrAnsIKoRQ==", - "deprecated": "This package has been moved to @microsoft/applicationinsights-web. Please install that package instead for the latest updates & features" - }, - "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", - "dev": true - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "node_modules/array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array.prototype.find": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.2.tgz", - "integrity": "sha512-00S1O4ewO95OmmJW7EesWfQlrCrLEL8kZ40w3+GkLX2yTt0m2ggcePPa2uHPJ9KUmJvwRq+lCV9bD8Yim23x/Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "dependencies": { - "object-assign": "^4.1.1", - "util": "0.10.3" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assert/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "node_modules/assert/node_modules/util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "dependencies": { - "inherits": "2.0.1" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/autoprefixer": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.1.3.tgz", - "integrity": "sha512-No9xrkPCGIHc9I52e+u1MuvkwfTOIXQt3tu+jGSONAJf4awvQmqOTWmk7JhA9Q3BTvBYIRdpS9PLFtrmpZcImg==", - "dev": true, - "dependencies": { - "browserslist": "^4.0.2", - "caniuse-lite": "^1.0.30000878", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.2", - "postcss-value-parser": "^3.2.3" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "node_modules/babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } - }, - "node_modules/babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "dependencies": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - } - }, - "node_modules/babel-core/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-eslint": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.6.tgz", - "integrity": "sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA==", - "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.", - "dev": true, - "dependencies": { - "@babel/code-frame": "7.0.0-beta.44", - "@babel/traverse": "7.0.0-beta.44", - "@babel/types": "7.0.0-beta.44", - "babylon": "7.0.0-beta.44", - "eslint-scope": "3.7.1", - "eslint-visitor-keys": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/babel-eslint/node_modules/babylon": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", - "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", - "dev": true, - "bin": { - "babylon": "bin/babylon.js" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "dependencies": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - } - }, - "node_modules/babel-generator/node_modules/jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/babel-generator/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-helper-bindify-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", - "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "dev": true, - "dependencies": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-builder-react-jsx": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", - "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "esutils": "^2.0.2" - } - }, - "node_modules/babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, - "dependencies": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "dev": true, - "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "node_modules/babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-explode-class": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", - "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", - "dev": true, - "dependencies": { - "babel-helper-bindify-decorators": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "dependencies": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "node_modules/babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "dev": true, - "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, - "dependencies": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/babel-loader": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.5.tgz", - "integrity": "sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw==", - "dev": true, - "dependencies": { - "find-cache-dir": "^1.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "babel-core": "6", - "webpack": "2 || 3 || 4" - } - }, - "node_modules/babel-loader/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", - "dev": true - }, - "node_modules/babel-plugin-syntax-async-generators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", - "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", - "dev": true - }, - "node_modules/babel-plugin-syntax-class-constructor-call": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", - "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=", - "dev": true - }, - "node_modules/babel-plugin-syntax-class-properties": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", - "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", - "dev": true - }, - "node_modules/babel-plugin-syntax-decorators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", - "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", - "dev": true - }, - "node_modules/babel-plugin-syntax-do-expressions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz", - "integrity": "sha1-V0d1YTmqJtOQ0JQQsDdEugfkeW0=", - "dev": true - }, - "node_modules/babel-plugin-syntax-dynamic-import": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", - "dev": true - }, - "node_modules/babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", - "dev": true - }, - "node_modules/babel-plugin-syntax-export-extensions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", - "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=", - "dev": true - }, - "node_modules/babel-plugin-syntax-flow": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", - "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", - "dev": true - }, - "node_modules/babel-plugin-syntax-function-bind": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz", - "integrity": "sha1-SMSV8Xe98xqYHnMvVa3AvdJgH0Y=", - "dev": true - }, - "node_modules/babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", - "dev": true - }, - "node_modules/babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "node_modules/babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", - "dev": true - }, - "node_modules/babel-plugin-transform-async-generator-functions": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", - "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", - "dev": true, - "dependencies": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-generators": "^6.5.0", - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "dev": true, - "dependencies": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-class-constructor-call": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz", - "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", - "dev": true, - "dependencies": { - "babel-plugin-syntax-class-constructor-call": "^6.18.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-class-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", - "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", - "dev": true, - "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-plugin-syntax-class-properties": "^6.8.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", - "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", - "dev": true, - "dependencies": { - "babel-helper-explode-class": "^6.24.1", - "babel-plugin-syntax-decorators": "^6.13.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-do-expressions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz", - "integrity": "sha1-KMyvkoEtlJws0SgfaQyP3EaK6bs=", - "dev": true, - "dependencies": { - "babel-plugin-syntax-do-expressions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "node_modules/babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "dependencies": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "dependencies": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "dependencies": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "dev": true, - "dependencies": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } - }, - "node_modules/babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "dependencies": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "dependencies": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "dependencies": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "dependencies": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "dependencies": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "dependencies": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" - } - }, - "node_modules/babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "dev": true, - "dependencies": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-export-extensions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", - "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", - "dev": true, - "dependencies": { - "babel-plugin-syntax-export-extensions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-flow-strip-types": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", - "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", - "dev": true, - "dependencies": { - "babel-plugin-syntax-flow": "^6.18.0", - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-function-bind": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz", - "integrity": "sha1-xvuOlqwpajELjPjqQBRiQH3fapc=", - "dev": true, - "dependencies": { - "babel-plugin-syntax-function-bind": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "dev": true, - "dependencies": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" - } - }, - "node_modules/babel-plugin-transform-react-constant-elements": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-constant-elements/-/babel-plugin-transform-react-constant-elements-6.23.0.tgz", - "integrity": "sha1-LxGb9NLN1F65uqrldAU8YE9hR90=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-react-display-name": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", - "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-react-inline-elements": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-inline-elements/-/babel-plugin-transform-react-inline-elements-6.22.0.tgz", - "integrity": "sha1-ZochGjK0mlLyLFc6K1UEol7xfFM=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-react-jsx": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", - "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", - "dev": true, - "dependencies": { - "babel-helper-builder-react-jsx": "^6.24.1", - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-react-jsx-self": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", - "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", - "dev": true, - "dependencies": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-react-jsx-source": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", - "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", - "dev": true, - "dependencies": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "node_modules/babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "dev": true, - "dependencies": { - "regenerator-transform": "^0.10.0" - } - }, - "node_modules/babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "node_modules/babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" - } - }, - "node_modules/babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "deprecated": "🙌 Thanks for using Babel: we recommend using babel-preset-env now: please read https://babeljs.io/env to update!", - "dev": true, - "dependencies": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.24.1", - "babel-plugin-transform-es2015-classes": "^6.24.1", - "babel-plugin-transform-es2015-computed-properties": "^6.24.1", - "babel-plugin-transform-es2015-destructuring": "^6.22.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", - "babel-plugin-transform-es2015-for-of": "^6.22.0", - "babel-plugin-transform-es2015-function-name": "^6.24.1", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-umd": "^6.24.1", - "babel-plugin-transform-es2015-object-super": "^6.24.1", - "babel-plugin-transform-es2015-parameters": "^6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", - "babel-plugin-transform-regenerator": "^6.24.1" - } - }, - "node_modules/babel-preset-es2016": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2016/-/babel-preset-es2016-6.24.1.tgz", - "integrity": "sha1-+QC/k+LrwNJ235uKtZck6/2Vn4s=", - "deprecated": "🙌 Thanks for using Babel: we recommend using babel-preset-env now: please read https://babeljs.io/env to update!", - "dev": true, - "dependencies": { - "babel-plugin-transform-exponentiation-operator": "^6.24.1" - } - }, - "node_modules/babel-preset-es2017": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2017/-/babel-preset-es2017-6.24.1.tgz", - "integrity": "sha1-WXvq37n38gi8/YoS6bKym4svFNE=", - "deprecated": "🙌 Thanks for using Babel: we recommend using babel-preset-env now: please read https://babeljs.io/env to update!", - "dev": true, - "dependencies": { - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^6.24.1" - } - }, - "node_modules/babel-preset-flow": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", - "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", - "dev": true, - "dependencies": { - "babel-plugin-transform-flow-strip-types": "^6.22.0" - } - }, - "node_modules/babel-preset-latest": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-latest/-/babel-preset-latest-6.24.1.tgz", - "integrity": "sha1-Z33gaRVKdIXC0lxXfAL2JLhbheg=", - "deprecated": "We're super 😸 excited that you're trying to use ES2017+ syntax, but instead of making more yearly presets 😭 , Babel now has a better preset that we recommend you use instead: npm install babel-preset-env --save-dev. preset-env without options will compile ES2015+ down to ES5 just like using all the presets together and thus is more future proof. It also allows you to target specific browsers so that Babel can do less work and you can ship native ES2015+ to user 😎 ! We are also in the process of releasing v7, so please give http://babeljs.io/blog/2017/09/12/planning-for-7.0 a read and help test it out in beta! Thanks so much for using Babel ðŸ™, please give us a follow on Twitter @babeljs for news on Babel, join slack.babeljs.io for discussion/development and help support the project at opencollective.com/babel", - "dev": true, - "dependencies": { - "babel-preset-es2015": "^6.24.1", - "babel-preset-es2016": "^6.24.1", - "babel-preset-es2017": "^6.24.1" - } - }, - "node_modules/babel-preset-react": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", - "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", - "dev": true, - "dependencies": { - "babel-plugin-syntax-jsx": "^6.3.13", - "babel-plugin-transform-react-display-name": "^6.23.0", - "babel-plugin-transform-react-jsx": "^6.24.1", - "babel-plugin-transform-react-jsx-self": "^6.22.0", - "babel-plugin-transform-react-jsx-source": "^6.22.0", - "babel-preset-flow": "^6.23.0" - } - }, - "node_modules/babel-preset-stage-0": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz", - "integrity": "sha1-VkLRUEL5E4TX5a+LyIsduVsDnmo=", - "dev": true, - "dependencies": { - "babel-plugin-transform-do-expressions": "^6.22.0", - "babel-plugin-transform-function-bind": "^6.22.0", - "babel-preset-stage-1": "^6.24.1" - } - }, - "node_modules/babel-preset-stage-1": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz", - "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", - "dev": true, - "dependencies": { - "babel-plugin-transform-class-constructor-call": "^6.24.1", - "babel-plugin-transform-export-extensions": "^6.22.0", - "babel-preset-stage-2": "^6.24.1" - } - }, - "node_modules/babel-preset-stage-2": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", - "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", - "dev": true, - "dependencies": { - "babel-plugin-syntax-dynamic-import": "^6.18.0", - "babel-plugin-transform-class-properties": "^6.24.1", - "babel-plugin-transform-decorators": "^6.24.1", - "babel-preset-stage-3": "^6.24.1" - } - }, - "node_modules/babel-preset-stage-3": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", - "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", - "dev": true, - "dependencies": { - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-generator-functions": "^6.24.1", - "babel-plugin-transform-async-to-generator": "^6.24.1", - "babel-plugin-transform-exponentiation-operator": "^6.24.1", - "babel-plugin-transform-object-rest-spread": "^6.22.0" - } - }, - "node_modules/babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "dependencies": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - } - }, - "node_modules/babel-register/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/babel-register/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-register/node_modules/source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "dependencies": { - "source-map": "^0.5.6" - } - }, - "node_modules/babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "node_modules/babel-runtime/node_modules/regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "node_modules/babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "node_modules/babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "dependencies": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - } - }, - "node_modules/babel-traverse/node_modules/globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - } - }, - "node_modules/babel-types/node_modules/to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true, - "bin": { - "babylon": "bin/babylon.js" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "node_modules/bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", - "dev": true - }, - "node_modules/body-parser": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", - "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", - "dev": true, - "dependencies": { - "bytes": "3.1.1", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.6", - "raw-body": "2.4.2", - "type-is": "~1.6.18" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/browserify-sign/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/browserify-sign/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "dependencies": { - "pako": "~1.0.5" - } - }, - "node_modules/browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", - "dev": true, - "dependencies": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "node_modules/buffer/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "node_modules/bytes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", - "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "dependencies": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "node_modules/cacache/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "dependencies": { - "callsites": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "dependencies": { - "caller-callsite": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001301", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001301.tgz", - "integrity": "sha512-csfD/GpHMqgEL3V3uIgosvh+SVIQvCh43SNu9HRbP1lnxkKm1kjDG4f32PP571JplkLjfS+mg2p1gxR7MYrrIA==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "node_modules/chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", - "dev": true, - "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" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chai-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", - "dev": true, - "dependencies": { - "check-error": "^1.0.2" - }, - "peerDependencies": { - "chai": ">= 2.1.2 < 5" - } - }, - "node_modules/chai-exclude": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/chai-exclude/-/chai-exclude-1.0.12.tgz", - "integrity": "sha512-7xJgaLhigf51U+s7k23vOLnXk4w/rIffmlnUu/ueYJg21sLyrTqCn3BxvOjbGNGYgXTQNFwjFX3lUnbcai0oCA==", - "dev": true, - "dependencies": { - "fclone": "^1.0.11" - }, - "peerDependencies": { - "chai": ">= 4.0.0 < 5" - } - }, - "node_modules/chai-subset": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/chai-subset/-/chai-subset-1.6.0.tgz", - "integrity": "sha1-pdDKFOMpp5WW7XAFi2ZGvWmIz+k=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/cheerio": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", - "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", - "dev": true, - "dependencies": { - "cheerio-select": "^1.5.0", - "dom-serializer": "^1.3.2", - "domhandler": "^4.2.0", - "htmlparser2": "^6.1.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz", - "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==", - "dev": true, - "dependencies": { - "css-select": "^4.1.3", - "css-what": "^5.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0", - "domutils": "^2.7.0" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cheerio/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", - "dev": true, - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "deprecated": "CircularJSON is in maintenance only, flatted is its successor.", - "dev": true - }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/classnames": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", - "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==", - "dev": true - }, - "node_modules/clean-css": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", - "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", - "dev": true, - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true - }, - "node_modules/cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "dependencies": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/colour": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", - "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concurrently": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-4.0.1.tgz", - "integrity": "sha512-D8UI+mlI/bfvrA57SeKOht6sEpb01dKk+8Yee4fbnkk1Ue8r3S+JXoEdFZIpzQlXJGtnxo47Wvvg/kG4ba3U6Q==", - "dev": true, - "dependencies": { - "chalk": "^2.4.1", - "date-fns": "^1.23.0", - "lodash": "^4.17.10", - "read-pkg": "^4.0.1", - "rxjs": "6.2.2", - "spawn-command": "^0.0.2-1", - "supports-color": "^4.5.0", - "tree-kill": "^1.1.0", - "yargs": "^12.0.1" - }, - "bin": { - "concurrently": "bin/concurrently.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/concurrently/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/concurrently/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/concurrently/node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/concurrently/node_modules/rxjs": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz", - "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/concurrently/node_modules/supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "dependencies": { - "has-flag": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/concurrently/node_modules/supports-color/node_modules/has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/concurrently/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie_js": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie_js/-/cookie_js-1.2.2.tgz", - "integrity": "sha1-Ub7V8Clm4mZHtTaNH1l1tfAZBsQ=", - "dev": true - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "node_modules/copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "dependencies": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "node_modules/copy-concurrently/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/copy-webpack-plugin": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.0.tgz", - "integrity": "sha512-0sNrj/Sx7/cWA0k7CVQa0sdA/dzCybqSb0+GbhKuQdOlAvnAwgC2osmbAFOAfha7ZXnreoQmCq5oDjG3gP4VHw==", - "dev": true, - "dependencies": { - "cacache": "^12.0.3", - "find-cache-dir": "^2.1.0", - "glob-parent": "^3.1.0", - "globby": "^7.1.1", - "is-glob": "^4.0.1", - "loader-utils": "^1.2.3", - "minimatch": "^3.0.4", - "normalize-path": "^3.0.0", - "p-limit": "^2.2.1", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "webpack-log": "^2.0.0" - }, - "engines": { - "node": ">= 6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/copy-webpack-plugin/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/copy-webpack-plugin/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/copy-webpack-plugin/node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/copy-webpack-plugin/node_modules/serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true - }, - "node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", - "dev": true, - "hasInstallScript": true - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dependencies": { - "node-fetch": "2.6.7" - } - }, - "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - } - }, - "node_modules/css-loader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.0.tgz", - "integrity": "sha512-tMXlTYf3mIMt3b0dDCOQFJiVvxbocJ5Ho577WiGPYPZcqVEO218L2iU22pDXzkTZCLDE+9AmGSUkWxeh/nZReA==", - "dev": true, - "dependencies": { - "babel-code-frame": "^6.26.0", - "css-selector-tokenizer": "^0.7.0", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash.camelcase": "^4.3.0", - "postcss": "^6.0.23", - "postcss-modules-extract-imports": "^1.2.0", - "postcss-modules-local-by-default": "^1.2.0", - "postcss-modules-scope": "^1.1.0", - "postcss-modules-values": "^1.3.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" - }, - "engines": { - "node": ">= 6.9.0 <7.0.0 || >= 8.9.0" - }, - "peerDependencies": { - "webpack": "^4.0.0" - } - }, - "node_modules/css-loader/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/css-loader/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/css-loader/node_modules/postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "dependencies": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/css-loader/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/css-select": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", - "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^5.1.0", - "domhandler": "^4.3.0", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-selector-tokenizer": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", - "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" - } - }, - "node_modules/css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", - "dev": true, - "dependencies": { - "cssom": "0.3.x" - } - }, - "node_modules/csstype": { - "version": "2.6.19", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.19.tgz", - "integrity": "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==" - }, - "node_modules/cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" - } - }, - "node_modules/date-fns": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", - "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", - "dev": true - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "node_modules/detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "dependencies": { - "repeating": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "dev": true, - "dependencies": { - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/discontinuous-range": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", - "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", - "dev": true - }, - "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true, - "engines": { - "node": ">=0.4", - "npm": ">=1.2" - } - }, - "node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "dev": true, - "dependencies": { - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/domhandler": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", - "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", - "dev": true, - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.53", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.53.tgz", - "integrity": "sha512-rFveSKQczlcav+H3zkKqykU6ANseFwXwkl855jOIap5/0gnEcuIhv2ecz6aoTrXavF6I/CEBeRnBnkB51k06ew==", - "dev": true - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "optional": true, - "peer": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "optional": true, - "peer": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/enhanced-resolve/node_modules/memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - } - }, - "node_modules/enhanced-resolve/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/enzyme": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.8.0.tgz", - "integrity": "sha512-bfsWo5nHyZm1O1vnIsbwdfhU989jk+squU9NKvB+Puwo5j6/Wg9pN5CO0YJelm98Dao3NPjkDZk+vvgwpMwYxw==", - "dev": true, - "dependencies": { - "array.prototype.flat": "^1.2.1", - "cheerio": "^1.0.0-rc.2", - "function.prototype.name": "^1.1.0", - "has": "^1.0.3", - "is-boolean-object": "^1.0.0", - "is-callable": "^1.1.4", - "is-number-object": "^1.0.3", - "is-string": "^1.0.4", - "is-subset": "^0.1.1", - "lodash.escape": "^4.0.1", - "lodash.isequal": "^4.5.0", - "object-inspect": "^1.6.0", - "object-is": "^1.0.1", - "object.assign": "^4.1.0", - "object.entries": "^1.0.4", - "object.values": "^1.0.4", - "raf": "^3.4.0", - "rst-selector-parser": "^2.2.3", - "string.prototype.trim": "^1.1.2" - } - }, - "node_modules/enzyme-adapter-react-16": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.9.1.tgz", - "integrity": "sha512-Egzogv1y77DUxdnq/CyHxLHaNxmSSKDDSDNNB/EiAXCZVFXdFibaNy2uUuRQ1n24T2m6KH/1Rw16XDRq+1yVEg==", - "dev": true, - "dependencies": { - "enzyme-adapter-utils": "^1.10.0", - "function.prototype.name": "^1.1.0", - "object.assign": "^4.1.0", - "object.values": "^1.1.0", - "prop-types": "^15.6.2", - "react-is": "^16.7.0", - "react-test-renderer": "^16.0.0-0" - }, - "peerDependencies": { - "enzyme": "^3.0.0", - "react": "^16.0.0-0", - "react-dom": "^16.0.0-0" - } - }, - "node_modules/enzyme-adapter-react-16/node_modules/enzyme-adapter-utils": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.14.0.tgz", - "integrity": "sha512-F/z/7SeLt+reKFcb7597IThpDp0bmzcH1E9Oabqv+o01cID2/YInlqHbFl7HzWBl4h3OdZYedtwNDOmSKkk0bg==", - "dev": true, - "dependencies": { - "airbnb-prop-types": "^2.16.0", - "function.prototype.name": "^1.1.3", - "has": "^1.0.3", - "object.assign": "^4.1.2", - "object.fromentries": "^2.0.3", - "prop-types": "^15.7.2", - "semver": "^5.7.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - }, - "peerDependencies": { - "react": "0.13.x || 0.14.x || ^15.0.0-0 || ^16.0.0-0" - } - }, - "node_modules/enzyme-adapter-react-16/node_modules/enzyme-adapter-utils/node_modules/airbnb-prop-types": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz", - "integrity": "sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==", - "dev": true, - "dependencies": { - "array.prototype.find": "^2.1.1", - "function.prototype.name": "^1.1.2", - "is-regex": "^1.1.0", - "object-is": "^1.1.2", - "object.assign": "^4.1.0", - "object.entries": "^1.1.2", - "prop-types": "^15.7.2", - "prop-types-exact": "^1.2.0", - "react-is": "^16.13.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - }, - "peerDependencies": { - "react": "^0.14 || ^15.0.0 || ^16.0.0-alpha" - } - }, - "node_modules/enzyme-adapter-react-16/node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/enzyme-adapter-react-16/node_modules/react-test-renderer": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.14.0.tgz", - "integrity": "sha512-L8yPjqPE5CZO6rKsKXRO/rVPiaCOy0tQQJbC+UjPNlobl5mad59lvPjwFsQHTvL03caVDIVr9x9/OSgDe6I5Eg==", - "dev": true, - "dependencies": { - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "react-is": "^16.8.6", - "scheduler": "^0.19.1" - }, - "peerDependencies": { - "react": "^16.14.0" - } - }, - "node_modules/enzyme-redux": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/enzyme-redux/-/enzyme-redux-0.2.1.tgz", - "integrity": "sha1-fC6+vIpN1idJ1jLFoS1aI7yrwf8=", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "enzyme": "^3.0.0", - "react": "^16.0.0" - } - }, - "node_modules/enzyme-to-json": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/enzyme-to-json/-/enzyme-to-json-3.3.5.tgz", - "integrity": "sha512-DmH1wJ68HyPqKSYXdQqB33ZotwfUhwQZW3IGXaNXgR69Iodaoj8TF/D9RjLdz4pEhGq2Tx2zwNUIjBuqoZeTgA==", - "dev": true, - "dependencies": { - "lodash": "^4.17.4" - }, - "engines": { - "node": ">=4.0.0" - }, - "peerDependencies": { - "enzyme": "^3.0.0" - } - }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", - "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es6-denodeify": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-denodeify/-/es6-denodeify-0.1.5.tgz", - "integrity": "sha1-MdTV/pxVA+ElRgQ5MQ4WoqPznB8=", - "dev": true - }, - "node_modules/es6-promise": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", - "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/eslint": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.4.0.tgz", - "integrity": "sha512-UIpL91XGex3qtL6qwyCQJar2j3osKxK9e3ano3OcGEIRM4oWIpCkDg9x95AXEC2wMs7PnxzOkPZ2gq+tsMS9yg==", - "dev": true, - "dependencies": { - "ajv": "^6.5.0", - "babel-code-frame": "^6.26.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^3.1.0", - "doctrine": "^2.1.0", - "eslint-scope": "^4.0.0", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^4.0.0", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.2", - "imurmurhash": "^0.1.4", - "inquirer": "^5.2.0", - "is-resolvable": "^1.1.0", - "js-yaml": "^3.11.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.5", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "regexpp": "^2.0.0", - "require-uncached": "^1.0.3", - "semver": "^5.5.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^4.0.3", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^6.14.0 || ^8.10.0 || >=9.10.0" - } - }, - "node_modules/eslint-config-react": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/eslint-config-react/-/eslint-config-react-1.1.7.tgz", - "integrity": "sha1-oJGND8R9DpvRYaRzCAIdqF0lhbM=", - "dev": true - }, - "node_modules/eslint-plugin-react": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", - "integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==", - "dev": true, - "dependencies": { - "array-includes": "^3.0.3", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.0.1", - "prop-types": "^15.6.2" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", - "dev": true, - "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/eslint/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/eslint/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/eslint/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/espree": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", - "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", - "dev": true, - "dependencies": { - "acorn": "^6.0.2", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/express": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", - "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", - "dev": true, - "dependencies": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.4.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.9.6", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", - "setprototypeof": "1.2.0", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "node_modules/express/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, - "dependencies": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true - }, - "node_modules/fclone": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fclone/-/fclone-1.0.11.tgz", - "integrity": "sha1-EOhdo4v+p/xZk0HClu4ddyZu5kA=", - "dev": true - }, - "node_modules/fetch-cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-0.7.2.tgz", - "integrity": "sha512-Udm6ls1tV/pR9+EOjTYW2aGBadN03zOgVwu6grybxOg9ufACq7wE1HY/jh06DOykXH9FLYJC2RbUD3kJZcJBRg==", - "dev": true, - "dependencies": { - "es6-denodeify": "^0.1.1", - "tough-cookie": "^2.3.1" - } - }, - "node_modules/fetch-ponyfill": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/fetch-ponyfill/-/fetch-ponyfill-6.1.1.tgz", - "integrity": "sha512-rWLgTr5A44/XhvCQPYj0X9Tc+cjUaHofSM4lcwjc9MavD5lkjIhJ+h8JQlavPlTIgDpwhuRozaIykBvX9ItaSA==", - "dev": true, - "dependencies": { - "node-fetch": "~2.6.0" - } - }, - "node_modules/figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, - "node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "dependencies": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/find-free-port": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-free-port/-/find-free-port-2.0.0.tgz", - "integrity": "sha1-SyLl9leesaOMQaxryz7+0bbamxs=", - "dev": true - }, - "node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/flat": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", - "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", - "dev": true, - "dependencies": { - "is-buffer": "~2.0.3" - }, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", - "dev": true, - "dependencies": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/flat/node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "node_modules/functions-have-names": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.2.tgz", - "integrity": "sha512-bLgc3asbWdwPbx2mNk2S49kmJCuQeu0nfmaOgbs8WIyzzkw3r4htszdIi9Q9EMezDPTYuJx2wvjZ/EwgAthpnA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-modules-path": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.1.tgz", - "integrity": "sha512-y+shkf4InI7mPRHSo2b/k6ix6+NLDtyccYv86whhxrSGX9wjPX1VMITmrDbE1eh7zkzhiWtW2sHklJYoQ62Cxg==", - "dev": true - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", - "dev": true, - "dependencies": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/globby/node_modules/ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "node_modules/graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "dev": true - }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "engines": { - "node": ">=4.x" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash-base/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/hash-base/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/history": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/history/-/history-5.2.0.tgz", - "integrity": "sha512-uPSF6lAJb3nSePJ43hN3eKj1dTWpN9gMod0ZssbFTIsen+WehTmEadgL+kg78xLJFdRfrrC//SavDzmRVdE+Ig==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.7.6" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" - }, - "node_modules/home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^1.0.1" - } - }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, - "node_modules/icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "dev": true, - "dependencies": { - "postcss": "^6.0.1" - } - }, - "node_modules/icss-utils/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/icss-utils/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/icss-utils/node_modules/postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "dependencies": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/icss-utils/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-styles": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ignore-styles/-/ignore-styles-5.0.1.tgz", - "integrity": "sha1-tJ7yJ0va/NikiAqWa/440aC/RnE=", - "dev": true - }, - "node_modules/import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dev": true, - "dependencies": { - "import-from": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dev": true, - "dependencies": { - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", - "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", - "dev": true, - "dependencies": { - "pkg-dir": "^2.0.0", - "resolve-cwd": "^2.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/inquirer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", - "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.1.0", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^5.5.2", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/inquirer/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", - "dev": true, - "dependencies": { - "symbol-observable": "1.0.1" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer/node_modules/symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-subset": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", - "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", - "dev": true - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "node_modules/js-cookie": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.0.tgz", - "integrity": "sha1-Gywnmm7s44ChIWi5JIUmWzWx7/s=", - "dev": true - }, - "node_modules/js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "node_modules/jsdom": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-12.0.0.tgz", - "integrity": "sha512-42RgZYXWwyClG0pN6Au7TExAQqRvzbtJhlcIvu58cJj4yr1bIbqZkgxHqn1btxKu80axZXPZLvldeTzg2auKow==", - "dev": true, - "dependencies": { - "abab": "^2.0.0", - "acorn": "^5.7.1", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.1", - "domexception": "^1.0.1", - "escodegen": "^1.11.0", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.0.8", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.4.3", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.4", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^7.0.0", - "ws": "^6.0.0", - "xml-name-validator": "^3.0.0" - } - }, - "node_modules/jsdom-global": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsdom-global/-/jsdom-global-3.0.2.tgz", - "integrity": "sha1-a9KZwTsMRiay2iwDk81DhdYGrLk=", - "dev": true, - "peerDependencies": { - "jsdom": ">=10.0.0" - } - }, - "node_modules/jsdom/node_modules/acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/jsdom/node_modules/parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", - "dev": true - }, - "node_modules/jsdom/node_modules/request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dev": true, - "dependencies": { - "lodash": "^4.17.19" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/jsdom/node_modules/request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "engines": { - "node": ">=0.12.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "node_modules/json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/jsx-ast-utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", - "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.1", - "object.assign": "^4.1.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "dependencies": { - "invert-kv": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/load-json-file/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - } - }, - "node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/loader-utils/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true - }, - "node_modules/lodash.escape": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", - "integrity": "sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg=", - "dev": true - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, - "node_modules/log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "dependencies": { - "chalk": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, - "node_modules/map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "dependencies": { - "p-defer": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "dependencies": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mem/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "dependencies": { - "mime-db": "1.51.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.2.tgz", - "integrity": "sha512-ots7URQH4wccfJq9Ssrzu2+qupbncAce4TmTzunI9CIwlQMp2XI+WNUw6xWF6MMAGAm1cbUVINrSjATaVMyKXg==", - "dev": true, - "dependencies": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - }, - "engines": { - "node": ">= 6.9.0 <7.0.0 || >= 8.9.0" - }, - "peerDependencies": { - "webpack": "^4.4.0" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "node_modules/mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "dependencies": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.1.4.tgz", - "integrity": "sha512-PN8CIy4RXsIoxoFJzS4QNnCH4psUCPWc4/rPrst/ecSJJbLBkubMiyGCP2Kj/9YnWbotFqAoeXyXMucj7gwCFg==", - "dev": true, - "dependencies": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "2.2.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "ms": "2.1.1", - "node-environment-flags": "1.0.5", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.2.2", - "yargs-parser": "13.0.0", - "yargs-unparser": "1.5.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/mocha-multi-reporters": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/mocha-multi-reporters/-/mocha-multi-reporters-1.1.7.tgz", - "integrity": "sha1-zH8/TTL0eFIJQdhSq7ZNmYhYfYI=", - "dev": true, - "dependencies": { - "debug": "^3.1.0", - "lodash": "^4.16.4" - } - }, - "node_modules/mocha-multi-reporters/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/mocha-multi-reporters/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/mocha-trx-reporter": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/mocha-trx-reporter/-/mocha-trx-reporter-3.3.1.tgz", - "integrity": "sha512-nPCrSE588FDsdInlwAmLwJWEopNSgVX30Sz8Q0N1JM77D2VOf4PqraiGHxNb7bP2YULxr+K/ImJrl/2a+25jag==", - "dev": true, - "dependencies": { - "node-trx": "^0.9.1" - }, - "engines": { - "node": ">=6.4.0" - }, - "peerDependencies": { - "mocha": ">=3.0.0" - } - }, - "node_modules/mocha-typescript": { - "version": "1.1.17", - "resolved": "https://registry.npmjs.org/mocha-typescript/-/mocha-typescript-1.1.17.tgz", - "integrity": "sha512-Ge6pCQkZumkkhxVNdAf3JxunskShgaynCb30HYD7TT1Yhog/7NW2+6w5RcRHI+nuQrCMTX6z1+qf2pD8qwCoQA==", - "deprecated": "mocha-typescript has been deprecated, use @testdeck/mocha instead", - "dev": true, - "dependencies": { - "@types/mocha": "^5.2.0", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "yargs": "^11.0.0" - }, - "bin": { - "mocha-typescript-watch": "bin/watch.js" - } - }, - "node_modules/mocha-typescript/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mocha-typescript/node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/mocha-typescript/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mocha-typescript/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mocha-typescript/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mocha-typescript/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mocha-typescript/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mocha-typescript/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/mocha-typescript/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mocha-typescript/node_modules/y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "node_modules/mocha-typescript/node_modules/yargs": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.1.tgz", - "integrity": "sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==", - "dev": true, - "dependencies": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" - } - }, - "node_modules/mocha-typescript/node_modules/yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", - "dev": true, - "dependencies": { - "camelcase": "^4.1.0" - } - }, - "node_modules/mocha/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/mocha/node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/mocha/node_modules/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mocha/node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/mocha/node_modules/minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "node_modules/mocha/node_modules/mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", - "dev": true, - "dependencies": { - "minimist": "0.0.8" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "node_modules/mocha/node_modules/object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mocha/node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/mocha/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/yargs": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", - "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", - "dev": true, - "dependencies": { - "cliui": "^4.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.0.0" - } - }, - "node_modules/mochapack": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/mochapack/-/mochapack-1.1.1.tgz", - "integrity": "sha512-t8WchR4+38f0BO7+nBcUexqe1NNhzr8vsylOp5wF/J1EWP47T76KRVnZIrHHjxXdnp5JJHZtUD8C0pkJG2iv0g==", - "dev": true, - "dependencies": { - "babel-runtime": "^6.18.0", - "chalk": "^2.3.0", - "chokidar": "^2.0.4", - "glob-parent": "^3.1.0", - "globby": "^7.1.1", - "interpret": "^1.0.1", - "is-glob": "^4.0.0", - "loader-utils": "^1.1.0", - "lodash": "^4.3.0", - "memory-fs": "^0.4.1", - "nodent-runtime": "^3.0.3", - "normalize-path": "^2.0.1", - "progress": "^2.0.0", - "source-map-support": "^0.5.0", - "strip-ansi": "^4.0.0", - "toposort": "^1.0.0", - "yargs": "^11.0.0" - }, - "bin": { - "mochapack": "bin/mochapack" - }, - "peerDependencies": { - "mocha": ">=4 <=6", - "webpack": "^4.0.0" - } - }, - "node_modules/mochapack/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/mochapack/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mochapack/node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/mochapack/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mochapack/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mochapack/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mochapack/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mochapack/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mochapack/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mochapack/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/mochapack/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/mochapack/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mochapack/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mochapack/node_modules/y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "node_modules/mochapack/node_modules/yargs": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.1.tgz", - "integrity": "sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==", - "dev": true, - "dependencies": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" - } - }, - "node_modules/mochapack/node_modules/yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", - "dev": true, - "dependencies": { - "camelcase": "^4.1.0" - } - }, - "node_modules/mock-http-server": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mock-http-server/-/mock-http-server-1.0.0.tgz", - "integrity": "sha1-yQCaWYKKRPXUHiDuE/AKvwXqdV4=", - "dev": true, - "dependencies": { - "body-parser": "^1.18.1", - "connect": "^3.4.0", - "multiparty": "^4.1.2", - "underscore": "^1.8.3" - } - }, - "node_modules/monaco-editor": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.14.3.tgz", - "integrity": "sha512-RhaO4xXmWn/p0WrkEOXe4PoZj6xOcvDYjoAh0e1kGUrQnP1IOpc0m86Ceuaa2CLEMDINqKijBSmqhvBQnsPLHQ==" - }, - "node_modules/monaco-editor-webpack-plugin": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/monaco-editor-webpack-plugin/-/monaco-editor-webpack-plugin-1.5.1.tgz", - "integrity": "sha512-EHBeIDZkvEQmhDbDOoUQA43Am+C74QLu6MoQpFTqD/gecdwKeGB5OG322moyn0n6SOncGftfoQ+A+y5BT5YIgQ==", - "dev": true, - "peerDependencies": { - "monaco-editor": "^0.14.1", - "webpack": "^4.5.0" - } - }, - "node_modules/moo": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz", - "integrity": "sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w==", - "dev": true - }, - "node_modules/move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "dependencies": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "node_modules/move-concurrently/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/multiparty": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/multiparty/-/multiparty-4.2.3.tgz", - "integrity": "sha512-Ak6EUJZuhGS8hJ3c2fY6UW5MbkGUPMBEGd13djUzoY/BHqV/gTuFWtC6IuVA7A2+v3yjBS6c4or50xhzTQZImQ==", - "dev": true, - "dependencies": { - "http-errors": "~1.8.1", - "safe-buffer": "5.2.1", - "uid-safe": "2.1.5" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/multiparty/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "node_modules/nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "dev": true, - "optional": true - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/nearley": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", - "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", - "dev": true, - "dependencies": { - "commander": "^2.19.0", - "moo": "^0.5.0", - "railroad-diagrams": "^1.0.0", - "randexp": "0.4.6" - }, - "bin": { - "nearley-railroad": "bin/nearley-railroad.js", - "nearley-test": "bin/nearley-test.js", - "nearley-unparse": "bin/nearley-unparse.js", - "nearleyc": "bin/nearleyc.js" - }, - "funding": { - "type": "individual", - "url": "https://nearley.js.org/#give-to-nearley" - } - }, - "node_modules/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", - "dev": true, - "dependencies": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - } - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "dependencies": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - } - }, - "node_modules/node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", - "dev": true - }, - "node_modules/node-trx": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/node-trx/-/node-trx-0.9.4.tgz", - "integrity": "sha512-3si71vvBF1QZLYKvoURz3csCFxECbGYra3emaslfjXilXq9OclLey0PXeeT2GAF8v9VAhIhei0w32bK+2FDw0Q==", - "dev": true, - "dependencies": { - "uuid": "^3.4.0", - "xmlbuilder": "^13.0.2" - } - }, - "node_modules/nodent-runtime": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/nodent-runtime/-/nodent-runtime-3.2.1.tgz", - "integrity": "sha512-7Ws63oC+215smeKJQCxzrK21VFVlCFBkwl0MOObt0HOpVQXs3u483sAmtkF33nNqZ5rSOQjB76fgyPBmAUrtCA==", - "dev": true, - "hasInstallScript": true - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", - "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true, - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "dependencies": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "node_modules/parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "dependencies": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dev": true, - "dependencies": { - "parse5": "^6.0.1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "dependencies": { - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-dir/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", - "dev": true - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-load-config": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", - "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", - "dev": true, - "dependencies": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", - "dev": true, - "dependencies": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", - "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", - "dev": true, - "dependencies": { - "postcss": "^6.0.1" - } - }, - "node_modules/postcss-modules-extract-imports/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-modules-extract-imports/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-modules-extract-imports/node_modules/postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "dependencies": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/postcss-modules-extract-imports/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "dev": true, - "dependencies": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - } - }, - "node_modules/postcss-modules-local-by-default/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-modules-local-by-default/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-modules-local-by-default/node_modules/postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "dependencies": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/postcss-modules-local-by-default/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "dev": true, - "dependencies": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - } - }, - "node_modules/postcss-modules-scope/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-modules-scope/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-modules-scope/node_modules/postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "dependencies": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/postcss-modules-scope/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "dev": true, - "dependencies": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" - } - }, - "node_modules/postcss-modules-values/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-modules-values/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-modules-values/node_modules/postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "dependencies": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/postcss-modules-values/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "node_modules/postcss/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "node_modules/prop-types": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", - "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", - "dependencies": { - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" - } - }, - "node_modules/prop-types-exact": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/prop-types-exact/-/prop-types-exact-1.2.0.tgz", - "integrity": "sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==", - "dev": true, - "dependencies": { - "has": "^1.0.3", - "object.assign": "^4.1.0", - "reflect.ownkeys": "^0.2.0" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "node_modules/pumpify/node_modules/pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "node_modules/purify-css": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/purify-css/-/purify-css-1.2.6.tgz", - "integrity": "sha512-FuK4G3s98k+nHJGgheSL6/4gbvc5DeM7IyxI0lW+jvAd6pRRAM5etRtBlPrrPdbJt2iO9kLt/+AGoJ6foJM23A==", - "dev": true, - "dependencies": { - "clean-css": "^4.0.12", - "glob": "^7.1.1", - "rework": "^1.0.1", - "uglify-js": "^3.0.6", - "yargs": "^8.0.1" - }, - "bin": { - "purifycss": "bin/purifycss" - } - }, - "node_modules/purify-css/node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/purify-css/node_modules/cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "node_modules/purify-css/node_modules/cliui/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/purify-css/node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/purify-css/node_modules/execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "dependencies": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/purify-css/node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/purify-css/node_modules/invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/purify-css/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/purify-css/node_modules/lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "dependencies": { - "invert-kv": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/purify-css/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/purify-css/node_modules/mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/purify-css/node_modules/os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "dependencies": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/purify-css/node_modules/y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "node_modules/purify-css/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "node_modules/purify-css/node_modules/yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true, - "dependencies": { - "camelcase": "^4.1.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "read-pkg-up": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^7.0.0" - } - }, - "node_modules/purify-css/node_modules/yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, - "dependencies": { - "camelcase": "^4.1.0" - } - }, - "node_modules/qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", - "dev": true, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "dev": true, - "dependencies": { - "performance-now": "^2.1.0" - } - }, - "node_modules/railroad-diagrams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", - "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", - "dev": true - }, - "node_modules/randexp": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", - "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", - "dev": true, - "dependencies": { - "discontinuous-range": "1.0.0", - "ret": "~0.1.10" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/random-bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", - "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", - "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", - "dev": true, - "dependencies": { - "bytes": "3.1.1", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/react": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", - "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", - "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" - }, - "peerDependencies": { - "react": "^16.14.0" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "node_modules/react-jsdom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/react-jsdom/-/react-jsdom-3.0.0.tgz", - "integrity": "sha512-eNZNL2X2MENs8rgpuHFn8mUZZrGpU/DP5jOZXykkwQCsyB2TkxhutO5KySwIpwiaJsj3f3gFJTvCb5oelGGWLQ==", - "dev": true, - "dependencies": { - "react-dom": "^16.3.1", - "window": "^4.1.1" - } - }, - "node_modules/react-monaco-editor": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/react-monaco-editor/-/react-monaco-editor-0.18.0.tgz", - "integrity": "sha512-azMSMDF3eS9XFd9RWfujDInYvSQtdipozmEXSJRuJqsq3JmJlToOjMRSNEkTPmxnR6ZcI9DVhMImCLGNgUk5bQ==", - "dependencies": { - "@types/react": "*", - "monaco-editor": "^0.14.2", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": "^15.x || ^16.x" - } - }, - "node_modules/react-redux": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.0.7.tgz", - "integrity": "sha512-5VI8EV5hdgNgyjfmWzBbdrqUkrVRKlyTKk1sGH3jzM2M2Mhj/seQgPXaz6gVAj2lz/nz688AdTqMO18Lr24Zhg==", - "dev": true, - "dependencies": { - "hoist-non-react-statics": "^2.5.0", - "invariant": "^2.0.0", - "lodash": "^4.17.5", - "lodash-es": "^4.17.5", - "loose-envify": "^1.1.0", - "prop-types": "^15.6.0" - }, - "peerDependencies": { - "react": "^0.14.0 || ^15.0.0-0 || ^16.0.0-0", - "redux": "^2.0.0 || ^3.0.0 || ^4.0.0-0" - } - }, - "node_modules/react-router": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz", - "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==", - "dependencies": { - "history": "^4.7.2", - "hoist-non-react-statics": "^2.5.0", - "invariant": "^2.2.4", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.1", - "warning": "^4.0.1" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router-dom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.3.1.tgz", - "integrity": "sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==", - "dependencies": { - "history": "^4.7.2", - "invariant": "^2.2.4", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.1", - "react-router": "^4.3.1", - "warning": "^4.0.1" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router-dom/node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "node_modules/react-router/node_modules/history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "node_modules/read-pkg": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", - "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", - "dev": true, - "dependencies": { - "normalize-package-data": "^2.3.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "dependencies": { - "pify": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg-up/node_modules/read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "dependencies": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readable-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/redux": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.0.tgz", - "integrity": "sha512-NnnHF0h0WVE/hXyrB6OlX67LYRuaf/rJcbWvnHHEPCF/Xa/AZpwhs/20WyqzQae5x4SD2F9nPObgBh2rxAgLiA==", - "dev": true, - "dependencies": { - "loose-envify": "^1.1.0", - "symbol-observable": "^1.2.0" - } - }, - "node_modules/redux-thunk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz", - "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==", - "dev": true - }, - "node_modules/reflect.ownkeys": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz", - "integrity": "sha1-dJrO7H8/34tj+SegSAnpDFwLNGA=", - "dev": true - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "dev": true, - "dependencies": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regex-not/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regex-not/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true, - "engines": { - "node": ">=6.5.0" - } - }, - "node_modules/regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "dependencies": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "node_modules/regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "node_modules/regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "node_modules/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "dependencies": { - "is-finite": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "node_modules/require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "dependencies": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-uncached/node_modules/caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "dependencies": { - "callsites": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-uncached/node_modules/callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-uncached/node_modules/resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requirejs": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz", - "integrity": "sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==", - "dev": true, - "bin": { - "r_js": "bin/r.js", - "r.js": "bin/r.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "dependencies": { - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" - }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true - }, - "node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/rework": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", - "dev": true, - "dependencies": { - "convert-source-map": "^0.3.3", - "css": "^2.0.0" - } - }, - "node_modules/rework/node_modules/convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", - "dev": true - }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/rst-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", - "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", - "dev": true, - "dependencies": { - "lodash.flattendeep": "^4.4.0", - "nearley": "^2.7.10" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "dependencies": { - "aproba": "^1.1.1" - } - }, - "node_modules/rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "dependencies": { - "ret": "~0.1.10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "node_modules/saxes": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", - "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", - "dev": true, - "dependencies": { - "xmlchars": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "1.8.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", - "dev": true, - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", - "dev": true - }, - "node_modules/slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-loader": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", - "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==", - "dev": true, - "dependencies": { - "async": "^2.5.0", - "loader-utils": "^1.1.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true - }, - "node_modules/spawn-command": { - "version": "0.0.2-1", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", - "dev": true - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "dev": true - }, - "node_modules/speed-measure-webpack-plugin": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.2.2.tgz", - "integrity": "sha512-OPssnUTAdOwl/ijqToLrYUi8xHxdC9SOVV9e2AxkOC02Hua7+Jkfh3tdFCZxiMbtlghHK5Eyz87kG/XNpeM77w==", - "dev": true, - "dependencies": { - "chalk": "^2.0.1" - }, - "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "webpack": "^1 || ^2 || ^3 || ^4" - } - }, - "node_modules/speed-measure-webpack-plugin/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/speed-measure-webpack-plugin/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/speed-measure-webpack-plugin/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split-string/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split-string/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "dependencies": { - "figgy-pudding": "^3.5.1" - } - }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "node_modules/stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.5.tgz", - "integrity": "sha512-Lnh17webJVsD6ECeovpVN17RlAKjmz4rF9S+8Y45CkMc/ufVpTkU3vZIyIC7sllQ1FCvObZnnCdNs/HXTUOTlg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/style-loader": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.0.tgz", - "integrity": "sha512-uCcN7XWHkqwGVt7skpInW6IGO1tG6ReyFQ1Cseh0VcN6VdcFQi62aG/2F3Y9ueA8x4IVlfaSUxpmQXQD9QrEuQ==", - "dev": true, - "dependencies": { - "loader-utils": "^1.1.0", - "schema-utils": "^0.4.5" - }, - "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/style-loader/node_modules/schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "dependencies": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "node_modules/table": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", - "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", - "dev": true, - "dependencies": { - "ajv": "^6.0.1", - "ajv-keywords": "^3.0.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/table/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/table/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/table/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "dev": true, - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/terser/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, - "dependencies": { - "setimmediate": "^1.0.4" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/tiny-invariant": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz", - "integrity": "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/toposort": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", - "dev": true - }, - "node_modules/tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dependencies": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/tr46/node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ts-babel-node": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ts-babel-node/-/ts-babel-node-1.1.1.tgz", - "integrity": "sha1-P34N2/62sLa/pPKyQXlRA5evKcA=", - "dev": true, - "dependencies": { - "babel-core": "^6.9.1", - "babel-preset-es2015": "^6.9.0", - "source-map-support": "^0.4.0" - }, - "bin": { - "ts-babel-node": "bin/ts-babel-node.js" - }, - "peerDependencies": { - "ts-node": ">=0.9", - "typescript": "*" - } - }, - "node_modules/ts-babel-node/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ts-babel-node/node_modules/source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "dependencies": { - "source-map": "^0.5.6" - } - }, - "node_modules/ts-loader": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-4.5.0.tgz", - "integrity": "sha512-ihgVaSmgrX4crGV4n7yuoHPoCHbDzj9aepCZR9TgIx4SgJ9gdnB6xLHgUBb7bsFM/f0K6x9iXa65KY/Fu1Klkw==", - "dev": true, - "dependencies": { - "chalk": "^2.3.0", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^1.0.2", - "micromatch": "^3.1.4", - "semver": "^5.0.1" - }, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/ts-loader/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ts-loader/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ts-loader/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ts-mocha": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ts-mocha/-/ts-mocha-7.0.0.tgz", - "integrity": "sha512-7WfkQw1W6JZXG5m4E1w2e945uWzBoZqmnOHvpMu0v+zvyKLdUQeTtRMfcQsVEKsUnYL6nTyH4okRt2PZucmFXQ==", - "dev": true, - "dependencies": { - "ts-node": "7.0.1" - }, - "bin": { - "ts-mocha": "bin/ts-mocha" - }, - "engines": { - "node": ">= 6.X.X" - }, - "optionalDependencies": { - "tsconfig-paths": "^3.5.0" - }, - "peerDependencies": { - "mocha": "^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X" - } - }, - "node_modules/ts-mocha/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ts-mocha/node_modules/ts-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", - "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", - "dev": true, - "dependencies": { - "arrify": "^1.0.0", - "buffer-from": "^1.1.0", - "diff": "^3.1.0", - "make-error": "^1.1.1", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "source-map-support": "^0.5.6", - "yn": "^2.0.0" - }, - "bin": { - "ts-node": "dist/bin.js" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/ts-mocha/node_modules/yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ts-node": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.7.0.tgz", - "integrity": "sha512-s659CsHrsxaRVDEleuOkGvbsA0rWHtszUNEt1r0CgAFN5ZZTQtDzpsluS7W5pOGJIa1xZE8R/zK4dEs+ldFezg==", - "dev": true, - "dependencies": { - "arg": "^4.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.6", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "typescript": ">=2.7" - } - }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz", - "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", - "dev": true, - "optional": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "optional": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true - }, - "node_modules/tslint": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz", - "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=", - "dev": true, - "dependencies": { - "babel-code-frame": "^6.22.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^3.2.0", - "glob": "^7.1.1", - "js-yaml": "^3.7.0", - "minimatch": "^3.0.4", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.27.2" - }, - "bin": { - "tslint": "bin/tslint" - }, - "engines": { - "node": ">=4.8.0" - }, - "peerDependencies": { - "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev" - } - }, - "node_modules/tslint-loader": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/tslint-loader/-/tslint-loader-3.6.0.tgz", - "integrity": "sha512-Me9Qf/87BOfCY8uJJw+J7VMF4U8WiMXKLhKKKugMydF0xMhMOt9wo2mjYTNhwbF9H7SHh8PAIwRG8roisTNekQ==", - "deprecated": "TSLint is deprecated. As such migrate from tslint-loader to eslint-loader.", - "dev": true, - "dependencies": { - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1", - "object-assign": "^4.1.1", - "rimraf": "^2.4.4", - "semver": "^5.3.0" - }, - "peerDependencies": { - "tslint": ">=4.0.0" - } - }, - "node_modules/tslint-loader/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/tslint-no-unused-expression-chai": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/tslint-no-unused-expression-chai/-/tslint-no-unused-expression-chai-0.1.3.tgz", - "integrity": "sha512-dNnAc2f4M0KvyPNtEgiW2lS1LIss9Rg+cYI6x9J2NQeNt7FUI/5UfOJvsOERyog+D5+YeEzhkQSfSc4H7KMZLA==", - "dev": true, - "dependencies": { - "tsutils": "^2.3.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "tslint": ">=5.1.0" - } - }, - "node_modules/tslint-no-unused-expression-chai/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tslint-no-unused-expression-chai/node_modules/tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "peerDependencies": { - "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" - } - }, - "node_modules/tslint/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslint/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslint/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslint/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tslint/node_modules/tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "peerDependencies": { - "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" - } - }, - "node_modules/tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "node_modules/typescript": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.1.tgz", - "integrity": "sha512-cTmIDFW7O0IHbn1DPYjkiebHxwtCMU+eTy30ZtJNBPF9j2O1ITu5XH2YnBeVRKWHqF+3JQwWJv0Q0aUgX8W7IA==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/typings-for-css-modules-loader": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/typings-for-css-modules-loader/-/typings-for-css-modules-loader-1.7.0.tgz", - "integrity": "sha512-Mp7zDrcUmbUKl3JTLamTsMX+lntMotEm5I05j2RHB5EHb0WL1dAXlynpdlGR5Ye/QTvtL5w+RGB2jP32YoUpZw==", - "dev": true, - "dependencies": { - "colour": "0.7.1", - "graceful-fs": "4.1.4", - "loader-utils": "0.2.16" - }, - "peerDependencies": { - "css-loader": ">=0.23.1" - } - }, - "node_modules/typings-for-css-modules-loader/node_modules/big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/typings-for-css-modules-loader/node_modules/emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/typings-for-css-modules-loader/node_modules/graceful-fs": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", - "integrity": "sha1-7widKIDwM7ARgjzlyPrnmNp3Xb0=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/typings-for-css-modules-loader/node_modules/loader-utils": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.16.tgz", - "integrity": "sha1-8IYyBm7YKCg13/iN+1JwR2Wt7m0=", - "dev": true, - "dependencies": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - }, - "node_modules/uglify-js": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.0.tgz", - "integrity": "sha512-x+xdeDWq7FiORDvyIJ0q/waWd4PhjBNOm5dQUOq2AKC0IEjxOS66Ha9tctiVDGcRQuh69K7fgU5oRuTK4cysSg==", - "dev": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/uid-safe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", - "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", - "dev": true, - "dependencies": { - "random-bytes": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/underscore": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.2.tgz", - "integrity": "sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==", - "dev": true - }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/uri-js/node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true - }, - "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "dependencies": { - "inherits": "2.0.3" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "node_modules/util/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", - "dev": true, - "dependencies": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", - "xml-name-validator": "^3.0.0" - } - }, - "node_modules/wallaby-webpack": { - "version": "3.9.16", - "resolved": "https://registry.npmjs.org/wallaby-webpack/-/wallaby-webpack-3.9.16.tgz", - "integrity": "sha512-z252lpX5+SrE3DM/YM1XKqJNsYjO5Sd9ATPe9MZCvPHDJZk015OVkBbJqBlcTwOjSS3WCrMQzm6t9tgFnNYHIg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.3", - "lodash": "^4.17.10", - "minimatch": "3.0.3" - } - }, - "node_modules/wallaby-webpack/node_modules/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", - "dev": true, - "dependencies": { - "brace-expansion": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - }, - "optionalDependencies": { - "chokidar": "^3.4.1", - "watchpack-chokidar2": "^2.0.1" - } - }, - "node_modules/watchpack-chokidar2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "dev": true, - "optional": true, - "dependencies": { - "chokidar": "^2.1.8" - } - }, - "node_modules/watchpack/node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "optional": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/watchpack/node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/watchpack/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "optional": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/watchpack/node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "optional": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/watchpack/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "optional": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/watchpack/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/watchpack/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "optional": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/watchpack/node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "optional": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/watchpack/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/watchpack/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "optional": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/watchpack/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "optional": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "node_modules/webpack": { - "version": "4.41.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.2.tgz", - "integrity": "sha512-Zhw69edTGfbz9/8JJoyRQ/pq8FYUoY0diOXqW0T6yhgdhCv6wr0hra5DwwWexNRns2Z2+gsnrNcbe9hbGBgk/A==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.2.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.1", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.1", - "watchpack": "^1.6.0", - "webpack-sources": "^1.4.1" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/webpack-cli": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.0.tgz", - "integrity": "sha512-p5NeKDtYwjZozUWq6kGNs9w+Gtw/CPvyuXjXn2HMdz8Tie+krjEg8oAtonvIyITZdvpF7XG9xDHwscLr2c+ugQ==", - "dev": true, - "dependencies": { - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.0.0", - "global-modules-path": "^2.1.0", - "import-local": "^1.0.0", - "inquirer": "^6.0.0", - "interpret": "^1.1.0", - "loader-utils": "^1.1.0", - "supports-color": "^5.4.0", - "v8-compile-cache": "^2.0.0", - "yargs": "^12.0.1" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=6.11.5" - }, - "peerDependencies": { - "webpack": "^4.x.x" - } - }, - "node_modules/webpack-cli/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-cli/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-cli/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-cli/node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/webpack-cli/node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-cli/node_modules/inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/webpack-cli/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-cli/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "dependencies": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/webpack-merge": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.4.tgz", - "integrity": "sha512-TmSe1HZKeOPey3oy1Ov2iS3guIZjWvMT2BBJDzzT5jScHTjVC3mpjJofgueEzaEd6ibhxRDD6MIblDr8tzh8iQ==", - "dev": true, - "dependencies": { - "lodash": "^4.17.5" - } - }, - "node_modules/webpack-monitor": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/webpack-monitor/-/webpack-monitor-1.0.14.tgz", - "integrity": "sha512-FzydIARAepBv9CXVzJcOU51LQOb9jDGNqYT8ZpoQ3PETIvBoGq3r8nuJJEAgD/E9S6jDwgnSJY+kjkeHw91eLQ==", - "dev": true, - "dependencies": { - "babel-core": "^6.26.0", - "colors": "^1.1.2", - "express": "^4.15.5", - "opener": "^1.4.3", - "purify-css": "^1.2.6" - } - }, - "node_modules/webpack-node-externals": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-1.7.2.tgz", - "integrity": "sha512-ajerHZ+BJKeCLviLUUmnyd5B4RavLF76uv3cs6KNuO8W+HuQaEs0y0L7o40NQxdPy5w0pcv8Ew7yPUAQG0UdCg==", - "dev": true - }, - "node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/webpack/node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/webpack/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack/node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack/node_modules/terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "dev": true, - "dependencies": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "webpack": "^4.0.0" - } - }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/window": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/window/-/window-4.2.7.tgz", - "integrity": "sha512-goCWCr6B57F6V5HK92lfxwiGlswWyiUtu2Tkyr0L/co2L1Dn5SDayF9ZDTVoYqxfHRt7VEEC7SKbjDBU7TJPpg==", - "dev": true, - "dependencies": { - "jsdom": "13.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/window/node_modules/jsdom": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-13.2.0.tgz", - "integrity": "sha512-cG1NtMWO9hWpqRNRR3dSvEQa8bFI6iLlqU2x4kwX51FQjp0qus8T9aBaAO6iGp3DeBrhdwuKxckknohkmfvsFw==", - "dev": true, - "dependencies": { - "abab": "^2.0.0", - "acorn": "^6.0.4", - "acorn-globals": "^4.3.0", - "array-equal": "^1.0.0", - "cssom": "^0.3.4", - "cssstyle": "^1.1.1", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.0", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.0.9", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "saxes": "^3.1.5", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.5.0", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^6.1.2", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/window/node_modules/parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", - "dev": true - }, - "node_modules/window/node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/window/node_modules/request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dev": true, - "dependencies": { - "lodash": "^4.17.19" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/window/node_modules/request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "engines": { - "node": ">=0.12.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/window/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "dependencies": { - "errno": "~0.1.7" - } - }, - "node_modules/wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "dependencies": { - "mkdirp": "^0.5.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/write/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dev": true, - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "node_modules/xmlbuilder": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-13.0.2.tgz", - "integrity": "sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "dependencies": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "node_modules/yargs-parser": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", - "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/yargs-unparser": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", - "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", - "dev": true, - "dependencies": { - "flat": "^4.1.0", - "lodash": "^4.17.11", - "yargs": "^12.0.5" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz", - "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==", - "dev": true, - "requires": { - "@babel/highlight": "7.0.0-beta.44" - } - }, - "@babel/generator": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz", - "integrity": "sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ==", - "dev": true, - "requires": { - "@babel/types": "7.0.0-beta.44", - "jsesc": "^2.5.1", - "lodash": "^4.2.0", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/helper-function-name": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz", - "integrity": "sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "7.0.0-beta.44", - "@babel/template": "7.0.0-beta.44", - "@babel/types": "7.0.0-beta.44" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz", - "integrity": "sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw==", - "dev": true, - "requires": { - "@babel/types": "7.0.0-beta.44" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz", - "integrity": "sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA==", - "dev": true, - "requires": { - "@babel/types": "7.0.0-beta.44" - } - }, - "@babel/highlight": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz", - "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/runtime": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", - "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", - "requires": { - "regenerator-runtime": "^0.13.4" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - } - } - }, - "@babel/template": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz", - "integrity": "sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.44", - "@babel/types": "7.0.0-beta.44", - "babylon": "7.0.0-beta.44", - "lodash": "^4.2.0" - }, - "dependencies": { - "babylon": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", - "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", - "dev": true - } - } - }, - "@babel/traverse": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz", - "integrity": "sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.44", - "@babel/generator": "7.0.0-beta.44", - "@babel/helper-function-name": "7.0.0-beta.44", - "@babel/helper-split-export-declaration": "7.0.0-beta.44", - "@babel/types": "7.0.0-beta.44", - "babylon": "7.0.0-beta.44", - "debug": "^3.1.0", - "globals": "^11.1.0", - "invariant": "^2.2.0", - "lodash": "^4.2.0" - }, - "dependencies": { - "babylon": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", - "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", - "dev": true - }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz", - "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.2.0", - "to-fast-properties": "^2.0.0" - } - }, - "@types/applicationinsights-js": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/applicationinsights-js/-/applicationinsights-js-1.0.9.tgz", - "integrity": "sha512-tf2BBQFIRgaoxkii5Ys4Q2nvhPQ2PFt9FfgDc+xL7+XPi3s4ScqzRuAn8FRBCglnyzVvwEznOtdfqGREzUOkCw==", - "dev": true - }, - "@types/chai": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.7.tgz", - "integrity": "sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA==", - "dev": true - }, - "@types/chai-as-promised": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.0.tgz", - "integrity": "sha512-MFiW54UOSt+f2bRw8J7LgQeIvE/9b4oGvwU7XW30S9QGAiHGnU/fmiOprsyMkdmH2rl8xSPc0/yrQw8juXU6bQ==", - "dev": true, - "requires": { - "@types/chai": "*" - } - }, - "@types/chai-subset": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.2.tgz", - "integrity": "sha512-VMA1aOXwPEJADlj5ykmYv77YKmbEuAxiLz/+lT6vFIWQ1EA06jF01TytVBAbVTNk0pjfW1Uhw5R5MaEq426N0A==", - "dev": true, - "requires": { - "@types/chai": "*" - } - }, - "@types/cheerio": { - "version": "0.22.30", - "resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.30.tgz", - "integrity": "sha512-t7ZVArWZlq3dFa9Yt33qFBQIK4CQd1Q3UJp0V+UhP6vgLWLM6Qug7vZuRSGXg45zXeB1Fm5X2vmBkEX58LV2Tw==", - "requires": { - "@types/node": "*" - } - }, - "@types/classnames": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.2.7.tgz", - "integrity": "sha512-rzOhiQ55WzAiFgXRtitP/ZUT8iVNyllEpylJ5zHzR4vArUvMB39GTk+Zon/uAM0JxEFAWnwsxC2gH8s+tZ3Myg==", - "dev": true - }, - "@types/cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha512-64Uv+8bTRVZHlbB8eXQgMP9HguxPgnOOIYrQpwHWrtLDrtcG/lILKhUl7bV65NSOIJ9dXGYD7skQFXzhL8tk1A==", - "dev": true - }, - "@types/cookie_js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/cookie_js/-/cookie_js-1.2.1.tgz", - "integrity": "sha512-FUWgrNwHn3IjQDEJ47sLWWsX5ijaoysQQ/gKCQi5l7qUSOw4gO+l5wdIVngF1bfO2oeXITUJHmGb8w/xqAzuuA==", - "dev": true - }, - "@types/copy-webpack-plugin": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@types/copy-webpack-plugin/-/copy-webpack-plugin-4.4.2.tgz", - "integrity": "sha512-/L0m5kc7pKGpsu97TTgAP6YcVRmau2Wj0HpRPQBGEbZXT1DZkdozZPCZHGDWXpxcvWDFTxob2JmYJj3RC7CwFA==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/webpack": "*" - } - }, - "@types/deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha512-mMUu4nWHLBlHtxXY17Fg6+ucS/MnndyOWyOe7MmwkoMYxvfQU2ajtRaEvqSUv+aVkMqH/C0NCI8UoVfRNQ10yg==", - "dev": true - }, - "@types/enzyme": { - "version": "3.1.16", - "resolved": "https://registry.npmjs.org/@types/enzyme/-/enzyme-3.1.16.tgz", - "integrity": "sha512-j4IAiHw+g97PWbvFv+yk601zsHf2pCYe61JZi7XW38eiRM1Lgc2LwgB7Bjssd5xi7+JMqshNfKKUP6QjMiCJ0g==", - "requires": { - "@types/cheerio": "*", - "@types/react": "*" - } - }, - "@types/enzyme-adapter-react-16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.0.3.tgz", - "integrity": "sha512-9eRLBsC/Djkys05BdTWgav8v6fSCjyzjNuLwG2sfa2b2g/VAN10luP0zB0VwtOWFQ0LGjIboJJvIsVdU5gqRmg==", - "requires": { - "@types/enzyme": "*" - } - }, - "@types/enzyme-redux": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@types/enzyme-redux/-/enzyme-redux-0.2.1.tgz", - "integrity": "sha512-9DSyBY9CbzpNSwCB7pfMhO64RDhE4WbFaeS6eZSKfEeKqI2COvMzi6t0D2UPqcIIMowZUcGxKlyoJJa9vhbw8w==", - "dev": true, - "requires": { - "@types/enzyme": "*", - "@types/react": "*" - } - }, - "@types/enzyme-to-json": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@types/enzyme-to-json/-/enzyme-to-json-1.5.2.tgz", - "integrity": "sha512-3f5gJ+cf77nF4Erx/YmCdeP39Tk3iBjXl4yZOqQEHjriqqgYkYJDKDjOdKOsGsktOi/cTH+iXLbz6u66w1SUVA==", - "dev": true, - "requires": { - "@types/enzyme": "*" - } - }, - "@types/history": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/history/-/history-5.0.0.tgz", - "integrity": "sha512-hy8b7Y1J8OGe6LbAjj3xniQrj3v6lsivCcrmf4TzSgPzLkhIeKgc5IZnT7ReIqmEuodjfO8EYAuoFvIrHi/+jQ==", - "dev": true, - "requires": { - "history": "*" - } - }, - "@types/is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-tHpg9gRIF3kQRDtOH05Pd5e/lpA=", - "dev": true - }, - "@types/isomorphic-fetch": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/isomorphic-fetch/-/isomorphic-fetch-0.0.34.tgz", - "integrity": "sha1-PDSD5gbAQTeEOOlRRk8A5OYHBtY=", - "dev": true - }, - "@types/js-cookie": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.1.0.tgz", - "integrity": "sha512-vPT5MV1pD71RFUD0ytp6Yw51W6zKJ9Qn2AcJXSD2TZqYKaXUtCxB3WZIXXFZtbAEVMgC59nmvVPSOH0EIvkaZg==", - "dev": true - }, - "@types/jsdom": { - "version": "12.2.1", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-12.2.1.tgz", - "integrity": "sha512-VnLP1qW70OkzpMVuFsJPhxeIzEW1y+t91Fa2rE+b3UZ3ZiTwB28pYrdNj58wa0AQ+dV7eIBcdMFl3ql9C+cc9g==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/tough-cookie": "*", - "parse5": "^4.0.0" - } - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true, - "optional": true - }, - "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "@types/mocha": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.5.tgz", - "integrity": "sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==", - "dev": true - }, - "@types/node": { - "version": "10.12.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.21.tgz", - "integrity": "sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ==" - }, - "@types/prop-types": { - "version": "15.5.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.5.5.tgz", - "integrity": "sha512-mOrlCEdwX3seT3n0AXNt4KNPAZZxcsABUHwBgFXOt+nvFUXkxCAO6UBJHPrDxWEa2KDMil86355fjo8jbZ+K0Q==", - "requires": { - "@types/react": "*" - } - }, - "@types/react": { - "version": "16.4.12", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.4.12.tgz", - "integrity": "sha512-7XihF0BFk1wQfLNf+HAsfk6CEGMdqy592+qv0MAY38uDdSC/yYOa2k1g85oYFQkhCrWVL48c2oT1+QGfF0ABTg==", - "requires": { - "@types/prop-types": "*", - "csstype": "^2.2.0" - } - }, - "@types/react-dom": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.0.7.tgz", - "integrity": "sha512-vaq4vMaJOaNgFff1t3LnHYr6vRa09vRspMkmLdXtFZmO1fwDI2snP+dpOkwrtlU8UC8qsqemCu4RmVM2OLq/fA==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/react": "*" - } - }, - "@types/react-redux": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-6.0.6.tgz", - "integrity": "sha512-sD/QEn45h+CH0OAhCn6/9COlihZ94bzpP58QzYYCL3tOFta/WBhuvMoyLP8khJLfwQBx1PT70HP/1GnDws9YXQ==", - "dev": true, - "requires": { - "@types/react": "*", - "redux": "^4.0.0" - } - }, - "@types/react-router": { - "version": "4.0.30", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-4.0.30.tgz", - "integrity": "sha512-zWt5RpWy7x7semeBIHqLZ31A1Tle0jb3R/KD2wguZqO43DjP4n8kYsH7UIpve6I4hzlSObnoIieDcp5qfyKwaQ==", - "dev": true, - "requires": { - "@types/history": "*", - "@types/react": "*" - } - }, - "@types/react-router-dom": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-4.3.0.tgz", - "integrity": "sha512-vaq+nVUGyMnIhAl+svKHmfqhCoCNe5lf1UWmvVcsBlAcX0kznF25711DNFQ7B8/QZ+ZF1zzGq1dIi9bzxIu85w==", - "dev": true, - "requires": { - "@types/history": "*", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "@types/tapable": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-2.2.2.tgz", - "integrity": "sha512-ujqOVJEeLcwpDVJPnp/k3u1UXmTKq5urJq9fO8aUKg8Vlel5RNOFbVKEfqfh6wGfF/M+HiTJlBJMLC1aDfyf0Q==", - "dev": true, - "requires": { - "tapable": "^2.2.0" - } - }, - "@types/tough-cookie": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha512-MDQLxNFRLasqS4UlkWMSACMKeSm1x4Q3TxzUC7KQUsh6RK1ZrQ0VEyE3yzXcBu+K8ejVj4wuX32eUG02yNp+YQ==", - "dev": true - }, - "@types/uglify-js": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz", - "integrity": "sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - } - }, - "@types/webpack": { - "version": "4.4.11", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.4.11.tgz", - "integrity": "sha512-NdESmbpvVEtJgs15kyZYKr5ouLYPMYt9DNG5JEgCekbG/ezFLPCzf4XcAv8caOb+b7x6ieAuSt0eoR0UkSI7RA==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/tapable": "*", - "@types/uglify-js": "*", - "source-map": "^0.6.0" - } - }, - "@types/webpack-merge": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@types/webpack-merge/-/webpack-merge-4.1.3.tgz", - "integrity": "sha512-VdmNuYIvIouYlCI73NLKOE1pOVAxv5m5eupvTemojZz9dqghoQXmeEveI6CqeuWpCH6x6FLp6+tXM2sls20/MA==", - "dev": true, - "requires": { - "@types/webpack": "*" - } - }, - "@types/window-or-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/window-or-global/-/window-or-global-1.0.0.tgz", - "integrity": "sha1-tLyEgMN/5LrCNV96ksn/zYSCLJQ=", - "dev": true - }, - "@webassemblyjs/ast": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", - "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", - "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", - "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", - "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", - "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", - "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", - "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "mamacro": "^0.0.3" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", - "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", - "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", - "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", - "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", - "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", - "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/helper-wasm-section": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-opt": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "@webassemblyjs/wast-printer": "1.8.5" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", - "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", - "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-buffer": "1.8.5", - "@webassemblyjs/wasm-gen": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", - "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-wasm-bytecode": "1.8.5", - "@webassemblyjs/ieee754": "1.8.5", - "@webassemblyjs/leb128": "1.8.5", - "@webassemblyjs/utf8": "1.8.5" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", - "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/floating-point-hex-parser": "1.8.5", - "@webassemblyjs/helper-api-error": "1.8.5", - "@webassemblyjs/helper-code-frame": "1.8.5", - "@webassemblyjs/helper-fsm": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", - "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/wast-parser": "1.8.5", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true - }, - "acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", - "dev": true, - "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - } - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true, - "requires": {} - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "applicationinsights-js": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/applicationinsights-js/-/applicationinsights-js-1.0.20.tgz", - "integrity": "sha512-vN6fEv2fNPZtw76/mv5OJ44cTP/VzSDahdXVIGnRB5Apnf2/9PIl4IyWpwS9biG53I1sWvkw83RjdrAnsIKoRQ==" - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" - } - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "array.prototype.find": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.2.tgz", - "integrity": "sha512-00S1O4ewO95OmmJW7EesWfQlrCrLEL8kZ40w3+GkLX2yTt0m2ggcePPa2uHPJ9KUmJvwRq+lCV9bD8Yim23x/Q==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" - } - }, - "array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" - } - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "autoprefixer": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.1.3.tgz", - "integrity": "sha512-No9xrkPCGIHc9I52e+u1MuvkwfTOIXQt3tu+jGSONAJf4awvQmqOTWmk7JhA9Q3BTvBYIRdpS9PLFtrmpZcImg==", - "dev": true, - "requires": { - "browserslist": "^4.0.2", - "caniuse-lite": "^1.0.30000878", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^7.0.2", - "postcss-value-parser": "^3.2.3" - } - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-generator": "^6.26.0", - "babel-helpers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-register": "^6.26.0", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "convert-source-map": "^1.5.1", - "debug": "^2.6.9", - "json5": "^0.5.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "path-is-absolute": "^1.0.1", - "private": "^0.1.8", - "slash": "^1.0.0", - "source-map": "^0.5.7" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "babel-eslint": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.6.tgz", - "integrity": "sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.44", - "@babel/traverse": "7.0.0-beta.44", - "@babel/types": "7.0.0-beta.44", - "babylon": "7.0.0-beta.44", - "eslint-scope": "3.7.1", - "eslint-visitor-keys": "^1.0.0" - }, - "dependencies": { - "babylon": { - "version": "7.0.0-beta.44", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", - "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", - "dev": true - } - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "dev": true, - "requires": { - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "detect-indent": "^4.0.0", - "jsesc": "^1.3.0", - "lodash": "^4.17.4", - "source-map": "^0.5.7", - "trim-right": "^1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "babel-helper-bindify-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", - "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "dev": true, - "requires": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-builder-react-jsx": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", - "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "esutils": "^2.0.2" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-explode-class": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", - "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", - "dev": true, - "requires": { - "babel-helper-bindify-decorators": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, - "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-loader": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.5.tgz", - "integrity": "sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw==", - "dev": true, - "requires": { - "find-cache-dir": "^1.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", - "dev": true - }, - "babel-plugin-syntax-async-generators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", - "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", - "dev": true - }, - "babel-plugin-syntax-class-constructor-call": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", - "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=", - "dev": true - }, - "babel-plugin-syntax-class-properties": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", - "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", - "dev": true - }, - "babel-plugin-syntax-decorators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", - "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", - "dev": true - }, - "babel-plugin-syntax-do-expressions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz", - "integrity": "sha1-V0d1YTmqJtOQ0JQQsDdEugfkeW0=", - "dev": true - }, - "babel-plugin-syntax-dynamic-import": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", - "dev": true - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", - "dev": true - }, - "babel-plugin-syntax-export-extensions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", - "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=", - "dev": true - }, - "babel-plugin-syntax-flow": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", - "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", - "dev": true - }, - "babel-plugin-syntax-function-bind": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz", - "integrity": "sha1-SMSV8Xe98xqYHnMvVa3AvdJgH0Y=", - "dev": true - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", - "dev": true - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", - "dev": true - }, - "babel-plugin-transform-async-generator-functions": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", - "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-generators": "^6.5.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-class-constructor-call": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz", - "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", - "dev": true, - "requires": { - "babel-plugin-syntax-class-constructor-call": "^6.18.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-class-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", - "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-plugin-syntax-class-properties": "^6.8.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", - "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", - "dev": true, - "requires": { - "babel-helper-explode-class": "^6.24.1", - "babel-plugin-syntax-decorators": "^6.13.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-do-expressions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz", - "integrity": "sha1-KMyvkoEtlJws0SgfaQyP3EaK6bs=", - "dev": true, - "requires": { - "babel-plugin-syntax-do-expressions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "dev": true, - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-export-extensions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", - "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", - "dev": true, - "requires": { - "babel-plugin-syntax-export-extensions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-flow-strip-types": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", - "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", - "dev": true, - "requires": { - "babel-plugin-syntax-flow": "^6.18.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-function-bind": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz", - "integrity": "sha1-xvuOlqwpajELjPjqQBRiQH3fapc=", - "dev": true, - "requires": { - "babel-plugin-syntax-function-bind": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" - } - }, - "babel-plugin-transform-react-constant-elements": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-constant-elements/-/babel-plugin-transform-react-constant-elements-6.23.0.tgz", - "integrity": "sha1-LxGb9NLN1F65uqrldAU8YE9hR90=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-display-name": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", - "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-inline-elements": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-inline-elements/-/babel-plugin-transform-react-inline-elements-6.22.0.tgz", - "integrity": "sha1-ZochGjK0mlLyLFc6K1UEol7xfFM=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", - "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", - "dev": true, - "requires": { - "babel-helper-builder-react-jsx": "^6.24.1", - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx-self": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", - "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", - "dev": true, - "requires": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx-source": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", - "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", - "dev": true, - "requires": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "dev": true, - "requires": { - "regenerator-transform": "^0.10.0" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" - } - }, - "babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.24.1", - "babel-plugin-transform-es2015-classes": "^6.24.1", - "babel-plugin-transform-es2015-computed-properties": "^6.24.1", - "babel-plugin-transform-es2015-destructuring": "^6.22.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.24.1", - "babel-plugin-transform-es2015-for-of": "^6.22.0", - "babel-plugin-transform-es2015-function-name": "^6.24.1", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-systemjs": "^6.24.1", - "babel-plugin-transform-es2015-modules-umd": "^6.24.1", - "babel-plugin-transform-es2015-object-super": "^6.24.1", - "babel-plugin-transform-es2015-parameters": "^6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "^6.24.1", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.24.1", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.22.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.24.1", - "babel-plugin-transform-regenerator": "^6.24.1" - } - }, - "babel-preset-es2016": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2016/-/babel-preset-es2016-6.24.1.tgz", - "integrity": "sha1-+QC/k+LrwNJ235uKtZck6/2Vn4s=", - "dev": true, - "requires": { - "babel-plugin-transform-exponentiation-operator": "^6.24.1" - } - }, - "babel-preset-es2017": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2017/-/babel-preset-es2017-6.24.1.tgz", - "integrity": "sha1-WXvq37n38gi8/YoS6bKym4svFNE=", - "dev": true, - "requires": { - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^6.24.1" - } - }, - "babel-preset-flow": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", - "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", - "dev": true, - "requires": { - "babel-plugin-transform-flow-strip-types": "^6.22.0" - } - }, - "babel-preset-latest": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-latest/-/babel-preset-latest-6.24.1.tgz", - "integrity": "sha1-Z33gaRVKdIXC0lxXfAL2JLhbheg=", - "dev": true, - "requires": { - "babel-preset-es2015": "^6.24.1", - "babel-preset-es2016": "^6.24.1", - "babel-preset-es2017": "^6.24.1" - } - }, - "babel-preset-react": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", - "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", - "dev": true, - "requires": { - "babel-plugin-syntax-jsx": "^6.3.13", - "babel-plugin-transform-react-display-name": "^6.23.0", - "babel-plugin-transform-react-jsx": "^6.24.1", - "babel-plugin-transform-react-jsx-self": "^6.22.0", - "babel-plugin-transform-react-jsx-source": "^6.22.0", - "babel-preset-flow": "^6.23.0" - } - }, - "babel-preset-stage-0": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz", - "integrity": "sha1-VkLRUEL5E4TX5a+LyIsduVsDnmo=", - "dev": true, - "requires": { - "babel-plugin-transform-do-expressions": "^6.22.0", - "babel-plugin-transform-function-bind": "^6.22.0", - "babel-preset-stage-1": "^6.24.1" - } - }, - "babel-preset-stage-1": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz", - "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", - "dev": true, - "requires": { - "babel-plugin-transform-class-constructor-call": "^6.24.1", - "babel-plugin-transform-export-extensions": "^6.22.0", - "babel-preset-stage-2": "^6.24.1" - } - }, - "babel-preset-stage-2": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", - "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", - "dev": true, - "requires": { - "babel-plugin-syntax-dynamic-import": "^6.18.0", - "babel-plugin-transform-class-properties": "^6.24.1", - "babel-plugin-transform-decorators": "^6.24.1", - "babel-preset-stage-3": "^6.24.1" - } - }, - "babel-preset-stage-3": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", - "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", - "dev": true, - "requires": { - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-generator-functions": "^6.24.1", - "babel-plugin-transform-async-to-generator": "^6.24.1", - "babel-plugin-transform-exponentiation-operator": "^6.24.1", - "babel-plugin-transform-object-rest-spread": "^6.22.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "home-or-tmp": "^2.0.0", - "lodash": "^4.17.4", - "mkdirp": "^0.5.1", - "source-map-support": "^0.4.15" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - } - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "lodash": "^4.17.4" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.18.0", - "debug": "^2.6.8", - "globals": "^9.18.0", - "invariant": "^2.2.2", - "lodash": "^4.17.4" - }, - "dependencies": { - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true - } - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" - }, - "dependencies": { - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - } - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", - "dev": true - }, - "body-parser": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", - "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", - "dev": true, - "requires": { - "bytes": "3.1.1", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.6", - "raw-body": "2.4.2", - "type-is": "~1.6.18" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" - } - }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", - "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", - "dev": true - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", - "dev": true, - "requires": { - "callsites": "^2.0.0" - } - }, - "caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", - "dev": true, - "requires": { - "caller-callsite": "^2.0.0" - } - }, - "callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001301", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001301.tgz", - "integrity": "sha512-csfD/GpHMqgEL3V3uIgosvh+SVIQvCh43SNu9HRbP1lnxkKm1kjDG4f32PP571JplkLjfS+mg2p1gxR7MYrrIA==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", - "dev": true, - "requires": { - "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" - } - }, - "chai-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", - "dev": true, - "requires": { - "check-error": "^1.0.2" - } - }, - "chai-exclude": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/chai-exclude/-/chai-exclude-1.0.12.tgz", - "integrity": "sha512-7xJgaLhigf51U+s7k23vOLnXk4w/rIffmlnUu/ueYJg21sLyrTqCn3BxvOjbGNGYgXTQNFwjFX3lUnbcai0oCA==", - "dev": true, - "requires": { - "fclone": "^1.0.11" - } - }, - "chai-subset": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/chai-subset/-/chai-subset-1.6.0.tgz", - "integrity": "sha1-pdDKFOMpp5WW7XAFi2ZGvWmIz+k=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "cheerio": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", - "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", - "dev": true, - "requires": { - "cheerio-select": "^1.5.0", - "dom-serializer": "^1.3.2", - "domhandler": "^4.2.0", - "htmlparser2": "^6.1.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "tslib": "^2.2.0" - }, - "dependencies": { - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - } - } - }, - "cheerio-select": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz", - "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==", - "dev": true, - "requires": { - "css-select": "^4.1.3", - "css-what": "^5.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0", - "domutils": "^2.7.0" - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - } - } - }, - "classnames": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", - "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==", - "dev": true - }, - "clean-css": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", - "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - }, - "colour": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", - "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "concurrently": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-4.0.1.tgz", - "integrity": "sha512-D8UI+mlI/bfvrA57SeKOht6sEpb01dKk+8Yee4fbnkk1Ue8r3S+JXoEdFZIpzQlXJGtnxo47Wvvg/kG4ba3U6Q==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "date-fns": "^1.23.0", - "lodash": "^4.17.10", - "read-pkg": "^4.0.1", - "rxjs": "6.2.2", - "spawn-command": "^0.0.2-1", - "supports-color": "^4.5.0", - "tree-kill": "^1.1.0", - "yargs": "^12.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "rxjs": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz", - "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - }, - "dependencies": { - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - } - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - } - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "requires": { - "safe-buffer": "5.2.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, - "cookie_js": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie_js/-/cookie_js-1.2.2.tgz", - "integrity": "sha1-Ub7V8Clm4mZHtTaNH1l1tfAZBsQ=", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copy-webpack-plugin": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.0.tgz", - "integrity": "sha512-0sNrj/Sx7/cWA0k7CVQa0sdA/dzCybqSb0+GbhKuQdOlAvnAwgC2osmbAFOAfha7ZXnreoQmCq5oDjG3gP4VHw==", - "dev": true, - "requires": { - "cacache": "^12.0.3", - "find-cache-dir": "^2.1.0", - "glob-parent": "^3.1.0", - "globby": "^7.1.1", - "is-glob": "^4.0.1", - "loader-utils": "^1.2.3", - "minimatch": "^3.0.4", - "normalize-path": "^3.0.0", - "p-limit": "^2.2.1", - "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", - "webpack-log": "^2.0.0" - }, - "dependencies": { - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true - } - } - }, - "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "dev": true - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "dev": true, - "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - } - }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "requires": { - "node-fetch": "2.6.7" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - } - }, - "css-loader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.0.tgz", - "integrity": "sha512-tMXlTYf3mIMt3b0dDCOQFJiVvxbocJ5Ho577WiGPYPZcqVEO218L2iU22pDXzkTZCLDE+9AmGSUkWxeh/nZReA==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "css-selector-tokenizer": "^0.7.0", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash.camelcase": "^4.3.0", - "postcss": "^6.0.23", - "postcss-modules-extract-imports": "^1.2.0", - "postcss-modules-local-by-default": "^1.2.0", - "postcss-modules-scope": "^1.1.0", - "postcss-modules-values": "^1.3.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "css-select": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", - "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^5.1.0", - "domhandler": "^4.3.0", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-selector-tokenizer": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", - "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" - } - }, - "css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", - "dev": true, - "requires": { - "cssom": "0.3.x" - } - }, - "csstype": { - "version": "2.6.19", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.19.tgz", - "integrity": "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==" - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" - } - }, - "date-fns": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", - "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", - "dev": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "dir-glob": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", - "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "dev": true, - "requires": { - "path-type": "^3.0.0" - } - }, - "discontinuous-range": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", - "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", - "dev": true - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "dev": true - }, - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "dev": true, - "requires": { - "webidl-conversions": "^4.0.2" - } - }, - "domhandler": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", - "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.53", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.53.tgz", - "integrity": "sha512-rFveSKQczlcav+H3zkKqykU6ANseFwXwkl855jOIap5/0gnEcuIhv2ecz6aoTrXavF6I/CEBeRnBnkB51k06ew==", - "dev": true - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "optional": true, - "peer": true, - "requires": { - "iconv-lite": "^0.6.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "optional": true, - "peer": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - } - } - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, - "enzyme": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.8.0.tgz", - "integrity": "sha512-bfsWo5nHyZm1O1vnIsbwdfhU989jk+squU9NKvB+Puwo5j6/Wg9pN5CO0YJelm98Dao3NPjkDZk+vvgwpMwYxw==", - "dev": true, - "requires": { - "array.prototype.flat": "^1.2.1", - "cheerio": "^1.0.0-rc.2", - "function.prototype.name": "^1.1.0", - "has": "^1.0.3", - "is-boolean-object": "^1.0.0", - "is-callable": "^1.1.4", - "is-number-object": "^1.0.3", - "is-string": "^1.0.4", - "is-subset": "^0.1.1", - "lodash.escape": "^4.0.1", - "lodash.isequal": "^4.5.0", - "object-inspect": "^1.6.0", - "object-is": "^1.0.1", - "object.assign": "^4.1.0", - "object.entries": "^1.0.4", - "object.values": "^1.0.4", - "raf": "^3.4.0", - "rst-selector-parser": "^2.2.3", - "string.prototype.trim": "^1.1.2" - } - }, - "enzyme-adapter-react-16": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.9.1.tgz", - "integrity": "sha512-Egzogv1y77DUxdnq/CyHxLHaNxmSSKDDSDNNB/EiAXCZVFXdFibaNy2uUuRQ1n24T2m6KH/1Rw16XDRq+1yVEg==", - "dev": true, - "requires": { - "enzyme-adapter-utils": "^1.10.0", - "function.prototype.name": "^1.1.0", - "object.assign": "^4.1.0", - "object.values": "^1.1.0", - "prop-types": "^15.6.2", - "react-is": "^16.7.0", - "react-test-renderer": "^16.0.0-0" - }, - "dependencies": { - "enzyme-adapter-utils": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.14.0.tgz", - "integrity": "sha512-F/z/7SeLt+reKFcb7597IThpDp0bmzcH1E9Oabqv+o01cID2/YInlqHbFl7HzWBl4h3OdZYedtwNDOmSKkk0bg==", - "dev": true, - "requires": { - "airbnb-prop-types": "^2.16.0", - "function.prototype.name": "^1.1.3", - "has": "^1.0.3", - "object.assign": "^4.1.2", - "object.fromentries": "^2.0.3", - "prop-types": "^15.7.2", - "semver": "^5.7.1" - }, - "dependencies": { - "airbnb-prop-types": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz", - "integrity": "sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==", - "dev": true, - "requires": { - "array.prototype.find": "^2.1.1", - "function.prototype.name": "^1.1.2", - "is-regex": "^1.1.0", - "object-is": "^1.1.2", - "object.assign": "^4.1.0", - "object.entries": "^1.1.2", - "prop-types": "^15.7.2", - "prop-types-exact": "^1.2.0", - "react-is": "^16.13.1" - } - } - } - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "react-test-renderer": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.14.0.tgz", - "integrity": "sha512-L8yPjqPE5CZO6rKsKXRO/rVPiaCOy0tQQJbC+UjPNlobl5mad59lvPjwFsQHTvL03caVDIVr9x9/OSgDe6I5Eg==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "react-is": "^16.8.6", - "scheduler": "^0.19.1" - } - } - } - }, - "enzyme-redux": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/enzyme-redux/-/enzyme-redux-0.2.1.tgz", - "integrity": "sha1-fC6+vIpN1idJ1jLFoS1aI7yrwf8=", - "dev": true, - "requires": {} - }, - "enzyme-to-json": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/enzyme-to-json/-/enzyme-to-json-3.3.5.tgz", - "integrity": "sha512-DmH1wJ68HyPqKSYXdQqB33ZotwfUhwQZW3IGXaNXgR69Iodaoj8TF/D9RjLdz4pEhGq2Tx2zwNUIjBuqoZeTgA==", - "dev": true, - "requires": { - "lodash": "^4.17.4" - } - }, - "errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", - "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-denodeify": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-denodeify/-/es6-denodeify-0.1.5.tgz", - "integrity": "sha1-MdTV/pxVA+ElRgQ5MQ4WoqPznB8=", - "dev": true - }, - "es6-promise": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", - "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - } - }, - "eslint": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.4.0.tgz", - "integrity": "sha512-UIpL91XGex3qtL6qwyCQJar2j3osKxK9e3ano3OcGEIRM4oWIpCkDg9x95AXEC2wMs7PnxzOkPZ2gq+tsMS9yg==", - "dev": true, - "requires": { - "ajv": "^6.5.0", - "babel-code-frame": "^6.26.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^3.1.0", - "doctrine": "^2.1.0", - "eslint-scope": "^4.0.0", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^4.0.0", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", - "ignore": "^4.0.2", - "imurmurhash": "^0.1.4", - "inquirer": "^5.2.0", - "is-resolvable": "^1.1.0", - "js-yaml": "^3.11.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.5", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "regexpp": "^2.0.0", - "require-uncached": "^1.0.3", - "semver": "^5.5.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^4.0.3", - "text-table": "^0.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "eslint-config-react": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/eslint-config-react/-/eslint-config-react-1.1.7.tgz", - "integrity": "sha1-oJGND8R9DpvRYaRzCAIdqF0lhbM=", - "dev": true - }, - "eslint-plugin-react": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", - "integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.0.1", - "prop-types": "^15.6.2" - } - }, - "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "espree": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz", - "integrity": "sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==", - "dev": true, - "requires": { - "acorn": "^6.0.2", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - } - } - }, - "express": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", - "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", - "dev": true, - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.4.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.9.6", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", - "setprototypeof": "1.2.0", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true - }, - "fclone": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fclone/-/fclone-1.0.11.tgz", - "integrity": "sha1-EOhdo4v+p/xZk0HClu4ddyZu5kA=", - "dev": true - }, - "fetch-cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-0.7.2.tgz", - "integrity": "sha512-Udm6ls1tV/pR9+EOjTYW2aGBadN03zOgVwu6grybxOg9ufACq7wE1HY/jh06DOykXH9FLYJC2RbUD3kJZcJBRg==", - "dev": true, - "requires": { - "es6-denodeify": "^0.1.1", - "tough-cookie": "^2.3.1" - } - }, - "fetch-ponyfill": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/fetch-ponyfill/-/fetch-ponyfill-6.1.1.tgz", - "integrity": "sha512-rWLgTr5A44/XhvCQPYj0X9Tc+cjUaHofSM4lcwjc9MavD5lkjIhJ+h8JQlavPlTIgDpwhuRozaIykBvX9ItaSA==", - "dev": true, - "requires": { - "node-fetch": "~2.6.0" - } - }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - } - }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" - } - }, - "find-free-port": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-free-port/-/find-free-port-2.0.0.tgz", - "integrity": "sha1-SyLl9leesaOMQaxryz7+0bbamxs=", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "flat": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", - "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", - "dev": true, - "requires": { - "is-buffer": "~2.0.3" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true - } - } - }, - "flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", - "dev": true, - "requires": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" - }, - "dependencies": { - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "functions-have-names": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.2.tgz", - "integrity": "sha512-bLgc3asbWdwPbx2mNk2S49kmJCuQeu0nfmaOgbs8WIyzzkw3r4htszdIi9Q9EMezDPTYuJx2wvjZ/EwgAthpnA==", - "dev": true - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "global-modules-path": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.1.tgz", - "integrity": "sha512-y+shkf4InI7mPRHSo2b/k6ix6+NLDtyccYv86whhxrSGX9wjPX1VMITmrDbE1eh7zkzhiWtW2sHklJYoQ62Cxg==", - "dev": true - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "dir-glob": "^2.0.0", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - }, - "dependencies": { - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - } - } - }, - "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "dev": true - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "history": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/history/-/history-5.2.0.tgz", - "integrity": "sha512-uPSF6lAJb3nSePJ43hN3eKj1dTWpN9gMod0ZssbFTIsen+WehTmEadgL+kg78xLJFdRfrrC//SavDzmRVdE+Ig==", - "dev": true, - "requires": { - "@babel/runtime": "^7.7.6" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.1" - } - }, - "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", - "dev": true, - "requires": { - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "ignore-styles": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ignore-styles/-/ignore-styles-5.0.1.tgz", - "integrity": "sha1-tJ7yJ0va/NikiAqWa/440aC/RnE=", - "dev": true - }, - "import-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", - "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", - "dev": true, - "requires": { - "import-from": "^2.1.0" - } - }, - "import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", - "dev": true, - "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - } - }, - "import-from": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", - "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "import-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", - "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", - "dev": true, - "requires": { - "pkg-dir": "^2.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "inquirer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", - "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.1.0", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^5.5.2", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", - "dev": true, - "requires": { - "symbol-observable": "1.0.1" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "dev": true - } - } - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "dev": true - }, - "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", - "dev": true - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-subset": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", - "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", - "dev": true - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "js-cookie": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.0.tgz", - "integrity": "sha1-Gywnmm7s44ChIWi5JIUmWzWx7/s=", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "jsdom": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-12.0.0.tgz", - "integrity": "sha512-42RgZYXWwyClG0pN6Au7TExAQqRvzbtJhlcIvu58cJj4yr1bIbqZkgxHqn1btxKu80axZXPZLvldeTzg2auKow==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^5.7.1", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.1", - "domexception": "^1.0.1", - "escodegen": "^1.11.0", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.0.8", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.4.3", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.4", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^7.0.0", - "ws": "^6.0.0", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true - }, - "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", - "dev": true - }, - "request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dev": true, - "requires": { - "lodash": "^4.17.19" - } - }, - "request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "dev": true, - "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - } - } - }, - "jsdom-global": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsdom-global/-/jsdom-global-3.0.2.tgz", - "integrity": "sha1-a9KZwTsMRiay2iwDk81DhdYGrLk=", - "dev": true, - "requires": {} - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "jsx-ast-utils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz", - "integrity": "sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==", - "dev": true, - "requires": { - "array-includes": "^3.1.1", - "object.assign": "^4.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true - }, - "lodash.escape": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", - "integrity": "sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg=", - "dev": true - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - } - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true - }, - "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" - }, - "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "requires": { - "mime-db": "1.51.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "mini-css-extract-plugin": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.2.tgz", - "integrity": "sha512-ots7URQH4wccfJq9Ssrzu2+qupbncAce4TmTzunI9CIwlQMp2XI+WNUw6xWF6MMAGAm1cbUVINrSjATaVMyKXg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - } - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "mocha": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.1.4.tgz", - "integrity": "sha512-PN8CIy4RXsIoxoFJzS4QNnCH4psUCPWc4/rPrst/ecSJJbLBkubMiyGCP2Kj/9YnWbotFqAoeXyXMucj7gwCFg==", - "dev": true, - "requires": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "2.2.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "ms": "2.1.1", - "node-environment-flags": "1.0.5", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.2.2", - "yargs-parser": "13.0.0", - "yargs-unparser": "1.5.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "yargs": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", - "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.0.0" - } - } - } - }, - "mocha-multi-reporters": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/mocha-multi-reporters/-/mocha-multi-reporters-1.1.7.tgz", - "integrity": "sha1-zH8/TTL0eFIJQdhSq7ZNmYhYfYI=", - "dev": true, - "requires": { - "debug": "^3.1.0", - "lodash": "^4.16.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "mocha-trx-reporter": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/mocha-trx-reporter/-/mocha-trx-reporter-3.3.1.tgz", - "integrity": "sha512-nPCrSE588FDsdInlwAmLwJWEopNSgVX30Sz8Q0N1JM77D2VOf4PqraiGHxNb7bP2YULxr+K/ImJrl/2a+25jag==", - "dev": true, - "requires": { - "node-trx": "^0.9.1" - } - }, - "mocha-typescript": { - "version": "1.1.17", - "resolved": "https://registry.npmjs.org/mocha-typescript/-/mocha-typescript-1.1.17.tgz", - "integrity": "sha512-Ge6pCQkZumkkhxVNdAf3JxunskShgaynCb30HYD7TT1Yhog/7NW2+6w5RcRHI+nuQrCMTX6z1+qf2pD8qwCoQA==", - "dev": true, - "requires": { - "@types/mocha": "^5.2.0", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "yargs": "^11.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "yargs": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.1.tgz", - "integrity": "sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" - } - }, - "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, - "mochapack": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/mochapack/-/mochapack-1.1.1.tgz", - "integrity": "sha512-t8WchR4+38f0BO7+nBcUexqe1NNhzr8vsylOp5wF/J1EWP47T76KRVnZIrHHjxXdnp5JJHZtUD8C0pkJG2iv0g==", - "dev": true, - "requires": { - "babel-runtime": "^6.18.0", - "chalk": "^2.3.0", - "chokidar": "^2.0.4", - "glob-parent": "^3.1.0", - "globby": "^7.1.1", - "interpret": "^1.0.1", - "is-glob": "^4.0.0", - "loader-utils": "^1.1.0", - "lodash": "^4.3.0", - "memory-fs": "^0.4.1", - "nodent-runtime": "^3.0.3", - "normalize-path": "^2.0.1", - "progress": "^2.0.0", - "source-map-support": "^0.5.0", - "strip-ansi": "^4.0.0", - "toposort": "^1.0.0", - "yargs": "^11.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "yargs": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.1.tgz", - "integrity": "sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" - } - }, - "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, - "mock-http-server": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mock-http-server/-/mock-http-server-1.0.0.tgz", - "integrity": "sha1-yQCaWYKKRPXUHiDuE/AKvwXqdV4=", - "dev": true, - "requires": { - "body-parser": "^1.18.1", - "connect": "^3.4.0", - "multiparty": "^4.1.2", - "underscore": "^1.8.3" - } - }, - "monaco-editor": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.14.3.tgz", - "integrity": "sha512-RhaO4xXmWn/p0WrkEOXe4PoZj6xOcvDYjoAh0e1kGUrQnP1IOpc0m86Ceuaa2CLEMDINqKijBSmqhvBQnsPLHQ==" - }, - "monaco-editor-webpack-plugin": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/monaco-editor-webpack-plugin/-/monaco-editor-webpack-plugin-1.5.1.tgz", - "integrity": "sha512-EHBeIDZkvEQmhDbDOoUQA43Am+C74QLu6MoQpFTqD/gecdwKeGB5OG322moyn0n6SOncGftfoQ+A+y5BT5YIgQ==", - "dev": true, - "requires": {} - }, - "moo": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz", - "integrity": "sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w==", - "dev": true - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "multiparty": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/multiparty/-/multiparty-4.2.3.tgz", - "integrity": "sha512-Ak6EUJZuhGS8hJ3c2fY6UW5MbkGUPMBEGd13djUzoY/BHqV/gTuFWtC6IuVA7A2+v3yjBS6c4or50xhzTQZImQ==", - "dev": true, - "requires": { - "http-errors": "~1.8.1", - "safe-buffer": "5.2.1", - "uid-safe": "2.1.5" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "nearley": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", - "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", - "dev": true, - "requires": { - "commander": "^2.19.0", - "moo": "^0.5.0", - "railroad-diagrams": "^1.0.0", - "randexp": "0.4.6" - } - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - } - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { - "whatwg-url": "^5.0.0" - }, - "dependencies": { - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - } - }, - "node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", - "dev": true - }, - "node-trx": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/node-trx/-/node-trx-0.9.4.tgz", - "integrity": "sha512-3si71vvBF1QZLYKvoURz3csCFxECbGYra3emaslfjXilXq9OclLey0PXeeT2GAF8v9VAhIhei0w32bK+2FDw0Q==", - "dev": true, - "requires": { - "uuid": "^3.4.0", - "xmlbuilder": "^13.0.2" - } - }, - "nodent-runtime": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/nodent-runtime/-/nodent-runtime-3.2.1.tgz", - "integrity": "sha512-7Ws63oC+215smeKJQCxzrK21VFVlCFBkwl0MOObt0HOpVQXs3u483sAmtkF33nNqZ5rSOQjB76fgyPBmAUrtCA==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "nth-check": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", - "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - } - } - }, - "object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", - "dev": true - }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "object.fromentries": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", - "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true - }, - "parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dev": true, - "requires": { - "parse5": "^6.0.1" - }, - "dependencies": { - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - } - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "requires": { - "isarray": "0.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - }, - "pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "optional": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - } - } - }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true - }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", - "dev": true - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - } - } - }, - "postcss-load-config": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", - "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", - "dev": true, - "requires": { - "cosmiconfig": "^5.0.0", - "import-cwd": "^2.0.0" - } - }, - "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "postcss": "^7.0.0", - "postcss-load-config": "^2.0.0", - "schema-utils": "^1.0.0" - } - }, - "postcss-modules-extract-imports": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", - "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", - "dev": true, - "requires": { - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "dev": true, - "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "prop-types": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", - "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", - "requires": { - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" - } - }, - "prop-types-exact": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/prop-types-exact/-/prop-types-exact-1.2.0.tgz", - "integrity": "sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==", - "dev": true, - "requires": { - "has": "^1.0.3", - "object.assign": "^4.1.0", - "reflect.ownkeys": "^0.2.0" - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "purify-css": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/purify-css/-/purify-css-1.2.6.tgz", - "integrity": "sha512-FuK4G3s98k+nHJGgheSL6/4gbvc5DeM7IyxI0lW+jvAd6pRRAM5etRtBlPrrPdbJt2iO9kLt/+AGoJ6foJM23A==", - "dev": true, - "requires": { - "clean-css": "^4.0.12", - "glob": "^7.1.1", - "rework": "^1.0.1", - "uglify-js": "^3.0.6", - "yargs": "^8.0.1" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "read-pkg-up": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^7.0.0" - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } - } - }, - "qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "dev": true, - "requires": { - "performance-now": "^2.1.0" - } - }, - "railroad-diagrams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", - "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", - "dev": true - }, - "randexp": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", - "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", - "dev": true, - "requires": { - "discontinuous-range": "1.0.0", - "ret": "~0.1.10" - } - }, - "random-bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", - "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", - "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", - "dev": true, - "requires": { - "bytes": "3.1.1", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "react": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", - "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - } - }, - "react-dom": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", - "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "react-jsdom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/react-jsdom/-/react-jsdom-3.0.0.tgz", - "integrity": "sha512-eNZNL2X2MENs8rgpuHFn8mUZZrGpU/DP5jOZXykkwQCsyB2TkxhutO5KySwIpwiaJsj3f3gFJTvCb5oelGGWLQ==", - "dev": true, - "requires": { - "react-dom": "^16.3.1", - "window": "^4.1.1" - } - }, - "react-monaco-editor": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/react-monaco-editor/-/react-monaco-editor-0.18.0.tgz", - "integrity": "sha512-azMSMDF3eS9XFd9RWfujDInYvSQtdipozmEXSJRuJqsq3JmJlToOjMRSNEkTPmxnR6ZcI9DVhMImCLGNgUk5bQ==", - "requires": { - "@types/react": "*", - "monaco-editor": "^0.14.2", - "prop-types": "^15.6.2" - } - }, - "react-redux": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.0.7.tgz", - "integrity": "sha512-5VI8EV5hdgNgyjfmWzBbdrqUkrVRKlyTKk1sGH3jzM2M2Mhj/seQgPXaz6gVAj2lz/nz688AdTqMO18Lr24Zhg==", - "dev": true, - "requires": { - "hoist-non-react-statics": "^2.5.0", - "invariant": "^2.0.0", - "lodash": "^4.17.5", - "lodash-es": "^4.17.5", - "loose-envify": "^1.1.0", - "prop-types": "^15.6.0" - } - }, - "react-router": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz", - "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==", - "requires": { - "history": "^4.7.2", - "hoist-non-react-statics": "^2.5.0", - "invariant": "^2.2.4", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.1", - "warning": "^4.0.1" - }, - "dependencies": { - "history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "requires": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - } - } - }, - "react-router-dom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.3.1.tgz", - "integrity": "sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==", - "requires": { - "history": "^4.7.2", - "invariant": "^2.2.4", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.1", - "react-router": "^4.3.1", - "warning": "^4.0.1" - }, - "dependencies": { - "history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "requires": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - } - } - }, - "read-pkg": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", - "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", - "dev": true, - "requires": { - "normalize-package-data": "^2.3.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - } - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "redux": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.0.tgz", - "integrity": "sha512-NnnHF0h0WVE/hXyrB6OlX67LYRuaf/rJcbWvnHHEPCF/Xa/AZpwhs/20WyqzQae5x4SD2F9nPObgBh2rxAgLiA==", - "dev": true, - "requires": { - "loose-envify": "^1.1.0", - "symbol-observable": "^1.2.0" - } - }, - "redux-thunk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz", - "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==", - "dev": true - }, - "reflect.ownkeys": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz", - "integrity": "sha1-dJrO7H8/34tj+SegSAnpDFwLNGA=", - "dev": true - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true - }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "dev": true, - "requires": { - "babel-runtime": "^6.18.0", - "babel-types": "^6.19.0", - "private": "^0.1.6" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "dev": true, - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - }, - "dependencies": { - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "^0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - } - } - }, - "requirejs": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz", - "integrity": "sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==", - "dev": true - }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true - }, - "resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "rework": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", - "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", - "dev": true, - "requires": { - "convert-source-map": "^0.3.3", - "css": "^2.0.0" - }, - "dependencies": { - "convert-source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", - "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", - "dev": true - } - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rst-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", - "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", - "dev": true, - "requires": { - "lodash.flattendeep": "^4.4.0", - "nearley": "^2.7.10" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "saxes": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", - "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", - "dev": true, - "requires": { - "xmlchars": "^2.1.1" - } - }, - "scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "1.8.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.2" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0" - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-loader": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", - "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==", - "dev": true, - "requires": { - "async": "^2.5.0", - "loader-utils": "^1.1.0" - } - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true - }, - "spawn-command": { - "version": "0.0.2-1", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "dev": true - }, - "speed-measure-webpack-plugin": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.2.2.tgz", - "integrity": "sha512-OPssnUTAdOwl/ijqToLrYUi8xHxdC9SOVV9e2AxkOC02Hua7+Jkfh3tdFCZxiMbtlghHK5Eyz87kG/XNpeM77w==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true - }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "string.prototype.trim": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.5.tgz", - "integrity": "sha512-Lnh17webJVsD6ECeovpVN17RlAKjmz4rF9S+8Y45CkMc/ufVpTkU3vZIyIC7sllQ1FCvObZnnCdNs/HXTUOTlg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "style-loader": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.0.tgz", - "integrity": "sha512-uCcN7XWHkqwGVt7skpInW6IGO1tG6ReyFQ1Cseh0VcN6VdcFQi62aG/2F3Y9ueA8x4IVlfaSUxpmQXQD9QrEuQ==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^0.4.5" - }, - "dependencies": { - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "dev": true - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "table": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", - "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", - "dev": true, - "requires": { - "ajv": "^6.0.1", - "ajv-keywords": "^3.0.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true - }, - "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "dependencies": { - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "tiny-invariant": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz", - "integrity": "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==" - }, - "tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true - }, - "toposort": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dev": true, - "requires": { - "punycode": "^2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - } - } - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "ts-babel-node": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ts-babel-node/-/ts-babel-node-1.1.1.tgz", - "integrity": "sha1-P34N2/62sLa/pPKyQXlRA5evKcA=", - "dev": true, - "requires": { - "babel-core": "^6.9.1", - "babel-preset-es2015": "^6.9.0", - "source-map-support": "^0.4.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dev": true, - "requires": { - "source-map": "^0.5.6" - } - } - } - }, - "ts-loader": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-4.5.0.tgz", - "integrity": "sha512-ihgVaSmgrX4crGV4n7yuoHPoCHbDzj9aepCZR9TgIx4SgJ9gdnB6xLHgUBb7bsFM/f0K6x9iXa65KY/Fu1Klkw==", - "dev": true, - "requires": { - "chalk": "^2.3.0", - "enhanced-resolve": "^4.0.0", - "loader-utils": "^1.0.2", - "micromatch": "^3.1.4", - "semver": "^5.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "ts-mocha": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ts-mocha/-/ts-mocha-7.0.0.tgz", - "integrity": "sha512-7WfkQw1W6JZXG5m4E1w2e945uWzBoZqmnOHvpMu0v+zvyKLdUQeTtRMfcQsVEKsUnYL6nTyH4okRt2PZucmFXQ==", - "dev": true, - "requires": { - "ts-node": "7.0.1", - "tsconfig-paths": "^3.5.0" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ts-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", - "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", - "dev": true, - "requires": { - "arrify": "^1.0.0", - "buffer-from": "^1.1.0", - "diff": "^3.1.0", - "make-error": "^1.1.1", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "source-map-support": "^0.5.6", - "yn": "^2.0.0" - } - }, - "yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", - "dev": true - } - } - }, - "ts-node": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.7.0.tgz", - "integrity": "sha512-s659CsHrsxaRVDEleuOkGvbsA0rWHtszUNEt1r0CgAFN5ZZTQtDzpsluS7W5pOGJIa1xZE8R/zK4dEs+ldFezg==", - "dev": true, - "requires": { - "arg": "^4.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.6", - "yn": "3.1.1" - }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - } - } - }, - "tsconfig-paths": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz", - "integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==", - "dev": true, - "optional": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "optional": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true - }, - "tslint": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz", - "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=", - "dev": true, - "requires": { - "babel-code-frame": "^6.22.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^3.2.0", - "glob": "^7.1.1", - "js-yaml": "^3.7.0", - "minimatch": "^3.0.4", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.27.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "tslint-loader": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/tslint-loader/-/tslint-loader-3.6.0.tgz", - "integrity": "sha512-Me9Qf/87BOfCY8uJJw+J7VMF4U8WiMXKLhKKKugMydF0xMhMOt9wo2mjYTNhwbF9H7SHh8PAIwRG8roisTNekQ==", - "dev": true, - "requires": { - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1", - "object-assign": "^4.1.1", - "rimraf": "^2.4.4", - "semver": "^5.3.0" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - }, - "tslint-no-unused-expression-chai": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/tslint-no-unused-expression-chai/-/tslint-no-unused-expression-chai-0.1.3.tgz", - "integrity": "sha512-dNnAc2f4M0KvyPNtEgiW2lS1LIss9Rg+cYI6x9J2NQeNt7FUI/5UfOJvsOERyog+D5+YeEzhkQSfSc4H7KMZLA==", - "dev": true, - "requires": { - "tsutils": "^2.3.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typescript": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.1.tgz", - "integrity": "sha512-cTmIDFW7O0IHbn1DPYjkiebHxwtCMU+eTy30ZtJNBPF9j2O1ITu5XH2YnBeVRKWHqF+3JQwWJv0Q0aUgX8W7IA==", - "dev": true - }, - "typings-for-css-modules-loader": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/typings-for-css-modules-loader/-/typings-for-css-modules-loader-1.7.0.tgz", - "integrity": "sha512-Mp7zDrcUmbUKl3JTLamTsMX+lntMotEm5I05j2RHB5EHb0WL1dAXlynpdlGR5Ye/QTvtL5w+RGB2jP32YoUpZw==", - "dev": true, - "requires": { - "colour": "0.7.1", - "graceful-fs": "4.1.4", - "loader-utils": "0.2.16" - }, - "dependencies": { - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "graceful-fs": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz", - "integrity": "sha1-7widKIDwM7ARgjzlyPrnmNp3Xb0=", - "dev": true - }, - "loader-utils": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.16.tgz", - "integrity": "sha1-8IYyBm7YKCg13/iN+1JwR2Wt7m0=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - } - } - }, - "uglify-js": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.0.tgz", - "integrity": "sha512-x+xdeDWq7FiORDvyIJ0q/waWd4PhjBNOm5dQUOq2AKC0IEjxOS66Ha9tctiVDGcRQuh69K7fgU5oRuTK4cysSg==", - "dev": true - }, - "uid-safe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", - "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", - "dev": true, - "requires": { - "random-bytes": "~1.0.0" - } - }, - "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - } - }, - "underscore": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.2.tgz", - "integrity": "sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - } - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - } - } - }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", - "dev": true, - "requires": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", - "xml-name-validator": "^3.0.0" - } - }, - "wallaby-webpack": { - "version": "3.9.16", - "resolved": "https://registry.npmjs.org/wallaby-webpack/-/wallaby-webpack-3.9.16.tgz", - "integrity": "sha512-z252lpX5+SrE3DM/YM1XKqJNsYjO5Sd9ATPe9MZCvPHDJZk015OVkBbJqBlcTwOjSS3WCrMQzm6t9tgFnNYHIg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.3", - "lodash": "^4.17.10", - "minimatch": "3.0.3" - }, - "dependencies": { - "minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - } - } - } - }, - "warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", - "dev": true, - "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.1" - }, - "dependencies": { - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "optional": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "optional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "optional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "optional": true - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "optional": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "watchpack-chokidar2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "dev": true, - "optional": true, - "requires": { - "chokidar": "^2.1.8" - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "webpack": { - "version": "4.41.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.2.tgz", - "integrity": "sha512-Zhw69edTGfbz9/8JJoyRQ/pq8FYUoY0diOXqW0T6yhgdhCv6wr0hra5DwwWexNRns2Z2+gsnrNcbe9hbGBgk/A==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.8.5", - "@webassemblyjs/helper-module-context": "1.8.5", - "@webassemblyjs/wasm-edit": "1.8.5", - "@webassemblyjs/wasm-parser": "1.8.5", - "acorn": "^6.2.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.1", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.1", - "watchpack": "^1.6.0", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true - }, - "terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - } - } - } - }, - "webpack-cli": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.0.tgz", - "integrity": "sha512-p5NeKDtYwjZozUWq6kGNs9w+Gtw/CPvyuXjXn2HMdz8Tie+krjEg8oAtonvIyITZdvpF7XG9xDHwscLr2c+ugQ==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.0.0", - "global-modules-path": "^2.1.0", - "import-local": "^1.0.0", - "inquirer": "^6.0.0", - "interpret": "^1.1.0", - "loader-utils": "^1.1.0", - "supports-color": "^5.4.0", - "v8-compile-cache": "^2.0.0", - "yargs": "^12.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - } - }, - "webpack-merge": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.4.tgz", - "integrity": "sha512-TmSe1HZKeOPey3oy1Ov2iS3guIZjWvMT2BBJDzzT5jScHTjVC3mpjJofgueEzaEd6ibhxRDD6MIblDr8tzh8iQ==", - "dev": true, - "requires": { - "lodash": "^4.17.5" - } - }, - "webpack-monitor": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/webpack-monitor/-/webpack-monitor-1.0.14.tgz", - "integrity": "sha512-FzydIARAepBv9CXVzJcOU51LQOb9jDGNqYT8ZpoQ3PETIvBoGq3r8nuJJEAgD/E9S6jDwgnSJY+kjkeHw91eLQ==", - "dev": true, - "requires": { - "babel-core": "^6.26.0", - "colors": "^1.1.2", - "express": "^4.15.5", - "opener": "^1.4.3", - "purify-css": "^1.2.6" - } - }, - "webpack-node-externals": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-1.7.2.tgz", - "integrity": "sha512-ajerHZ+BJKeCLviLUUmnyd5B4RavLF76uv3cs6KNuO8W+HuQaEs0y0L7o40NQxdPy5w0pcv8Ew7yPUAQG0UdCg==", - "dev": true - }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "window": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/window/-/window-4.2.7.tgz", - "integrity": "sha512-goCWCr6B57F6V5HK92lfxwiGlswWyiUtu2Tkyr0L/co2L1Dn5SDayF9ZDTVoYqxfHRt7VEEC7SKbjDBU7TJPpg==", - "dev": true, - "requires": { - "jsdom": "13.2.0" - }, - "dependencies": { - "jsdom": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-13.2.0.tgz", - "integrity": "sha512-cG1NtMWO9hWpqRNRR3dSvEQa8bFI6iLlqU2x4kwX51FQjp0qus8T9aBaAO6iGp3DeBrhdwuKxckknohkmfvsFw==", - "dev": true, - "requires": { - "abab": "^2.0.0", - "acorn": "^6.0.4", - "acorn-globals": "^4.3.0", - "array-equal": "^1.0.0", - "cssom": "^0.3.4", - "cssstyle": "^1.1.1", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.0", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.0.9", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "saxes": "^3.1.5", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.5.0", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^6.1.2", - "xml-name-validator": "^3.0.0" - } - }, - "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dev": true, - "requires": { - "lodash": "^4.17.19" - } - }, - "request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "dev": true, - "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } - } - }, - "ws": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", - "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xmlbuilder": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-13.0.2.tgz", - "integrity": "sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - }, - "dependencies": { - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "yargs-parser": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", - "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yargs-unparser": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", - "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", - "dev": true, - "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.11", - "yargs": "^12.0.5" - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - } - } -} diff --git a/Microsoft.DotNet.Try.Client/package.json b/Microsoft.DotNet.Try.Client/package.json deleted file mode 100644 index 97843915d..000000000 --- a/Microsoft.DotNet.Try.Client/package.json +++ /dev/null @@ -1,141 +0,0 @@ -{ - "name": "trydotnet-client", - "version": "0.1.0", - "private": true, - "proxy": "http://localhost:3210", - "dependencies": { - "@types/enzyme-adapter-react-16": "1.0.3", - "applicationinsights-js": "1.0.20", - "cross-fetch": "3.1.5", - "deep-equal": "1.0.1", - "is-absolute-url": "2.1.0", - "monaco-editor": "0.14.3", - "prop-types": "15.6.2", - "react": "16.14.0", - "react-dom": "16.14.0", - "react-monaco-editor": "0.18.0", - "react-router-dom": "4.3.1", - "request": "2.88.0", - "rxjs": "6.4.0" - }, - "devDependencies": { - "@types/applicationinsights-js": "1.0.9", - "@types/chai": "4.1.7", - "@types/chai-as-promised": "7.1.0", - "@types/chai-subset": "1.3.2", - "@types/classnames": "2.2.7", - "@types/cookie": "0.3.1", - "@types/cookie_js": "1.2.1", - "@types/copy-webpack-plugin": "4.4.2", - "@types/deep-equal": "1.0.1", - "@types/enzyme": "3.1.16", - "@types/enzyme-redux": "0.2.1", - "@types/enzyme-to-json": "1.5.2", - "@types/is-absolute-url": "2.1.0", - "@types/isomorphic-fetch": "0.0.34", - "@types/js-cookie": "2.1.0", - "@types/jsdom": "12.2.1", - "@types/mocha": "5.2.5", - "@types/node": "10.12.21", - "@types/prop-types": "15.5.5", - "@types/react": "16.4.12", - "@types/react-dom": "16.0.7", - "@types/react-redux": "6.0.6", - "@types/react-router": "4.0.30", - "@types/react-router-dom": "4.3.0", - "@types/tough-cookie": "2.3.3", - "@types/webpack": "4.4.11", - "@types/webpack-merge": "4.1.3", - "@types/window-or-global": "1.0.0", - "autoprefixer": "9.1.3", - "babel-core": "6.26.3", - "babel-eslint": "8.2.6", - "babel-loader": "7.1.5", - "babel-plugin-transform-class-properties": "6.24.1", - "babel-plugin-transform-react-constant-elements": "6.23.0", - "babel-plugin-transform-react-inline-elements": "6.22.0", - "babel-polyfill": "6.26.0", - "babel-preset-es2015": "6.24.1", - "babel-preset-latest": "6.24.1", - "babel-preset-react": "6.24.1", - "babel-preset-stage-0": "6.24.1", - "babel-preset-stage-2": "6.24.1", - "babel-register": "6.26.0", - "chai": "4.2.0", - "chai-as-promised": "7.1.1", - "chai-exclude": "1.0.12", - "chai-subset": "1.6.0", - "classnames": "2.2.6", - "concurrently": "4.0.1", - "cookie": "0.3.1", - "cookie_js": "1.2.2", - "copy-webpack-plugin": "5.1.0", - "css-loader": "1.0.0", - "deep-eql": "3.0.1", - "enzyme": "3.8.0", - "enzyme-adapter-react-16": "1.9.1", - "enzyme-redux": "0.2.1", - "enzyme-to-json": "3.3.5", - "es6-promise": "4.2.4", - "eslint": "5.4.0", - "eslint-config-react": "1.1.7", - "eslint-plugin-react": "7.11.1", - "fetch-cookie": "0.7.2", - "fetch-ponyfill": "6.1.1", - "find-free-port": "2.0.0", - "har-validator": "5.1.3", - "ignore-styles": "5.0.1", - "js-cookie": "2.2.0", - "jsdom": "12.0.0", - "jsdom-global": "3.0.2", - "lodash": "4.17.21", - "mini-css-extract-plugin": "0.4.2", - "mkdirp": "1.0.4", - "mocha": "6.1.4", - "mocha-multi-reporters": "1.1.7", - "mocha-trx-reporter": "3.3.1", - "mocha-typescript": "1.1.17", - "mochapack": "1.1.1", - "mock-http-server": "1.0.0", - "monaco-editor-webpack-plugin": "1.5.1", - "postcss-loader": "3.0.0", - "react-jsdom": "3.0.0", - "react-redux": "5.0.7", - "react-router": "4.3.1", - "redux": "4.0.0", - "redux-thunk": "2.3.0", - "requirejs": "2.3.6", - "source-map-loader": "0.2.4", - "source-map-support": "0.5.9", - "speed-measure-webpack-plugin": "1.2.2", - "style-loader": "0.23.0", - "tough-cookie": "2.4.3", - "ts-babel-node": "1.1.1", - "ts-loader": "4.5.0", - "ts-mocha": "7.0.0", - "ts-node": "8.7.0", - "tslint": "5.11.0", - "tslint-loader": "3.6.0", - "tslint-no-unused-expression-chai": "0.1.3", - "typescript": "3.3.1", - "typings-for-css-modules-loader": "1.7.0", - "wallaby-webpack": "3.9.16", - "webpack": "4.41.2", - "webpack-cli": "3.1.0", - "webpack-merge": "4.1.4", - "webpack-monitor": "1.0.14", - "webpack-node-externals": "1.7.2" - }, - "scripts": { - "build": "webpack -p --config ./webpack.config/nonTest/prod/webpack.config.ts", - "buildDev": "webpack --config webpack.config/nonTest/dev/webpack.config.ts", - "buildCi": "webpack -p --config ./webpack.config/nonTest/prod/webpack.config.ci.ts", - "ciTest": "npm test -- --reporter mocha-multi-reporters --reporter-options configFile=testConfig.json", - "dev": "concurrently \"webpack --config ./webpack.config/nonTest/dev/webpack.config.ts\" \"cd .. && dotnet run\"", - "devNoOrchestrator": "webpack --watch --config ./webpack.config/nonTest/dev/webpack.config.ts", - "profile": "webpack -p --inline --progress --colors --profile --config ./webpack.config/nonTest/profile/webpack.config.ts", - "tdd": "npm test -- --watch", - "ciCreateDir": "npx mkdirp ", - "test": "mochapack --opts mocha.opts" - } -} diff --git a/Microsoft.DotNet.Try.Client/src/ApplicationInsights.ts b/Microsoft.DotNet.Try.Client/src/ApplicationInsights.ts deleted file mode 100644 index b2cf7a262..000000000 --- a/Microsoft.DotNet.Try.Client/src/ApplicationInsights.ts +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -// workaround: https://github.com/Microsoft/ApplicationInsights-JS/issues/476#issuecomment-341041379 -// @ts-ignore -global.define = () => {}; - -import { AppInsights } from "applicationinsights-js"; - -export interface IApplicationInsightsClient { - trackEvent(name: string, properties?: { [key: string]: string }, measurements?: { [key: string]: number }): void; - trackDependency(method: string, absoluteUrl: string, pathName: string, totalTime: number, success: boolean, resultCode: number, operationId?: string): void; - trackException(exception: Error, handledAt?: string, properties?: { [key: string]: string }, measurements?: { [key: string]: number }, severityLevel?: AI.SeverityLevel): void; -} - -export interface AIClientFactory { - (referrer: URL): IApplicationInsightsClient; -} - -export class NullAIClient implements IApplicationInsightsClient { - public trackException(_exception: Error, _handledAt?: string, _properties?: { [key: string]: string; }, _measurements?: { [key: string]: number; }, _severityLevel?: AI.SeverityLevel): void { - } - - public trackEvent(_name: string, _properties?: { [key: string]: string; }, _measurements?: { [key: string]: number; }): void { - } - - public trackDependency(_method: string, _absoluteUrl: string, _pathName: string, _totalTime: number, _success: boolean, _resultCode: number, _operationId?: string): void { - } -} - -function addReferrerToProperties(referrer: URL, properties?: { [key: string]: string; }): { [key: string]: string; } { - if (referrer !== undefined && referrer !== null) { - if (!properties) { - properties = {}; - } - properties["referrer"] = referrer.href; - } - return properties; -} - -export class ApplicationInsightsClient implements IApplicationInsightsClient { - constructor(private referrer: URL) { - } - - public trackException(exception: Error, handledAt?: string, properties?: { [key: string]: string; }, measurements?: { [key: string]: number; }, severityLevel?: AI.SeverityLevel): void { - if (AppInsights && AppInsights.trackException) { - try { - properties = addReferrerToProperties(this.referrer, properties); - AppInsights.trackException( - exception, - handledAt, - properties, - measurements, - severityLevel); - } - catch (ex) { - } - } - } - - public trackEvent(name: string, properties?: { [key: string]: string; }, measurements?: { [key: string]: number; }): void { - if (AppInsights && AppInsights.trackDependency) { - try { - properties = addReferrerToProperties(this.referrer, properties); - AppInsights.trackEvent( - name, - properties, - measurements); - - } - catch (ex) { - } - } - } - - public trackDependency(method: string, absoluteUrl: string, pathName: string, totalTime: number, success: boolean, resultCode: number, operationId?: string): void { - if (AppInsights && AppInsights.trackDependency) { - try { - AppInsights.trackDependency(operationId ? operationId : this.GetAiId(), method, absoluteUrl, pathName, totalTime, success, resultCode); - } - catch (ex) { - } - } - } - - private GetAiId(): string { - try { - return Microsoft.ApplicationInsights.UtilHelpers.newId(); - } - catch (ex) { - return "an-id"; - } - } -} diff --git a/Microsoft.DotNet.Try.Client/src/ICompletionItem.ts b/Microsoft.DotNet.Try.Client/src/ICompletionItem.ts deleted file mode 100644 index 40d1b91ea..000000000 --- a/Microsoft.DotNet.Try.Client/src/ICompletionItem.ts +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as monacoEditor from "monaco-editor"; - -export default interface ICompletionItem extends monacoEditor.languages.CompletionItem { - acceptanceUri?: string; -} diff --git a/Microsoft.DotNet.Try.Client/src/IMlsClient.ts b/Microsoft.DotNet.Try.Client/src/IMlsClient.ts deleted file mode 100644 index a1e4668a0..000000000 --- a/Microsoft.DotNet.Try.Client/src/IMlsClient.ts +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import { IDiagnostic, IInstrumentation, IWorkspace, IGistWorkpaceInfo, IVariableLocation } from "./IState"; - -import { IWorkspaceRequest } from "./IMlsClient"; -import * as monacoEditor from "monaco-editor"; -import ICompletionItem from "./ICompletionItem"; -import { CreateProjectFromGistRequest, CreateProjectResponse, CreateRegionsFromFilesRequest, CreateRegionsFromFilesResponse } from "./clientApiProtocol"; -import { ClientConfiguration } from "./clientConfiguration"; - -export default interface IMlsClient { - getSourceCode: (from: IWorkspaceRequest) => Promise; - getWorkspaceFromGist(gistId: string, workspaceType: string, extractBuffers: boolean): Promise; - run: (args: IRunRequest) => Promise; - compile: (args: IRunRequest) => Promise; - acceptCompletionItem: (selection: ICompletionItem) => Promise; - getCompletionList: (workspace: IWorkspace, bufferId: string, position: number, completionProvider: string) => Promise; - getSignatureHelp: (workspace: IWorkspace, bufferId: string, position: number) => Promise; - getDiagnostics: (workspace: IWorkspace, bufferId: string) => Promise; - createProjectFromGist: (request: CreateProjectFromGistRequest) => Promise; - createRegionsFromProjectFiles: (request: CreateRegionsFromFilesRequest) => Promise; - getConfiguration: () => Promise; -} - -export type CompletionResult = { - items: ICompletionItem[], - diagnostics: IDiagnostic[] -}; - -export type SignatureHelpResult = { - signatures: monacoEditor.languages.SignatureInformation[]; - activeSignature: number; - activeParameter: number; - diagnostics: IDiagnostic[] -}; - -export type DiagnosticResult = { - diagnostics: IDiagnostic[] -}; - -export interface IGistWorkspace extends IGistWorkpaceInfo { - workspace: IWorkspace; -} - -export interface IRunRequest { - workspace: IWorkspace; - requestId?: string; - [key: string]: any; -} - -export interface IRunResponse { - exception?: string; - output?: string[]; - succeeded?: boolean; - diagnostics?: IDiagnostic[]; - instrumentation?: IInstrumentation[]; - variableLocations?: IVariableLocation[]; - requestId?: string; -} - - -export interface ICompileResponse { - succeeded?: boolean; - diagnostics?: IDiagnostic[]; - base64assembly?: string; - requestId?: string; -} - -export interface IMlsCompletionItem { - acceptanceUri?: string; - displayText?: string; - documentation: string; - filterText?: string; - insertText?: string; - kind?: string; - sortText?: string; -} - -export interface ISignatureHelpResponse { - signatures: ISignatureHelpItem[]; - activeSignature: number; - activeParameter: number; -} - -export interface ISignatureHelpItem { - name: string; - label: string; - documentation: string; - parameters: ISignatureHelpParameter[]; -} - -export interface ISignatureHelpParameter { - name: string; - label: string; - documetation: string; -} - -export interface IWorkspaceRequest { - sourceUri: string; -} - -export interface IWorkspaceResponse { - buffer: string; -} - -export interface ApiError { - code: "TimeoutError" | "ConfigurationVersionError"; -} diff --git a/Microsoft.DotNet.Try.Client/src/IState.ts b/Microsoft.DotNet.Try.Client/src/IState.ts deleted file mode 100644 index 39bb148c3..000000000 --- a/Microsoft.DotNet.Try.Client/src/IState.ts +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import IMlsClient from "./IMlsClient"; -import * as monacoEditor from "monaco-editor"; -import { ICodeEditorForTryDotNet } from "./constants/ICodeEditorForTryDotNet"; -import { IApplicationInsightsClient } from "./ApplicationInsights"; -import { SupportedLanguages } from "./constants/supportedLanguages"; -export default interface IState { - compile: ICompileState; - config: IConfigState; - monaco: IMonacoState; - run: IRunState; - ui: IUiState; - workspace: IWorkspaceState; - workspaceInfo: IWorkspaceInfo; - wasmRunner: IWasmRunnerState; -} - -export interface ICompileState { - succeeded?: boolean; - diagnostics?: IDiagnostic[]; - base64assembly?: string; - workspaceVersion: number; -} - -export interface IUiState { - canShowGitHubPanel?: boolean; - canEdit?: boolean; - canRun?: boolean; - showEditor?: boolean; - [x: string]: any; - showCompletions?: boolean; - additionalUsings?: string[]; - workspaceType?: string; - isRunning?: boolean; - instrumentationActive?: boolean; - enableBranding?: boolean; -} - -export interface IWasmRunnerState { - payload: object; - callback: (obj: any) => void; - sequence: number; -} - -export interface IRunState { - exception?: string | Error; - output?: string[]; - fullOutput?: string[]; - succeeded?: boolean; - [x: string]: any; - diagnostics?: IDiagnostic[]; - instrumentation?: IInstrumentation[]; - currentInstrumentationStep?: number; - variableLocations?: IVariableLocation[]; -} - -export interface IVariableLocation { - name: string; - locations: IFileLocationSpan[]; - declaredAt: IVarDeclaration; -} - -export interface IFileLocationSpan { - startLine: number; - endLine: number; - startColumn: number; - endColumn: number; -} - -export interface IDiagnostic { - start: number; - end: number; - message: string; - severity: number; -} - -export interface IInstrumentation { - output?: IInstrumentationOutput; - filePosition?: IFilePosition; - stackTrace?: string; - locals?: IVariable[]; - parameters?: IVariable[]; - fields?: IVariable[]; -} - -export interface IInstrumentationOutput { - end: number; - start: number; -} - -export interface IFilePosition { - character: number; - line: number; - file?: string; -} - -export interface IVariable { - name: string; - value: string; - declaredAt: IVarDeclaration; -} - -export interface IVarDeclaration { - start: number; - end: number; -} - -export interface IMonacoState { - editor?: ICodeEditorForTryDotNet; - editorOptions?: monacoEditor.editor.IEditorOptions; - displayedCode?: string; - theme?: string; - themes?: { [x: string]: monacoEditor.editor.IStandaloneThemeData }; - bufferId?: string; - language?: SupportedLanguages; - [x: string]: any; -} - -export interface IConfigState { - completionProvider?: string; - client?: IMlsClient; - from?: string; - [x: string]: any; - version?: number; - defaultWorkspace?: IWorkspace; - defaultCodeFragment?: string; - useLocalCodeRunner?: boolean; - hostOrigin?: URL; - applicationInsightsClient?: IApplicationInsightsClient; - editorId?: string; -} - -export interface IWorkspaceState { - workspace: IWorkspace; - sequenceNumber: number; - useWasmRunner: boolean; -} - -export interface IWorkspace { - workspaceType: string; - language?: string; - files?: IWorkspaceFile[]; - buffers: IWorkspaceBuffer[]; - usings?: string[]; - includeInstrumentation?: boolean; - activeBufferId?: string; -} - -export interface IWorkspaceFile { - name: string; - text: string; -} - -export interface IWorkspaceBuffer { - id: string; - content: string; - position: number; -} - -export interface IWorkspaceInfo { - originType: string; -} - -export interface IGistWorkpaceInfo extends IWorkspaceInfo { - htmlUrl: string; - rawFileUrls: IRawFileUrl[]; -} - -export interface IRawFileUrl { - fileName: string; - url: string; -} diff --git a/Microsoft.DotNet.Try.Client/src/IStore.tsx b/Microsoft.DotNet.Try.Client/src/IStore.tsx deleted file mode 100644 index 661a0b40e..000000000 --- a/Microsoft.DotNet.Try.Client/src/IStore.tsx +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import { Store, AnyAction } from "redux"; -import { ThunkDispatch } from "redux-thunk"; -import IState from "./IState"; - -export type IStore = Store & { dispatch: ThunkDispatch }; diff --git a/Microsoft.DotNet.Try.Client/src/MlsClient.ts b/Microsoft.DotNet.Try.Client/src/MlsClient.ts deleted file mode 100644 index d4d012059..000000000 --- a/Microsoft.DotNet.Try.Client/src/MlsClient.ts +++ /dev/null @@ -1,423 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import { ICanFetch } from "./MlsClient"; -import IMlsClient, { IMlsCompletionItem, IRunRequest, IWorkspaceRequest, IWorkspaceResponse, IGistWorkspace, IRunResponse, ApiError, ICompileResponse, CompletionResult, SignatureHelpResult, DiagnosticResult } from "./IMlsClient"; -import { CookieGetter } from "./constants/CookieGetter"; -import { IWorkspace } from "./IState"; -import ServiceError from "./ServiceError"; -import { ClientConfiguration, RequestDescriptor, extractApiRequest, ApiRequest } from "./clientConfiguration"; -import ICompletionItem from "./ICompletionItem"; -import { IApplicationInsightsClient } from "./ApplicationInsights"; -import { CreateProjectFromGistRequest, CreateProjectResponse, CreateRegionsFromFilesRequest, CreateRegionsFromFilesResponse } from "./clientApiProtocol"; - -export interface ICanFetch { - (uri: string, request: Request): Promise; -} - -export interface Headers { - [key: string]: string; -} - -export interface Request { - body?: string; - credentials?: RequestCredentials; - headers: Headers; - method: string; -} - -export interface Response { - json?: () => Promise; - text?: () => Promise; - ok: boolean; - status?: number; - statusText?: string; - headers?: { - map: { - [x: string]: string; - }; - }; -} - -const XsrfTokenKey = "XSRF-TOKEN"; - -const acceptCompletionKey = "acceptCompletion"; -const signatureHelpKey = "signatureHelp"; -const completionKey = "completion"; -const diagnosticsKey = "diagnostics"; -const loadFromGistKey = "loadFromGist"; -const runKey = "run"; -const compileKey = "compile"; -const snippetKey = "snippet"; -const projectFromGistKey = "projectFromGist"; -const regionsFromFilesKey = "regionsFromFiles"; - -export default class MlsClient implements IMlsClient { - constructor(fetch: ICanFetch, - hostOrigin: URL, - getCookie: CookieGetter = null, - aiClient: IApplicationInsightsClient, - trydotnetBaseAddress: URL) { - this.fetch = fetch; - this.trydotnetBaseAddress = trydotnetBaseAddress; - this.getCookie = getCookie; - this.clientConfigurationUri = new URL(this.trydotnetBaseAddress.href); - this.clientConfigurationUri.pathname = "clientConfiguration"; - this.hostOrigin = hostOrigin; - this.clientConfiguration = null; - this.aiClient = aiClient; - - if (hostOrigin) { - this.clientConfigurationUri.searchParams.append("hostOrigin", hostOrigin.href); - } - } - - private aiClient: IApplicationInsightsClient; - private fetch: ICanFetch; - private trydotnetBaseAddress: URL; - private clientConfigurationUri: URL; - private getCookie: CookieGetter; - private clientConfiguration: ClientConfiguration; - - private runRequestDescriptor: RequestDescriptor; - - private compileRequestDescriptor: RequestDescriptor; - private snippetRequestDescriptor: RequestDescriptor; - private loadFromGistRequestDescriptor: RequestDescriptor; - private completionRequestDescriptor: RequestDescriptor; - private signatureHelpRequestDescriptor: RequestDescriptor; - private acceptCompletionItemRequestDescriptor: RequestDescriptor; - private diagnosticsRequestDescriptor: RequestDescriptor; - - private projectFromGistRequestDescriptor: RequestDescriptor; - private regionsFromFilesRequestDescriptor: RequestDescriptor; - - private hostOrigin: URL; - - public async getSourceCode(from: IWorkspaceRequest): Promise { - return this.fetchWithConfigurationRetry( - () => this.snippetRequestDescriptor, - { from: from.sourceUri }); - } - - public compile(runRequest: IRunRequest): Promise { - return this.fetchWithConfigurationRetry( - () => this.compileRequestDescriptor, - null, - runRequest); - } - - public run(runRequest: IRunRequest): Promise { - return this.fetchWithConfigurationRetry( - () => this.runRequestDescriptor, - null, - runRequest); - } - - public async getWorkspaceFromGist(gistId: string, workspaceType: string, extractBuffers: boolean = false): Promise { - let gistInfo = this.parseGistId(gistId); - return this.fetchWithConfigurationRetry( - () => this.loadFromGistRequestDescriptor, - { workspaceType, extractBuffers, gistId: gistInfo.gist, commitHash: gistInfo.commitHash }); - } - - public async createProjectFromGist(request: CreateProjectFromGistRequest): Promise { - return this.fetchWithConfigurationRetry( - () => this.projectFromGistRequestDescriptor, - null, - request); - } - - public async createRegionsFromProjectFiles(request: CreateRegionsFromFilesRequest): Promise { - return this.fetchWithConfigurationRetry( - () => this.regionsFromFilesRequestDescriptor, - null, - request); - } - - public async getCompletionList(workspace: IWorkspace, bufferId: string, position: number, completionProvider: string): Promise { - let result = await this.fetchWithConfigurationRetry( - () => this.completionRequestDescriptor, - { completionProvider }, - { - workspace, - activeBufferId: bufferId, - position: position - }); - - return { - items: this.mapCompletionKindToMonacoKind(result), - diagnostics: result.diagnostics - }; - } - - public async getSignatureHelp(workspace: IWorkspace, bufferId: string, position: number): Promise { - let result = await this.fetchWithConfigurationRetry( - () => this.signatureHelpRequestDescriptor, - null, - { - workspace, - activeBufferId: bufferId, - position - }); - - return { - signatures: result.signatures, - activeParameter: result.activeParameter, - activeSignature: result.activeSignature, - diagnostics: result.diagnostics - }; - } - - public async getDiagnostics(workspace: IWorkspace, bufferId: string): Promise { - let result = await this.fetchWithConfigurationRetry( - () => this.diagnosticsRequestDescriptor, - null, - { - workspace, - activeBufferId: bufferId - }); - - return { - diagnostics: result.diagnostics - }; - } - - public async acceptCompletionItem(selection: ICompletionItem): Promise { - if (selection && selection.acceptanceUri) { - return this.fetchWithConfigurationRetry( - () => this.acceptCompletionItemRequestDescriptor, - { - acceptanceUri: selection.acceptanceUri - }); - } - } - - public async getConfiguration(): Promise { - var request = this.createPostRequest({}); - this.addXsrfTokenToRequest(request); - let configuration = await this.fetchAndHandleErrors(this.clientConfigurationUri, request); - this.clientConfiguration = configuration; - this.processConfiguration(); - return configuration; - } - - private async fetchWithConfigurationRetry( - getRequestDescriptor: () => RequestDescriptor, - apiParameters: any = null, - body: any = null): Promise { - await this.ensureConfigurationIsLoaded(); - let requestDescriptor = getRequestDescriptor(); - - let api = extractApiRequest(requestDescriptor, - apiParameters, - this.hostOrigin, - this.trydotnetBaseAddress); - - let request = this.createRequest(requestDescriptor, body); - request = this.addHeaders(request, api); - - let response = await this.fetch(api.url.href, request); - - let shouldRetryWithNewConfiguration = await this.shouldRefreshConfigurationAndRetry(response); - - if (!shouldRetryWithNewConfiguration) { - if (response.ok) { - return response.json(); - } - else { - throw new ServiceError(response.status, response.statusText); - } - } - - await this.getConfiguration(); - api = extractApiRequest(requestDescriptor, - apiParameters, - this.hostOrigin, - this.trydotnetBaseAddress); - - request = this.createRequest(requestDescriptor, body); - request = this.addHeaders(request, api); - - let requestId: string = undefined; - if (body && body.requestId && typeof body.requestId === "string") { - requestId = body.requestId; - } - return this.fetchAndHandleErrors(api.url, request, requestId); - } - - private mapCompletionKindToMonacoKind(completions: any) { - var mapKind = (theKind: string) => { - const _kinds = Object.create(null); - // types - _kinds["Class"] = 6; //monaco.languages.CompletionItemKind.Class; - _kinds["Delegate"] = 6; //monaco.languages.CompletionItemKind.Class; // need a better option for this. - _kinds["Enum"] = 12; //monaco.languages.CompletionItemKind.Enum; - _kinds["Interface"] = 7; //monaco.languages.CompletionItemKind.Interface; - _kinds["Struct"] = 6; //monaco.languages.CompletionItemKind.Class; // Monaco doesn't have a Struct kind - // variables - _kinds["Local"] = 5; //monaco.languages.CompletionItemKind.Variable; - _kinds["Parameter"] = 5; //monaco.languages.CompletionItemKind.Variable; - _kinds["RangeVariable"] = 5; //monaco.languages.CompletionItemKind.Variable; - // members - _kinds["Const"] = 4; //monaco.languages.CompletionItemKind.Field; // Monaco doesn't have a Field kind - _kinds["EnumMember"] = 12; //monaco.languages.CompletionItemKind.Enum; // Monaco doesn't have an EnumMember kind - //_kinds['Event'] = monaco.languages.CompletionItemKind.Event; - _kinds["Field"] = 4; //monaco.languages.CompletionItemKind.Field; - _kinds["Method"] = 1; //monaco.languages.CompletionItemKind.Method; - _kinds["Property"] = 9; //monaco.languages.CompletionItemKind.Property; - // other stuff - _kinds["Label"] = 10; //monaco.languages.CompletionItemKind.Unit; // need a better option for this. - _kinds["Keyword"] = 13; //monaco.languages.CompletionItemKind.Keyword; - _kinds["Namespace"] = 8; //monaco.languages.CompletionItemKind.Module; - return _kinds[theKind] || 9; //monaco.languages.CompletionItemKind.Property; - }; - let mappedCompletions: ICompletionItem[] = completions.items.map((i: IMlsCompletionItem) => { - let mappedItem: ICompletionItem = { - acceptanceUri: i.acceptanceUri, - documentation: i.documentation, - filterText: i.filterText, - insertText: i.insertText, - kind: mapKind(i.kind), - label: i.displayText, - sortText: i.sortText - }; - return mappedItem; - }); - return mappedCompletions; - } - private parseGistId(gistId: string): { gist: string; commitHash?: string } { - let parts = gistId.split("/"); - let result: { gist: string; commitHash?: string } = { gist: parts[0] }; - if (parts.length > 1) { - result.commitHash = parts[1]; - } - return result; - } - - private processConfiguration() { - if (this.clientConfiguration) { - this.completionRequestDescriptor = this.clientConfiguration._links[completionKey]; - this.signatureHelpRequestDescriptor = this.clientConfiguration._links[signatureHelpKey]; - this.runRequestDescriptor = this.clientConfiguration._links[runKey]; - this.compileRequestDescriptor = this.clientConfiguration._links[compileKey]; - this.snippetRequestDescriptor = this.clientConfiguration._links[snippetKey]; - this.loadFromGistRequestDescriptor = this.clientConfiguration._links[loadFromGistKey]; - this.acceptCompletionItemRequestDescriptor = this.clientConfiguration._links[acceptCompletionKey]; - this.projectFromGistRequestDescriptor = this.clientConfiguration._links[projectFromGistKey]; - this.regionsFromFilesRequestDescriptor = this.clientConfiguration._links[regionsFromFilesKey]; - this.diagnosticsRequestDescriptor = this.clientConfiguration._links[diagnosticsKey]; - } - } - - private addXsrfTokenToRequest(request: any) { - if (this.getCookie !== null) { - var xsrfToken = this.getCookie(XsrfTokenKey); - - if (xsrfToken) { - request.headers[XsrfTokenKey] = xsrfToken; - } - } - } - - private createRequest(api: RequestDescriptor, data?: any) { - var request: Request = { - method: api.method, - headers: { - "Content-Type": "application/json" - }, - credentials: "same-origin" - }; - - if (api.method === "POST" && data) { - request.body = JSON.stringify(data); - } - this.addXsrfTokenToRequest(request); - return request; - } - - private createPostRequest(data: any) { - var request: Request = { - method: "POST", - headers: { - "Content-Type": "application/json" - }, - body: JSON.stringify(data), - credentials: "same-origin" - }; - - this.addXsrfTokenToRequest(request); - - return request; - } - - private addHeaders(request: Request, api?: ApiRequest): Request { - if (this.clientConfiguration) { - request.headers["ClientConfigurationVersionId"] = this.clientConfiguration.versionId; - } else { - request.headers["ClientConfigurationVersionId"] = "undefined"; - } - - request.headers["Timeout"] = this.getApiCallTimeout(api); - return request; - } - - private getApiCallTimeout(api: ApiRequest): string { - let timeOutMs = "15000"; - if (api) { - timeOutMs = `${api.timeoutMsHeader}`; - } else if (this.clientConfiguration) { - timeOutMs = `${this.clientConfiguration.defaultTimeoutMs}`; - } - return timeOutMs; - } - - private async shouldRefreshConfigurationAndRetry(response: Response): Promise { - let needNewConfig = false; - switch (response.status) { - case 400: - let reason: ApiError = await response.json(); - if (reason.code === "ConfigurationVersionError") { - needNewConfig = true; - } - break; - } - return needNewConfig; - } - - private async ensureConfigurationIsLoaded(): Promise { - if (this.clientConfiguration === null) { - await this.getConfiguration(); - } - } - - private async fetchAndHandleErrors(uri: URL, request: Request, reqeustId?: string): Promise { - try { - var response = await this.fetch(uri.href, request); - - if (!response) { - throw new Error("ECONNREFUSED"); - } - - if (this.aiClient !== null) { - this.aiClient.trackDependency( - request.method, - "", - uri.href, - 1, - response.ok, - response.status, - reqeustId); - } - - if (response.ok) { - return response.json(); - } - - throw new ServiceError(response.status, response.statusText); - - } catch (ex) { - throw ex; - } - } -} diff --git a/Microsoft.DotNet.Try.Client/src/ServiceError.ts b/Microsoft.DotNet.Try.Client/src/ServiceError.ts deleted file mode 100644 index 24dcb5ce7..000000000 --- a/Microsoft.DotNet.Try.Client/src/ServiceError.ts +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import { Response } from "./MlsClient"; - -export default class ServiceError extends Error { - constructor(public readonly statusCode: number, public readonly message: string = "", public readonly requestId: string = "") { - super(`ServiceError: ${statusCode}: ${message}`); - } - - public static From(response: Response): ServiceError { - return new ServiceError( - response.status, - response.statusText, - response.headers && response.headers.map - ? response.headers.map["request-id"] - : ""); - } -} diff --git a/Microsoft.DotNet.Try.Client/src/actionCreators/actions.ts b/Microsoft.DotNet.Try.Client/src/actionCreators/actions.ts deleted file mode 100644 index 0ed1fcf7a..000000000 --- a/Microsoft.DotNet.Try.Client/src/actionCreators/actions.ts +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as config from "./configActionCreators"; -import * as control from "./controlActionCreators"; -import * as notification from "./notificationActionCreators"; -import * as run from "./runActionCreators"; -import * as source from "./sourceCodeActionCreators"; -import * as workspace from "./workspaceActionCreators"; -import * as error from "./errorActionCreators"; -import * as ui from "./uiActionCreators"; -import * as instrumentation from "./instrumentationActionCreators"; -import * as requestId from "./operationIdActionCreators"; -import * as project from "./projectActionCreators"; -import * as sourceFiles from "./sourceFileActionCreators"; - -const actions = { - ...config, - ...control, - ...notification, - ...run, - ...source, - ...workspace, - ...error, - ...ui, - ...instrumentation, - ...requestId, - ...project, - ...sourceFiles -}; - -export default actions; diff --git a/Microsoft.DotNet.Try.Client/src/actionCreators/configActionCreators.ts b/Microsoft.DotNet.Try.Client/src/actionCreators/configActionCreators.ts deleted file mode 100644 index 76d0bca72..000000000 --- a/Microsoft.DotNet.Try.Client/src/actionCreators/configActionCreators.ts +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as types from "../constants/ActionTypes"; - -import { Action } from "../constants/ActionTypes"; -import { IHostConfiguration } from "../constants/IHostConfiguration"; - -import IMlsClient from "../IMlsClient"; -import { IApplicationInsightsClient } from "../ApplicationInsights"; - -export function setClient(client: IMlsClient): Action { - return { - type: types.CONFIGURE_CLIENT as typeof types.CONFIGURE_CLIENT, - client: client - }; -} - -export function setCodeSource(from: string, sourceCode: string = undefined): Action { - return { - type: types.CONFIGURE_CODE_SOURCE as typeof types.CONFIGURE_CODE_SOURCE, - from: from, - sourceCode: sourceCode - }; -} - -export function notifyHostProvidedConfiguration(configuration: IHostConfiguration): Action { - return { - type: types.NOTIFY_HOST_PROVIDED_CONFIGURATION, - configuration - }; -} - -export function setVersion(version: number): Action { - return { - type: types.CONFIGURE_VERSION, - version - }; -} - -export function hideEditor() { - return { - type: types.HIDE_EDITOR - }; -} - -export function setCompletionProvider(completionProvider: string): Action { - return { - type: types.CONFIGURE_COMPLETION_PROVIDER, - completionProvider - }; -} - -export function enablePreviewFeatures(): Action { - return { - type: types.CONFIGURE_ENABLE_PREVIEW - }; -} - -export function configureWasmRunner(): Action { - return { - type: types.CONFIGURE_WASMRUNNER - }; -} -export function enableInstrumentation(): Action { - return { - type: types.CONFIGURE_ENABLE_INSTRUMENTATION - }; -} - -export function enableClientTelemetry(client: IApplicationInsightsClient): Action { - return { - type: types.ENABLE_TELEMETRY, - client: client - }; -} - -export function configureEditorId(editorId: string): Action { - return { - type: types.CONFIGURE_EDITOR_ID, - editorId: editorId - }; -} diff --git a/Microsoft.DotNet.Try.Client/src/actionCreators/controlActionCreators.ts b/Microsoft.DotNet.Try.Client/src/actionCreators/controlActionCreators.ts deleted file mode 100644 index 475438eb4..000000000 --- a/Microsoft.DotNet.Try.Client/src/actionCreators/controlActionCreators.ts +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as monacoEditor from "monaco-editor"; -import * as types from "../constants/ActionTypes"; -import { Action } from "../constants/ActionTypes"; -import IState from "../IState"; -import { ThunkDispatch, ThunkAction } from "redux-thunk"; -import { AnyAction, ActionCreator } from "redux"; - -export function runCodeResultSpecified(output: string[], succeeded: boolean): Action { - return { - type: types.RUN_CODE_RESULT_SPECIFIED, - output: output, - succeeded: succeeded - }; -} - -export function configureMonacoEditor(editorOptions: monacoEditor.editor.IEditorOptions, theme: string): Action { - return { - type: types.CONFIGURE_MONACO_EDITOR, - editorOptions, - theme - }; -} - -export function defineMonacoEditorThemes(themes: { [x: string]: monacoEditor.editor.IStandaloneThemeData }) { - return { - type: types.DEFINE_MONACO_EDITOR_THEMES, - themes - }; -} - -export function showEditor(): Action { - return { - type: types.SHOW_EDITOR - }; -} - -export const focusMonacoEditor: ActionCreator> = () => - (_dispatch: ThunkDispatch, getState: () => IState) => { - const state = getState(); - const editor = state.monaco.editor; - - if (editor) { - editor.focus(); - } - - return { - type: "EDITOR_FOCUSED" - }; - }; diff --git a/Microsoft.DotNet.Try.Client/src/actionCreators/errorActionCreators.ts b/Microsoft.DotNet.Try.Client/src/actionCreators/errorActionCreators.ts deleted file mode 100644 index bead3c7fd..000000000 --- a/Microsoft.DotNet.Try.Client/src/actionCreators/errorActionCreators.ts +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as types from "../constants/ActionTypes"; -import { Action } from "../constants/ActionTypes"; - -export function error(errorType: string = "general", reason?: string): Action { - return { - type: types.REPORT_ERROR, - errorType, - reason - }; -} diff --git a/Microsoft.DotNet.Try.Client/src/actionCreators/instrumentationActionCreators.ts b/Microsoft.DotNet.Try.Client/src/actionCreators/instrumentationActionCreators.ts deleted file mode 100644 index 0e316b43a..000000000 --- a/Microsoft.DotNet.Try.Client/src/actionCreators/instrumentationActionCreators.ts +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as types from "../constants/ActionTypes"; -import IState from "../IState"; -import { Dispatch } from "redux"; -import { outputUpdated } from "./runActionCreators"; -import { Action } from "../constants/ActionTypes"; - -type outputCalculator = (modifier: number, state: IState) => string[] | Error; - -export const nextInstrumentationStep = (calculateOutput: outputCalculator = calculateOutputForStep) => (dispatch: Dispatch, getState: () => IState) => { - const state = getState(); - const newOutput = calculateOutput(1, state); - const atEnd = calculateOutput(2, state) instanceof Error; - - if (newOutput instanceof Error) { - dispatch(cannotMoveNext()); - } else { - dispatch({ type: types.NEXT_INSTRUMENT_STEP }); - dispatch(outputUpdated(newOutput)); - - if (atEnd) { - dispatch(cannotMoveNext()); - } else { - dispatch(canMoveNext()); - } - } -}; - -export const prevInstrumentationStep = (calculateOutput: outputCalculator = calculateOutputForStep) => (dispatch: Dispatch, getState: () => IState) => { - const state = getState(); - const newOutput = calculateOutput(-1, state); - const atEnd = calculateOutput(-2, state) instanceof Error; - - if (newOutput instanceof Error) { - dispatch(cannotMovePrev()); - } else { - dispatch({ type: types.PREV_INSTRUMENT_STEP }); - dispatch(outputUpdated(newOutput)); - if (atEnd) { - dispatch(cannotMovePrev()); - } else { - dispatch(canMovePrev()); - } - } -}; - -export const checkNextEnabled = () => (dispatch: Dispatch, getState: () => IState) => { - const state = getState(); - if (canMoveInstrumentation(state, 1)) { - dispatch(canMoveNext()); - } else { - dispatch(cannotMoveNext()); - } -}; - -export const checkPrevEnabled = () => (dispatch: Dispatch, getState: () => IState) => { - const state = getState(); - if (canMoveInstrumentation(state, -1)) { - dispatch(canMovePrev()); - } else { - dispatch(cannotMovePrev()); - } -}; - -export const calculateOutputForStep = (modifier: number, state: IState): string[] | Error => { - const nextIndexInvalid = !canMoveInstrumentation(state, modifier); - if (nextIndexInvalid) { - return Error("Out of bounds"); - } - - const currentStep = state.run.instrumentation[state.run.currentInstrumentationStep + modifier]; - - const rawOutput = state.run.fullOutput.join("\n") || ""; - - const output = rawOutput.substring(0, currentStep.output.end); - return output.split("\n"); -}; - -function canMoveInstrumentation(state: IState, modifier: number): boolean { - if (!state.run.instrumentation || state.run.instrumentation.length === 0) { - return false; - } - - const nextIndex = state.run.currentInstrumentationStep + modifier; - const nextIndexValid = !(nextIndex < 0 || nextIndex >= state.run.instrumentation.length); - return nextIndexValid; -} - -export function cannotMoveNext(): Action { - return { - type: types.CANNOT_MOVE_NEXT - }; -} - -export function canMoveNext(): Action { - return { - type: types.CAN_MOVE_NEXT - }; -} - -export function cannotMovePrev(): Action { - return { - type: types.CANNOT_MOVE_PREV - }; -} - -export function canMovePrev(): Action { - return { - type: types.CAN_MOVE_PREV - }; -} diff --git a/Microsoft.DotNet.Try.Client/src/actionCreators/notificationActionCreators.ts b/Microsoft.DotNet.Try.Client/src/actionCreators/notificationActionCreators.ts deleted file mode 100644 index 212827446..000000000 --- a/Microsoft.DotNet.Try.Client/src/actionCreators/notificationActionCreators.ts +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as types from "../constants/ActionTypes"; - -import { Action } from "../constants/ActionTypes"; -import { IHostConfiguration } from "../constants/IHostConfiguration"; -import { ICodeEditorForTryDotNet } from "../constants/ICodeEditorForTryDotNet"; - -export function notifyHostProvidedConfiguration(configuration: IHostConfiguration) { - return { - type: types.NOTIFY_HOST_PROVIDED_CONFIGURATION, - configuration - }; -} - -export function hostListenerReady(editorId?: string): Action { - let action: Action = { - type: types.NOTIFY_HOST_LISTENER_READY - }; - - if (editorId) { - action.editorId = editorId; - } - return action; -} - -export function hostEditorReady(editorId?: string): Action { - let action: Action = { - type: types.NOTIFY_HOST_EDITOR_READY - }; - - if (editorId) { - action.editorId = editorId; - } - return action; -} - -export function hostRunReady(editorId?: string): Action { - let action: Action = { - type: types.NOTIFY_HOST_RUN_READY - }; - - if (editorId) { - action.editorId = editorId; - } - return action; -} - -export function notifyMonacoReady(editor: ICodeEditorForTryDotNet): Action { - return { - type: types.NOTIFY_MONACO_READY, - editor: editor - }; -} diff --git a/Microsoft.DotNet.Try.Client/src/actionCreators/operationIdActionCreators.ts b/Microsoft.DotNet.Try.Client/src/actionCreators/operationIdActionCreators.ts deleted file mode 100644 index aa243ad44..000000000 --- a/Microsoft.DotNet.Try.Client/src/actionCreators/operationIdActionCreators.ts +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as types from "../constants/ActionTypes"; -import { Action } from "../constants/ActionTypes"; -import { newOperationId } from "../utilities/requestIdGenerator"; - -export function generateOperationId(requestId:string): Action { - let operationId = newOperationId(); - return { - type: types.OPERATION_ID_GENERATED, - operationId: operationId, - requestId: requestId - }; -} diff --git a/Microsoft.DotNet.Try.Client/src/actionCreators/projectActionCreators.ts b/Microsoft.DotNet.Try.Client/src/actionCreators/projectActionCreators.ts deleted file mode 100644 index 373d99e07..000000000 --- a/Microsoft.DotNet.Try.Client/src/actionCreators/projectActionCreators.ts +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as types from "../constants/ActionTypes"; -import { Action } from "../constants/ActionTypes"; -import { ThunkDispatch } from "redux-thunk"; -import IState from "../IState"; -import { AnyAction } from "redux"; -import { CreateProjectFromGistRequest, CreateProjectResponse } from "../clientApiProtocol"; - -export function createProjectFromGist(requestId: string, packageName: string, gistId: string, commitHash?: string) { - return async (dispatch: ThunkDispatch, getState: () => IState): Promise => { - let request: CreateProjectFromGistRequest = { - requestId: requestId, - projectTemplate: packageName, - gistId: gistId, - }; - - if (commitHash) { - request.commitHash = commitHash; - } - const state = getState(); - const client = state.config.client; - const applicationInsightsClient = state.config.applicationInsightsClient; - - try { - var response = await client.createProjectFromGist(request); - return dispatch(projectCreationSuccess(response)); - } - catch (ex) { - if (applicationInsightsClient) { - applicationInsightsClient.trackException(ex, "createProjectFromGist", { "requestBody": JSON.stringify(request) }); - } - return dispatch(projectCreationFailure(ex, request.requestId)); - } - }; -} - -export function projectCreationSuccess(response: CreateProjectResponse): Action { - let responseAcion: Action = { - type: types.CREATE_PROJECT_SUCCESS, - ...response - }; - - return responseAcion; -} - -export function projectCreationFailure(ex: Error, requestId: string): AnyAction { - let responseAcion: Action = { - type: types.CREATE_PROJECT_FAILURE, - requestId: requestId, - error: ex - }; - return responseAcion; -} diff --git a/Microsoft.DotNet.Try.Client/src/actionCreators/runActionCreators.ts b/Microsoft.DotNet.Try.Client/src/actionCreators/runActionCreators.ts deleted file mode 100644 index b457e2047..000000000 --- a/Microsoft.DotNet.Try.Client/src/actionCreators/runActionCreators.ts +++ /dev/null @@ -1,235 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as types from "../constants/ActionTypes"; -import { Action } from "../constants/ActionTypes"; -import { ThunkDispatch } from "redux-thunk"; -import IMlsClient, { IRunResponse, IRunRequest, ICompileResponse } from "../IMlsClient"; -import IState, { IDiagnostic } from "../IState"; -import { AnyAction } from "redux"; -import { IApplicationInsightsClient } from "../ApplicationInsights"; -import { newOperationId } from "../utilities/requestIdGenerator"; - -export function runClicked() { - return { - type: types.RUN_CLICKED - }; -} - -export function runFailure(ex: any, requestId?: string): any { - let response = { - type: types.RUN_CODE_FAILURE, - error: { - statusCode: ex.statusCode, - message: ex.message, - requestId: requestId ? requestId : ex.requestId - } - }; - - return response; -} - -export function compileRequest(requestId: string, workspaceVersion: number): Action { - return { - type: types.COMPILE_CODE_REQUEST, - requestId: requestId, - workspaceVersion: workspaceVersion - }; -} - -export function compileFailure(response: ICompileResponse, workspaceVersion: number): Action { - let result: Action = { - type: types.COMPILE_CODE_FAILURE, - diagnostics: response.diagnostics, - workspaceVersion - }; - - if (response.requestId) { - result.requestId = response.requestId; - } - return result; -} - -export function compileSuccess(response: ICompileResponse, workspaceVersion: number): Action { - let result: Action = { - type: types.COMPILE_CODE_SUCCESS, - base64assembly: response.base64assembly, - workspaceVersion - }; - - if (response.requestId) { - result.requestId = response.requestId; - } - return result; -} - -export function runRequest(requestId: string): Action { - return { - type: types.RUN_CODE_REQUEST, - requestId: requestId - }; -} - -export function runSuccess(response: IRunResponse, executionStrategy: "Agent" | "Blazor" = "Agent"): Action { - let result: Action = { - type: types.RUN_CODE_SUCCESS, - exception: response.exception, - output: response.output, - succeeded: response.succeeded, - diagnostics: response.diagnostics, - instrumentation: response.instrumentation, - variableLocations: response.variableLocations, - executionStrategy: executionStrategy - }; - - if (response.requestId) { - result.requestId = response.requestId; - } - - return result; -} - -export function outputUpdated(newOutput: string[]): Action { - return { - type: types.OUTPUT_UPDATED, - output: newOutput - }; -} - -function sendWasmRunnerMessage(payload: object, callback: (arg: TResult) => void): Action { - return { - type: types.SEND_WASMRUNNER_MESSAGE, - callback: callback, - payload: payload - }; -} - -export function wasmRunnerReady(editorId: string): Action { - return { - type: types.WASMRUNNER_READY, - editorId: editorId - }; -} - -export function run(requestId?: string, parameters: { [key: string]: any } = {}) { - return async (dispatch: ThunkDispatch, getState: () => IState): Promise => { - const state = getState(); - - const requestIdentifier = requestId ? requestId : newOperationId(); - - const request: IRunRequest = { - ...parameters, - workspace: state.workspace.workspace, - activeBufferId: state.monaco.bufferId, - requestId: requestIdentifier - }; - - dispatch(runRequest(requestIdentifier)); - - if (state.config.useLocalCodeRunner) { - return runUsingWasmRunner(state, request, parameters, state.config.client, state.config.applicationInsightsClient, dispatch); - } - else { - return runOnAgent(request, state.config.client, state.config.applicationInsightsClient, dispatch); - } - }; -} - -async function runOnAgent(request: IRunRequest, client: IMlsClient, applicationInsightsClient: IApplicationInsightsClient, dispatch: ThunkDispatch): Promise { - try { - var json = await client.run(request); - return dispatch(runSuccess(json)); - } - catch (ex) { - if (applicationInsightsClient) { - applicationInsightsClient.trackException(ex, "runOnAgent", { "requestBody": JSON.stringify(request) }); - } - return dispatch(runFailure(ex, request.requestId)); - } -} - -export interface WasmCodeRunnerResponse { - exception?: string; - output?: string[]; - succeeded?: boolean; - diagnostics?: IDiagnostic[]; - runnerException?: string; - codeRunnerVersion: string; - [key: string]: any; -} - -export interface WasmCodeRunnerRequest { - diagnostics?: IDiagnostic[]; - base64assembly?: string; - requestId?: string; - succeeded?: boolean; - [key: string]: any; -} - -function isCompileResult(response: any): response is ICompileResponse { - return response.base64assembly !== undefined; -} - -async function runUsingWasmRunner(state: IState, request: IRunRequest, parameters: { [key: string]: any }, client: IMlsClient, applicationInsightsClient: IApplicationInsightsClient, dispatch: ThunkDispatch): Promise { - let response: ICompileResponse; - if (state.compile.workspaceVersion === state.workspace.sequenceNumber) { - response = state.compile; - } - else { - try { - response = await client.compile(request); - } catch (ex) { - if (applicationInsightsClient) { - applicationInsightsClient.trackException(ex, "Blazor.Error", { "requestBody": JSON.stringify(request) }); - } - dispatch(compileFailure({ - succeeded: false, - diagnostics: [], - requestId: request.requestId - }, state.workspace.sequenceNumber)); - return dispatch(runFailure(ex, request.requestId)); - } - } - - if (!response.succeeded) { - dispatch(compileFailure(response, state.workspace.sequenceNumber)); - let output: string[] = []; - if (response.diagnostics) { - output = response.diagnostics.map(d => d.message); - } - return dispatch(runSuccess({ succeeded: response.succeeded, output: output, diagnostics: response.diagnostics, requestId: request.requestId }, "Blazor")); - } - else { - dispatch(compileSuccess(response, state.workspace.sequenceNumber)); - - let wasmRunRequest: WasmCodeRunnerRequest = { - ...response, - ...parameters, - requestId: request.requestId - }; - - return dispatch(sendWasmRunnerMessage(wasmRunRequest, - (runResponse: WasmCodeRunnerResponse) => { - if (isCompileResult(runResponse)) { - return; - } - - if (runResponse.runnerException) { - applicationInsightsClient.trackEvent("Blazor.Error", { message: runResponse.runnerException, codeRunnerVersion: runResponse.codeRunnerVersion }); - } - else { - applicationInsightsClient.trackEvent("Blazor.Success", { codeRunnerVersion: runResponse.codeRunnerVersion }); - } - - dispatch(runSuccess({ succeeded: runResponse.succeeded, output: runResponse.output, requestId: request.requestId }, "Blazor")); - })); - - } -} - -export function setDiagnostics(diagnostics: IDiagnostic[]) { - return { - type: types.SET_DIAGNOSTICS, - diagnostics: diagnostics - }; -} diff --git a/Microsoft.DotNet.Try.Client/src/actionCreators/sourceCodeActionCreators.ts b/Microsoft.DotNet.Try.Client/src/actionCreators/sourceCodeActionCreators.ts deleted file mode 100644 index f60c9bbda..000000000 --- a/Microsoft.DotNet.Try.Client/src/actionCreators/sourceCodeActionCreators.ts +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as types from "../constants/ActionTypes"; - -import { Dispatch, AnyAction, ActionCreator, Action } from "redux"; -import IMlsClient from "../IMlsClient"; -import IState, { IWorkspace } from "../IState"; -import { getBufferContent } from "../workspaces"; -import { LoadWorkspaceFromGist } from "./workspaceActionCreators"; -import { ThunkAction, ThunkDispatch } from "redux-thunk"; - -export function loadCodeRequest(from: string): AnyAction { - return { - type: types.LOAD_CODE_REQUEST as typeof types.LOAD_CODE_REQUEST, - from: from - }; -} - -export function loadCodeSuccess(sourceCode: string, bufferId?: string) { - return { - type: types.LOAD_CODE_SUCCESS as typeof types.LOAD_CODE_SUCCESS, - sourceCode, - bufferId - }; -} - -export function loadCodeFailure(ex: Error) { - return { - type: types.LOAD_CODE_FAILURE, - ex - }; -} - -export function setAdditionalUsings(usings: string[]): AnyAction { - return { - type: types.SET_ADDITIONAL_USINGS as typeof types.SET_ADDITIONAL_USINGS, - additionalUsings: usings - }; -} - -const loadCodeFromConfig = (dispatch: Dispatch, sourceCode: string, bufferId: string) => dispatch(loadCodeSuccess(sourceCode, bufferId)); - -const loadCodeFromUri = async function (dispatch: Dispatch, mlsClient: IMlsClient, sourceUri: string, bufferId: string) { - try { - var response = await mlsClient.getSourceCode({ sourceUri }); - return dispatch(loadCodeSuccess(response.buffer, bufferId)); - } - catch (ex) { - dispatch(loadCodeFailure(ex)); - } -}; - -const loadCodeFromWorkspace = - (dispatch: Dispatch, workspace: IWorkspace, bufferId: string) => - dispatch(loadCodeSuccess(extractCodeFromWorkspace(workspace, bufferId), bufferId)); - - -function extractCodeFromWorkspace(workspace: IWorkspace, bufferId: string): string { - return getBufferContent(workspace, bufferId); -} - -export const loadSource: ActionCreator, IState, void, AnyAction>> = - () => - async (dispatch: ThunkDispatch, getState: () => IState): Promise => { - const state = getState(); - const from = state.config.from; - const bufferId = state.monaco.bufferId; - const gitHubPanelEnabled = state.ui.canShowGitHubPanel; - - dispatch(loadCodeRequest(from)); - - if (from.startsWith("gist::")) { - const workspaceType = state.workspace.workspace.workspaceType; - const gistId = from.replace("gist::", ""); - return dispatch(LoadWorkspaceFromGist(gistId, bufferId, workspaceType, gitHubPanelEnabled)); - } - switch (from) { - case "default": - return Promise.resolve(loadCodeFromWorkspace(dispatch, state.config.defaultWorkspace, bufferId)); - case "parameter": - return Promise.resolve(loadCodeFromConfig(dispatch, state.config.defaultCodeFragment, bufferId)); - case "workspace": - return Promise.resolve(loadCodeFromWorkspace(dispatch, state.workspace.workspace, bufferId)); - default: - return loadCodeFromUri(dispatch, state.config.client, from, bufferId); - } - }; diff --git a/Microsoft.DotNet.Try.Client/src/actionCreators/sourceFileActionCreators.ts b/Microsoft.DotNet.Try.Client/src/actionCreators/sourceFileActionCreators.ts deleted file mode 100644 index 8a18f0aaf..000000000 --- a/Microsoft.DotNet.Try.Client/src/actionCreators/sourceFileActionCreators.ts +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as types from "../constants/ActionTypes"; -import { Action } from "../constants/ActionTypes"; -import { ThunkDispatch } from "redux-thunk"; -import IState from "../IState"; -import { AnyAction } from "redux"; -import { SourceFile, CreateRegionsFromFilesRequest, CreateRegionsFromFilesResponse } from "../clientApiProtocol"; - -export function createRegionsFromProjectFiles(requestId: string, files: SourceFile[]) { - return async (dispatch: ThunkDispatch, getState: () => IState): Promise => { - let request: CreateRegionsFromFilesRequest = { - requestId: requestId, - files: files - }; - - const state = getState(); - const client = state.config.client; - const applicationInsightsClient = state.config.applicationInsightsClient; - - try { - var response = await client.createRegionsFromProjectFiles(request); - return dispatch(createRegionsFromProjectFilesSuccess(response)); - } - catch (ex) { - if (applicationInsightsClient) { - applicationInsightsClient.trackException(ex, "generateRegionsFromFiles", { "requestBody": JSON.stringify(request) }); - } - return dispatch(createRegionsFromProjectFilesFailure(ex, request.requestId)); - } - }; -} - -export function createRegionsFromProjectFilesSuccess(response: CreateRegionsFromFilesResponse): Action { - let responseAcion: Action = { - type: types.CREATE_REGIONS_FROM_SOURCEFILES_SUCCESS, - ...response - }; - - return responseAcion; -} - -export function createRegionsFromProjectFilesFailure(ex: Error, requestId: string): AnyAction { - let responseAcion: Action = { - type: types.CREATE_REGIONS_FROM_SOURCEFILES_FAILURE, - requestId: requestId, - error: ex - }; - return responseAcion; -} diff --git a/Microsoft.DotNet.Try.Client/src/actionCreators/uiActionCreators.ts b/Microsoft.DotNet.Try.Client/src/actionCreators/uiActionCreators.ts deleted file mode 100644 index 4b40c58f9..000000000 --- a/Microsoft.DotNet.Try.Client/src/actionCreators/uiActionCreators.ts +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as types from "../constants/ActionTypes"; -import { Action } from "../constants/ActionTypes"; -import { ThunkDispatch } from "redux-thunk"; -import { AnyAction } from "redux"; -import IState from "../IState"; - -export function canShowGitHubPanel(canShow: boolean): Action { - return { - type: types.CAN_SHOW_GITHUB_PANEL, - canShow - }; -} - -export function disableBranding(): Action { - return { - type: types.CONFIGURE_BRANDING, - visible: false - }; -} - -export function enableBranding(): Action { - return { - type: types.CONFIGURE_BRANDING, - visible: true - }; -} - -export function configureBranding() { - return async (dispatch: ThunkDispatch, getState: () => IState): Promise => { - const state = getState(); - let client = state.config.client; - let enableBanner = true; - let configuration = await client.getConfiguration(); - enableBanner = configuration.enableBranding; - let actionToDispatch = enableBanner === true - ? enableBranding() - : disableBranding(); - return dispatch(actionToDispatch); - }; -} - diff --git a/Microsoft.DotNet.Try.Client/src/actionCreators/workspaceActionCreators.ts b/Microsoft.DotNet.Try.Client/src/actionCreators/workspaceActionCreators.ts deleted file mode 100644 index 490a0872f..000000000 --- a/Microsoft.DotNet.Try.Client/src/actionCreators/workspaceActionCreators.ts +++ /dev/null @@ -1,280 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as types from "../constants/ActionTypes"; -import { Action } from "../constants/ActionTypes"; -import { ActionCreator } from "redux"; -import IState, { IWorkspace, IWorkspaceInfo, IWorkspaceFile, IWorkspaceBuffer } from "../IState"; -import { decodeWorkspace } from "../workspaces"; -import { error } from "./errorActionCreators"; -import { setCodeSource } from "./configActionCreators"; -import { loadSource } from "./sourceCodeActionCreators"; -import * as uiActions from "./uiActionCreators"; -import { IStore } from "../IStore"; -import { ThunkDispatch, ThunkAction } from "redux-thunk"; -import { isNullOrUndefinedOrWhitespace } from "../utilities/stringUtilities"; -import { SupportedLanguages, toSupportedLanguage } from "../constants/supportedLanguages"; - -export function setWorkspaceInfo(workspaceInfo: IWorkspaceInfo): Action { - return { - type: types.SET_WORKSPACE_INFO, - workspaceInfo - }; -} - -export function setWorkspace(workspace: IWorkspace): Action { - return { - type: types.SET_WORKSPACE, - workspace - }; -} - -export const setWorkspaceAndActiveBuffer: ActionCreator, IState, void, Action>> = - (workspace: IWorkspace, activeBufferId: string) => - async (dispatch: ThunkDispatch): Promise => { - dispatch(setWorkspace(workspace)); - dispatch(setWorkspaceLanguage(toSupportedLanguage(workspace.language))); - return dispatch(setActiveBufferAndLoadCode(activeBufferId)); - }; - -export function setWorkspaceType(workspaceType: string): Action { - return { - type: types.SET_WORKSPACE_TYPE as typeof types.SET_WORKSPACE_TYPE, - workspaceType: workspaceType - }; -} - -export function setWorkspaceLanguage(workspaceLanguage: SupportedLanguages): Action { - return { - type: types.SET_WORKSPACE_LANGUAGE as typeof types.SET_WORKSPACE_LANGUAGE, - workspaceLanguage: workspaceLanguage - }; -} - -export function updateWorkspaceBuffer(content: string, bufferId: string): Action { - return { - type: types.UPDATE_WORKSPACE_BUFFER, - content, - bufferId - }; -} - -export function setActiveBuffer(bufferId: string): Action { - return { - type: types.SET_ACTIVE_BUFFER, - bufferId - }; -} - -export function setInstrumentation(enabled: boolean): Action { - return { - type: types.SET_INSTRUMENTATION, - enabled: enabled - }; -} - -export const setActiveBufferAndLoadCode: ActionCreator, IState, void, Action>> = - (bufferId: string) => - async (dispatch: ThunkDispatch): Promise => { - dispatch(setActiveBuffer(bufferId)); - dispatch(setCodeSource("workspace")); - return dispatch(loadSource()); - }; - -export const updateCurrentWorkspaceBuffer: ActionCreator> = - (content: string) => - (dispatch: ThunkDispatch, getState: () => IState): Action => { - const state = getState(); - const bufferId = state.monaco.bufferId; - return dispatch(updateWorkspaceBuffer(content, bufferId)); - }; - -export const LoadWorkspaceFromGist: ActionCreator, IState, void, Action>> = - (gistId: string, bufferId: string = null, workspaceType: string, canShowGitHubPanel: boolean = false) => - async (dispatch: ThunkDispatch, getState: () => IState): Promise => { - const state = getState(); - const client = state.config.client; - let activeBufferId = bufferId; - let extractBuffers = false; - if (activeBufferId) { - extractBuffers = activeBufferId.indexOf("@") >= 0; - } - const workspaceInfo = await client.getWorkspaceFromGist(gistId, workspaceType, extractBuffers); - if (!activeBufferId) { - activeBufferId = workspaceInfo.workspace.buffers[0].id; - } - dispatch(setWorkspaceInfo(workspaceInfo)); - if (canShowGitHubPanel) { - dispatch(uiActions.canShowGitHubPanel(true)); - } - else { - dispatch(uiActions.canShowGitHubPanel(false)); - } - - return dispatch(setWorkspaceAndActiveBuffer(workspaceInfo.workspace, activeBufferId)); - }; - -export function configureWorkspace(configuration: { store: IStore, workspaceParameter?: string, workspaceTypeParameter?: string, language?: SupportedLanguages, fromParameter?: string, bufferIdParameter?: string, fromGistParameter?: string, canShowGitHubPanelQueryParameter?: string }) { - let bufferId = "Program.cs"; - if (configuration.bufferIdParameter) { - bufferId = decodeURIComponent(configuration.bufferIdParameter); - } - - let LoadFromWorkspace = false; - let workspace: IWorkspace = { - workspaceType: "script", - files: [], - buffers: [{ id: bufferId, content: "", position: 0 }], - usings: [] - }; - - if (configuration.workspaceParameter) { - if (configuration.fromParameter) { - configuration.store.dispatch(error("parameter loading", "cannot define `workspace` and `from` simultaneously")); - } - if (configuration.workspaceTypeParameter) { - configuration.store.dispatch(error("parameter loading", "cannot define `workspace` and `workspaceTypeParameter` simultaneously")); - } - LoadFromWorkspace = true; - workspace = decodeWorkspace(configuration.workspaceParameter); - - } else { - if (configuration.workspaceTypeParameter) { - workspace.workspaceType = decodeURIComponent(configuration.workspaceTypeParameter); - } - } - - if (!isNullOrUndefinedOrWhitespace(configuration.language)) { - workspace.language = configuration.language; - } else if (isNullOrUndefinedOrWhitespace(workspace.language)) { - workspace.language = "csharp"; - } - configuration.store.dispatch(setWorkspaceType(workspace.workspaceType)); - configuration.store.dispatch(setWorkspaceLanguage(toSupportedLanguage(workspace.language))); - configuration.store.dispatch(setWorkspace(workspace)); - configuration.store.dispatch(setActiveBuffer(bufferId)); - - if (LoadFromWorkspace) { - configuration.store.dispatch(setCodeSource("workspace")); - } - else if (configuration.fromGistParameter) { - if (configuration.canShowGitHubPanelQueryParameter) { - let canShowGitHubPanel = decodeURIComponent(configuration.canShowGitHubPanelQueryParameter) === "true"; - if (canShowGitHubPanel) { - configuration.store.dispatch(uiActions.canShowGitHubPanel(true)); - } - else { - configuration.store.dispatch(uiActions.canShowGitHubPanel(false)); - } - } - const fromGist = `gist::${decodeURIComponent(configuration.fromGistParameter)}`; - configuration.store.dispatch(setCodeSource(fromGist)); - } - else if (configuration.fromParameter) { - const from = decodeURIComponent(configuration.fromParameter); - configuration.store.dispatch(setCodeSource(from)); - } -} - -export type Scaffolding = - "None" | "Class" | "Method"; - - -function getContent(type: Scaffolding, additionalUsings: string[]): string { - let usings = ""; - additionalUsings.forEach(using => { - usings += `using ${using}; -`}); - - switch (type) { - case "Class": - return `${usings}class C -{ -#region scaffold -#endregion -}`; - - case "Method": - return `${usings}class C -{ -public static void Main() - { -#region scaffold -#endregion - } -}`; - - case "None": - return ""; - default: - throw "Invalid scaffolding type"; - } -} - -function getActiveBufferId(type: Scaffolding, fileName: string): string { - switch (type) { - case "Class": - case "Method": - return `${fileName}@scaffold`; - case "None": - return fileName; - default: - throw "Invalid scaffolding type"; - } -} - -export const applyScaffolding: ActionCreator, IState, void, Action>> = - (type: Scaffolding, fileName: string, additionalUsings: string[] = []) => - (dispatch: ThunkDispatch, getState: () => IState): Promise => { - if (type === null || !fileName) { - dispatch(error("general", "invalid scaffolding parameter")) - } - - let workspaceType = getState().workspace.workspace.workspaceType; - - let file: IWorkspaceFile = { - name: fileName, - text: getContent(type, additionalUsings) - }; - - let activeBufferId = getActiveBufferId(type, fileName); - let buffer: IWorkspaceBuffer = { - content: "", - id: activeBufferId, - position: 0 - }; - - let workspace: IWorkspace = { - activeBufferId: activeBufferId, - buffers: [buffer], - files: [file], - workspaceType, - }; - - dispatch(setWorkspace(workspace)); - dispatch(setActiveBuffer(activeBufferId)); - dispatch(setCodeSource("workspace")); - return dispatch(loadSource()); - - }; - - - -export function getProjectTemplateFromStore(store: IStore): string { - let template = "unspecified"; - if (store) { - let state = store.getState(); - template = getProjectTemplateFromState(state); - } - return template; -} - -export function getProjectTemplateFromState(state: IState): string { - let template = "unspecified"; - - if (state && state.workspace && state.workspace.workspace && state.workspace.workspace.workspaceType) { - template = state.workspace.workspace.workspaceType; - } - - return template; -} diff --git a/Microsoft.DotNet.Try.Client/src/app.store.ts b/Microsoft.DotNet.Try.Client/src/app.store.ts deleted file mode 100644 index 102fbc2d1..000000000 --- a/Microsoft.DotNet.Try.Client/src/app.store.ts +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import { applyMiddleware, createStore } from "redux"; - -import { Middleware } from "redux"; -import rootReducer from "./reducers/app.reducer"; -import thunk from "redux-thunk"; -import { IStore } from "./IStore"; - -export default (additionalMiddleware: Middleware[] = []) : IStore => { - var middleware = [ - thunk, - ...additionalMiddleware - ]; - - return createStore(rootReducer, undefined, applyMiddleware(...middleware)); -}; diff --git a/Microsoft.DotNet.Try.Client/src/asp.net.style.app.css b/Microsoft.DotNet.Try.Client/src/asp.net.style.app.css deleted file mode 100644 index 3dae5619c..000000000 --- a/Microsoft.DotNet.Try.Client/src/asp.net.style.app.css +++ /dev/null @@ -1,35 +0,0 @@ -.panel { - display: flex; - flex-direction: row; - align-content: center -} - -.httpRequest { - position: relative; - display: flex; - flex-direction: row; - align-content: center; - align-self: center; -} - -.httpRequest>div { - display: flex; - flex-direction: row; - align-content: center; - align-items: center; - align-self: center; -} -.httpRequest>div>input { - border-radius: 5px; - border-width: 2px; - margin: 2px; - padding: 2px; - border: gray; - border-style: solid; -} -.runningContainer { - position: absolute; - top: 0px; - left: 0px; - width: 100vw -} \ No newline at end of file diff --git a/Microsoft.DotNet.Try.Client/src/asp.net.style.app.css.d.ts b/Microsoft.DotNet.Try.Client/src/asp.net.style.app.css.d.ts deleted file mode 100644 index 6c485169e..000000000 --- a/Microsoft.DotNet.Try.Client/src/asp.net.style.app.css.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const panel: string; -export const httpRequest: string; -export const runningContainer: string; diff --git a/Microsoft.DotNet.Try.Client/src/clientApiProtocol.ts b/Microsoft.DotNet.Try.Client/src/clientApiProtocol.ts deleted file mode 100644 index 537f8271d..000000000 --- a/Microsoft.DotNet.Try.Client/src/clientApiProtocol.ts +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -export type Project = { - projectTemplate: string, - usings?: string[], - files: SourceFile[], - [key: string]: any -}; - -export type SourceFile = { - name: string, - content: string, -}; - -export type SourceFileRegion = { - id: string, - content: string, -}; - - -export interface MessageBase { - requestId: string; -} - -export interface CreateProjectRequest extends MessageBase { - projectTemplate: string; -} - -export interface CreateProjectResponse extends MessageBase { - project: Project; -} - -export interface CreateProjectFromGistRequest extends CreateProjectRequest { - gistId: string; - commitHash?: string; -} - -export interface CreateRegionsFromFilesRequest extends MessageBase { - files: SourceFile[]; -} - -export interface CreateRegionsFromFilesResponse extends MessageBase { - regions: SourceFileRegion[]; -} diff --git a/Microsoft.DotNet.Try.Client/src/clientConfiguration.ts b/Microsoft.DotNet.Try.Client/src/clientConfiguration.ts deleted file mode 100644 index b81875c05..000000000 --- a/Microsoft.DotNet.Try.Client/src/clientConfiguration.ts +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -export interface ClientConfiguration { - versionId: string; - defaultTimeoutMs: number; - enableBranding: boolean; - applicationInsightsKey: string; - _links: { - _self: RequestDescriptor; - [propName: string]: RequestDescriptor; - }; -} - -export interface RequestDescriptor { - href: string; - method: string; - templated?: boolean; - properties?: Array<{ name: string; value?: any }>; - body?: { [propName: string]: any }; - timeoutMs?: number; -} - -export interface ApiRequest { - url: URL; - method: string; - timeoutMsHeader: string; -} - -export function extractApiRequest( - requestDescriptor: RequestDescriptor, - apiParameters: ApiParameters, - hostOrigin: URL, - apiBaseAddress: URL -): ApiRequest { - let url = new URL(apiBaseAddress.href); - - url.pathname = requestDescriptor.href; - - if (requestDescriptor.templated) { - url.pathname = composeUrl(requestDescriptor, apiParameters); - } - - composeQueryString( - url.searchParams, - requestDescriptor, - apiParameters, - hostOrigin); - - return { - url, - method: requestDescriptor.method, - timeoutMsHeader: `${requestDescriptor.timeoutMs}` - }; -} - -function clearUnsetOptionalSymbols(url: string): string { - let filter = /(\/\{[^{}?]+\?\})/gi; - return url.replace(filter, ""); -} - -function replaceSymbol(url: string, symbol: string, value: any): string { - if (value === undefined) { - return url; - } - let filter = new RegExp(`(\\{${symbol}\\??\\})`, "gi"); - return url.replace(filter, `${value}`); -} - -function composeUrl(apiLink: RequestDescriptor, apiParameters?: { [propName: string]: any }) { - let url = apiLink.href; - if (apiParameters) { - for (let prop in apiParameters) { - url = replaceSymbol(url, prop, apiParameters[prop]); - } - } - url = clearUnsetOptionalSymbols(url); - return url; -} - -function composeQueryString( - queryString : URLSearchParams, - apiLink: RequestDescriptor, - apiParameters: ApiParameters, - hostOrigin: URL) : void { - - if (hostOrigin) { - queryString.append("hostOrigin", hostOrigin.href); - } - - if (apiLink.properties && apiParameters) { - apiLink.properties.forEach(property => { - - let parameter = apiParameters[property.name]; - - if (parameter !== undefined) { - - if (isURL(parameter)) { - parameter = parameter.href; - } - - queryString.append(property.name, parameter.toString()); - } - }); - } -} - -export type ApiParameter = boolean | string | number | URL; - -export type ApiParameters = { [propName: string]: ApiParameter }; - -function isURL(value: ApiParameter) : value is URL -{ - return (value !== null && value !== undefined )&& ((value).href !== undefined); -} diff --git a/Microsoft.DotNet.Try.Client/src/components/AspNetCodeRunner.tsx b/Microsoft.DotNet.Try.Client/src/components/AspNetCodeRunner.tsx deleted file mode 100644 index 99464f994..000000000 --- a/Microsoft.DotNet.Try.Client/src/components/AspNetCodeRunner.tsx +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as React from "react"; -import * as classnames from "classnames"; -import * as styles from "../dot.net.style.app.css"; - -import Editor from "./Editor"; -import Output from "./Output"; -import AspNetSubmit from "./AspNetSubmit"; -import Running from "./Running"; -import GistPanel from "./GistPanel"; -import TryDotnetBanner from "./TryDotnetBanner"; - -const AspNetCodeRunner = () => { - return ( -
    -
    -
    - -
    -
    - -
    -
    -
    -
    - -
    -
    - -
    -
    - -
    - -
    -
    - ); -}; - -export default AspNetCodeRunner; diff --git a/Microsoft.DotNet.Try.Client/src/components/AspNetSubmit.tsx b/Microsoft.DotNet.Try.Client/src/components/AspNetSubmit.tsx deleted file mode 100644 index b5732f5f0..000000000 --- a/Microsoft.DotNet.Try.Client/src/components/AspNetSubmit.tsx +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as React from "react"; -import * as classnames from "classnames"; -import * as styles from "../asp.net.style.app.css"; -import IState from "../IState"; -import actions from "../actionCreators/actions"; -import { connect } from "react-redux"; -import { ThunkDispatch } from "redux-thunk"; -import { Action } from "redux"; - -export interface IHttpRequest { - uri?: string; - verb?: string; - body?: string; -} - -export interface IAspNetSubmitProps { - disabled?: boolean; - onClick?: (parameters: { httpRequest: IHttpRequest }) => void; -} - -export interface IAspNetSubmitState { - uri?: string; - verb?: string; - body?: string; -} - -export class AspNetSubmit extends React.Component { - constructor(props: IAspNetSubmitProps) { - super(props); - this.state = { uri: "/", verb: "get", body: "" }; - - this.uriDidChange = this.uriDidChange.bind(this); - this.verbDidChange = this.verbDidChange.bind(this); - this.bodyDidChange = this.bodyDidChange.bind(this); - this.submit = this.submit.bind(this); - - } - - private uriDidChange = (uri: string) => { - this.setState({ uri }); - } - - private verbDidChange = (verb: string) => { - this.setState({ verb }); - } - - private bodyDidChange = (body: string) => { - this.setState({ body }); - } - - private submit = () => { - let parameters = { - httpRequest: { - uri: this.state.uri, - verb: this.state.verb, - body: this.state.body - } - }; - this.props.onClick(parameters); - } - - public render() { - let { disabled } = this.props; - let { uri, verb, body } = this.state; - return ( -
    - -
    -
    - - this.uriDidChange(evt.target.value)} id="uriInput" type="text" name="uri" value={uri} /> -
    -
    - - this.verbDidChange(evt.target.value)} id="verbInput" type="text" name="verb" value={verb} /> -
    -
    - - this.bodyDidChange(evt.target.value)} id="bodyInput" type="text" name="body" value={body} /> -
    -
    -
    - ); - } -} - -const mapStateToProps = (state: IState): IAspNetSubmitProps => { - return ({ - disabled: !state.ui.canRun - }); -}; - -const mapDispatchToProps = (dispatch: ThunkDispatch) => { - return ({ - onClick: (parameters: { httpRequest: IHttpRequest }) => { - dispatch(actions.runClicked()); - dispatch(actions.run(null,parameters)); - } - }); -}; - -export default connect(mapStateToProps, mapDispatchToProps)(AspNetSubmit); diff --git a/Microsoft.DotNet.Try.Client/src/components/BrowserAdapter.tsx b/Microsoft.DotNet.Try.Client/src/components/BrowserAdapter.tsx deleted file mode 100644 index 61fb33ff4..000000000 --- a/Microsoft.DotNet.Try.Client/src/components/BrowserAdapter.tsx +++ /dev/null @@ -1,296 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as React from "react"; -import { ReactNode } from "react"; -import { Provider } from "react-redux"; -import { Route, RouteProps } from "react-router-dom"; -import { AnyAction, Middleware } from "redux"; -import actions from "../actionCreators/actions"; -import { configureWorkspace, applyScaffolding, getProjectTemplateFromStore } from "../actionCreators/workspaceActionCreators"; -import getStore from "../app.store"; -import actionToHostMessage from "../mappers/actionToHostMessage"; -import map from "../mappers/hostMessageToAction"; -import getMiddlewareForLogger, { ActionLogger } from "../middleware/LoggingMiddleware"; -import MlsClient from "../MlsClient"; -import fetch from "../utilities/fetch"; -import { IStore } from "../IStore"; -import { CookieGetter } from "../constants/CookieGetter"; -import { CookieSetter } from "../constants/CookieSetter"; -import { AIClientFactory, IApplicationInsightsClient } from "../ApplicationInsights"; -import * as types from "../constants/ActionTypes"; - -const embed = (props: BrowserAdapterProps) => { - return (match: RouteProps) => { - - function extractSrcUri(match: RouteProps) { - var uri = undefined; - - if (match.location && match.location.pathname) { - uri = match.location.pathname; - if (match.location.search) { - uri += match.location.search; - } - } - return uri; - } - - let query = new URLSearchParams(match.location.search); - let hostOrigin = props.iframeWindow.getHostOrigin(); - let referrer = props.iframeWindow.getReferrer(); - let apiBaseAddress = props.iframeWindow.getApiBaseAddress(); - let editorId = query.get("editorId") || ""; - let srcUri = extractSrcUri(match); - let store = configureStore(props, - query, - srcUri, - hostOrigin, - referrer, - apiBaseAddress, - editorId); - - configurePreviewFeatures(store, query); - configureInstrumentation(store, query); - configureHostListener(store, props.iframeWindow); - - - - - if (store.getState().config.useLocalCodeRunner) { - store.dispatch(actions.configureEditorId(editorId)); - store.dispatch(actions.hostEditorReady(editorId)); - } - else { - store.dispatch(actions.hostListenerReady(editorId)); - store.dispatch(actions.hostEditorReady(editorId)); - store.dispatch(actions.hostRunReady(editorId)); - } - - store.dispatch(actions.loadSource()); - - return ( - - {props.children} - - ); - }; -}; - -const configureStore = function ( - props: BrowserAdapterProps, query: URLSearchParams, srcUri: string, hostOrigin: URL, referrer: URL, apiBaseAddress: URL, editorId: string) { - - let store = getStore(getMiddleware(props.log, - props.hostWindow, - query, - srcUri, - hostOrigin, - editorId)); - - let workspaceParameter = query.get("workspace"); - let workspaceTypeParameter = query.get("workspaceType"); - let useWasmRunner = (!!(query.get("useWasmRunner"))) === true; - - // Access query string of parent window - let clientParams = props.iframeWindow.getClientParameters(); - if (clientParams && clientParams.workspaceType) { - workspaceTypeParameter = clientParams.workspaceType; - } - - if (clientParams && clientParams.hasOwnProperty("useWasmRunner") && clientParams.useWasmRunner !== null && clientParams.useWasmRunner !== undefined) { - // useWasmRunner can be set via clientParameters - useWasmRunner = useWasmRunner || ((!!(clientParams.useWasmRunner)) === true); - } - - // Get attributes from the srcript element that contains bundeljs - let fromParameter = query.get("from"); - let bufferIdParameter = query.get("bufferId"); - let fromGistParameter = query.get("fromGist"); - let canShowGitHubPanelQueryParameter = query.get("canShowGitHubPanel"); - - configureWorkspace({ - store, - workspaceParameter, - workspaceTypeParameter, - language: "csharp", - fromParameter, - bufferIdParameter, - fromGistParameter, - canShowGitHubPanelQueryParameter - }); - - if (query.get("completion")) { - let completionProvider = decodeURIComponent(query.get("completion")); - store.dispatch(actions.setCompletionProvider(completionProvider)); - } - else { - if (Math.random() < props.pythiaPercent) { - store.dispatch(actions.setCompletionProvider("pythia")); - } - } - - if (useWasmRunner) { - store.dispatch(actions.configureWasmRunner()); - } - - if ((!!(query.get("waitForConfiguration"))) !== false) { - store.dispatch(actions.hideEditor()); - store.dispatch(actions.disableBranding()); - } - - store.dispatch(actions.enableClientTelemetry(props.aiFactory(referrer))); - - if (clientParams && clientParams.scaffold) { - store.dispatch(applyScaffolding(clientParams.scaffold, - "file.cs", - ["System", "System.Collections.Generic", "System.Linq"])); - } - - let aiClient = store.getState().config.applicationInsightsClient; - let client = new MlsClient(fetch, - hostOrigin, - props.getCookie, - aiClient, - apiBaseAddress); - - store.dispatch(actions.setClient(client)); - - store.dispatch(actions.configureBranding()); - - setupTelemetryMiddleware(aiClient, store); - - return store; -}; - -function setupTelemetryMiddleware(aiClient: IApplicationInsightsClient, store: IStore) { - actionToTelemetry = (action: AnyAction) => { - if (aiClient) { - switch (action.type) { - case types.RUN_CODE_SUCCESS: - let projectTemplate = getProjectTemplateFromStore(store); - let eventName = `ClientRun.${action.succeeded ? "Success" : "Failure"}`; - aiClient.trackEvent( - eventName, - { - requestId: action.requestId, - projectTemplate: projectTemplate, - executionStrategy: action.executionStrategy - }); - break; - } - } - }; -} - -const configurePreviewFeatures = function (store: IStore, query: URLSearchParams) { - let preview = query.get("preview"); - if (preview && preview.toLowerCase() === "true") { - store.dispatch(actions.enablePreviewFeatures()); - } -}; - -const configureInstrumentation = (store: IStore, query: URLSearchParams) => { - const instrumentFlag = query.get("instrument"); - if (instrumentFlag && instrumentFlag.toLowerCase() === "true") { - store.dispatch(actions.enableInstrumentation()); - } -}; - -let actionToTelemetry: (toLog: AnyAction) => void = undefined; - -const getMiddleware = function (log: ActionLogger, - hostWindow: ICanPostMessage, - query: URLSearchParams, - srcUri: string, - hostOrigin: URL, - editorId: string): Middleware[] { - let middleware: Middleware[] = []; - - if (typeof log === "function") { - let debug = query.get("debug"); - if (debug && debug.toLowerCase() === "true") { - middleware.push(getMiddlewareForLogger(toLog => log(toLog))); - } - } - - middleware.push( - getMiddlewareForLogger((toLog: AnyAction) => { - let result = actionToHostMessage(toLog, srcUri, editorId); - - if (result) { - hostWindow.postMessage(result, hostOrigin.href); - } - - if (actionToTelemetry) { - actionToTelemetry(toLog); - } - }) - ); - - return middleware; -}; - -const configureHostListener = function ( - store: IStore, - iframeWindow: ICanAddEventListener & IIFrameWindow) { - - let hostOrigin = iframeWindow.getHostOrigin(); - - store.dispatch(actions.notifyHostProvidedConfiguration({ hostOrigin })); - iframeWindow.addEventListener("message", (e: MessageEvent) => { - let mappedEvent = map(e.data); - - if (mappedEvent) { - store.dispatch(mappedEvent); - } - }); -}; - -export interface BrowserAdapterProps { - children?: ReactNode; - getCookie?: CookieGetter; - setCookie?: CookieSetter; - log?: ActionLogger; - hostWindow: IHostWindow; - pythiaPercent?: number; - iframeWindow: IIFrameWindow; - aiFactory?: AIClientFactory; -} - -export interface IHostWindow extends ICanPostMessage { -} - -export interface IIFrameWindow extends IHaveQueryParams, ICanAddEventListener { - getHostOrigin(): URL; - getReferrer(): URL; - getApiBaseAddress(): URL; - getClientParameters(): ClientParameters; -} - -export interface IHaveQueryParams { - getQuery(): URLSearchParams; -} - -const BrowserAdapter: React.SFC = (props) => ( - -); - -BrowserAdapter.defaultProps = { - children:
    , - log: () => { }, - hostWindow: null, - pythiaPercent: 0, - iframeWindow: null -}; - -export interface ClientParameters { - workspaceType?: string; - scaffold?: string; - referrer?: URL; - useWasmRunner?: boolean; -} - -export type ICanPostMessage = { postMessage: (message: Object, targetOrigin: string) => void }; - -export type ICanAddEventListener = { addEventListener: (type: string, listener: (message: T) => void) => void }; - -export default BrowserAdapter; diff --git a/Microsoft.DotNet.Try.Client/src/components/DiagnosticsAdapter.ts b/Microsoft.DotNet.Try.Client/src/components/DiagnosticsAdapter.ts deleted file mode 100644 index a2de2c0ef..000000000 --- a/Microsoft.DotNet.Try.Client/src/components/DiagnosticsAdapter.ts +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import { IDiagnostic } from "../IState"; -import * as monacoEditor from "monaco-editor"; -const deepEqual = require("deep-equal"); - -export default class DiagnosticsAdapter { - private monacoModule: typeof monacoEditor; - private editor: monacoEditor.editor.ICodeEditor; - private currentMarkerData: monacoEditor.editor.IMarkerData[] = []; - - constructor(m: typeof monacoEditor, ed: monacoEditor.editor.ICodeEditor) { - this.monacoModule = m; - this.editor = ed; - } - - public clearDiagnostics() : boolean { - let empty: IDiagnostic[] = []; - return this.setDiagnostics(empty); - } - - public setDiagnostics(diag: IDiagnostic[]) : boolean { - let markers = this.convertDiagnosticsToMarkerData(diag, this.editor.getModel()); - let modifiedDiagnostics = false; - if (!deepEqual(this.currentMarkerData, markers)) { - this.currentMarkerData = markers; - // We pass an arbitrary string so monaco can know which diagnostics are - // owned by our langage service - this.monacoModule.editor.setModelMarkers(this.editor.getModel(), "trydotnetdiagnostics", markers); - modifiedDiagnostics = true; - } - return modifiedDiagnostics; - } - - private convertDiagnosticsToMarkerData(diagnostics: IDiagnostic[], model: monacoEditor.editor.ITextModel): monacoEditor.editor.IMarkerData[] { - let result: monacoEditor.editor.IMarkerData[] = []; - for (let diagnostic of diagnostics) { - let start = model.getPositionAt(diagnostic.start); - let marker: monacoEditor.editor.IMarkerData = { - severity: diagnostic.severity, - startLineNumber: start.lineNumber, - startColumn: start.column, - endLineNumber: start.lineNumber, - endColumn: start.column, - message: diagnostic.message - }; - result.push(marker); - } - - return result; - } -} diff --git a/Microsoft.DotNet.Try.Client/src/components/DotDotNetCodeRunner.tsx b/Microsoft.DotNet.Try.Client/src/components/DotDotNetCodeRunner.tsx deleted file mode 100644 index 917a6b44d..000000000 --- a/Microsoft.DotNet.Try.Client/src/components/DotDotNetCodeRunner.tsx +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as React from "react"; -import * as classnames from "classnames"; -import * as styles from "../dot.net.style.app.css"; - -import Editor from "./Editor"; -import Output from "./Output"; -import RunButton from "./RunButton"; -import InstrumentCheckBox from "./InstrumentCheckBox"; -import InstrumentationPanel from "./InstrumentationPanel"; -import Running from "./Running"; -import GistPanel from "./GistPanel"; -import Frame from "./Frame"; -import TryDotnetBanner from "./TryDotnetBanner"; -import { GetBlazorIFrameUrl } from "./GetBlazorIFrameUrl"; - -const DotDotNetCodeRunner = (trydotnetWindow: Window) => { - let url = GetBlazorIFrameUrl(trydotnetWindow); - - // @ts-ignore Some connect type inference thing - let hack = ; return ( -
    -
    -
    - -
    -
    - -
    -
    -
    -
    - - -
    -
    - -
    -
    - -
    - - - {hack} -
    -
    - ); -}; - -export default DotDotNetCodeRunner; \ No newline at end of file diff --git a/Microsoft.DotNet.Try.Client/src/components/Editor.tsx b/Microsoft.DotNet.Try.Client/src/components/Editor.tsx deleted file mode 100644 index 99623b9e3..000000000 --- a/Microsoft.DotNet.Try.Client/src/components/Editor.tsx +++ /dev/null @@ -1,398 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as React from "react"; - -import { Dispatch } from "redux"; -import { connect, MapDispatchToProps } from "react-redux"; -import IMlsClient, { IRunRequest, IWorkspaceRequest } from "../IMlsClient"; -import IState, { IRunState, IWorkspace, IDiagnostic, ICompileState } from "../IState"; - -import DiagnosticsAdapter from "./DiagnosticsAdapter"; -import InstrumentationAdapter from "./InstrumentationAdapter"; -import * as monacoEditor from "monaco-editor"; -import ReactMonacoEditor, { EditorDidMount, EditorWillMount } from "react-monaco-editor"; -import actions from "../actionCreators/actions"; - -import deepEqual = require("deep-equal"); -import { cloneWorkspace, setBufferContent } from "../workspaces"; -import ICompletionItem from "../ICompletionItem"; -import { CreateProjectFromGistRequest, CreateRegionsFromFilesRequest } from "../clientApiProtocol"; - -import { Subject, interval } from "rxjs"; -import { debounce } from "rxjs/operators"; -import { SupportedLanguages } from "../constants/supportedLanguages"; - -export interface IEditorProps { - completionProvider?: string; - editorDidMount?: EditorDidMount; - editorWillMount?: EditorWillMount; - editorOptions?: monacoEditor.editor.IEditorOptions; - showEditor?: boolean; - sourceCode?: string; - sourceCodeDidChange?: (sourceCode: string, bufferId: string) => void; - theme?: string; - themes?: { [x: string]: monacoEditor.editor.IStandaloneThemeData }; - client?: IMlsClient; - showCompletions?: boolean; - runState?: IRunState; - compileState?: ICompileState; - activeBufferId?: string; - workspace?: IWorkspace; - instrumentationEnabled?: boolean; - updateDiagnostics?: (diagnostics: IDiagnostic[]) => void; - editorLanguage?: SupportedLanguages; -} - -export interface IEditorState { - editor: monacoEditor.editor.IEditor; - defineTheme: (name: string, value: monacoEditor.editor.IStandaloneThemeData) => void; - setTheme: (t: string) => void; - diagnosticsAdapter: DiagnosticsAdapter; - instrumentationAdapter: InstrumentationAdapter; - monacoModule: typeof monacoEditor; - editorLanguage: SupportedLanguages; -} - -export interface TextChangedEvent { - text: string; - position: number; -} - -export class Editor extends React.Component { - constructor(props: IEditorProps) { - super(props); - - this.editorDidMount = this.editorDidMount.bind(this); - this.editorWillMount = this.editorWillMount.bind(this); - this.componentDidUpdate = this.componentDidUpdate.bind(this); - this.defineThemes = this.defineThemes.bind(this); - } - - private completionPosition: monacoEditor.Position; - private completionItems: ICompletionItem[]; - private contentChangedChannel: Subject = new Subject(); - - private editorWillMount: EditorWillMount = (monacoModule: typeof monacoEditor) => { - let defineTheme = (name: string, theme: monacoEditor.editor.IStandaloneThemeData) => monacoModule.editor.defineTheme(name, theme); - - this.setState({ - ...this.state, - defineTheme: defineTheme, - editorLanguage: this.props.editorLanguage - }); - - this.defineThemes(defineTheme); - this.props.editorWillMount(monacoModule); - - } - - private queueDiagnosticsUpdateRequest = (() => { - if (this.state && this.state.editor && this.contentChangedChannel) { - let model = this.state.editor.getModel() as monacoEditor.editor.ITextModel; - if (model) { - let text = model.getValue(); - this.contentChangedChannel.next({ - text: text ? text : "", - position: 0 - }); - } - } - }).bind(this); - - private textChangedEventHandler = (async (event: TextChangedEvent) => { - if (this.props && this.props.client && this.props.workspace) { - let client = this.props.client; - let workspace = cloneWorkspace(this.props.workspace); - let activeBuffer = this.props.activeBufferId; - setBufferContent(workspace, activeBuffer, event.text ? event.text : ""); - let diagnosticsResult = await client.getDiagnostics(workspace, activeBuffer); - this.setDiagnostics(diagnosticsResult.diagnostics); - } - }).bind(this); - - private editorDidMount: EditorDidMount = ( - editor: monacoEditor.editor.IStandaloneCodeEditor, - monacoModule: typeof monacoEditor) => { - if (editor.onDidChangeModelContent) { - editor.onDidChangeModelContent((e: monacoEditor.editor.IModelContentChangedEvent) => { - if (e.changes.length === 1) { - let change = e.changes[0]; - - if (this.completionPosition && - this.completionPosition.column === change.range.startColumn && - this.completionPosition.lineNumber === change.range.startLineNumber && - this.completionItems) { - let acceptedItem: ICompletionItem = this.completionItems.find((t) => t.insertText === change.text); - if (acceptedItem) { - this.props.client.acceptCompletionItem(acceptedItem); - } - } - } - }); - } - - this.setState({ - ...this.state, - editorLanguage: this.props.editorLanguage, - editor, - setTheme: (t) => monacoModule.editor.setTheme(t), - diagnosticsAdapter: new DiagnosticsAdapter(monacoModule, editor), - instrumentationAdapter: new InstrumentationAdapter(editor), - monacoModule: monacoModule - }); - - if (this.props.showCompletions) { - let language = this.props.editorLanguage; - let monaco = monacoModule; - let capturedEditor = this; - this.setupLanguageServices(monaco, language, capturedEditor); - } - - window.addEventListener("resize", () => editor.layout()); - this.props.editorDidMount(editor, monacoModule); - this.contentChangedChannel - .pipe(debounce(() => interval(1000))) - .subscribe((event) => this.textChangedEventHandler(event)); - } - - private setupLanguageServices = (monaco: typeof monacoEditor, language: SupportedLanguages, capturedEditor: Editor) => { - monaco.languages.registerCompletionItemProvider(language, - { - provideCompletionItems: async function ( - model: monacoEditor.editor.ITextModel, - position: monacoEditor.Position, - _token: monacoEditor.CancellationToken, - _context: monacoEditor.languages.CompletionContext) { - capturedEditor.completionPosition = position; - let client = capturedEditor.props.client; - let workspace = cloneWorkspace(capturedEditor.props.workspace); - let activeBuffer = capturedEditor.props.activeBufferId; - setBufferContent(workspace, activeBuffer, model.getValue()); - - let completionResult = await client.getCompletionList( - workspace, - activeBuffer, - model.getOffsetAt(position), - capturedEditor.props.completionProvider); - capturedEditor.completionItems = completionResult.items; - capturedEditor.setDiagnostics(completionResult.diagnostics); - return capturedEditor.completionItems; - }, - triggerCharacters: ["."] - }); - - monaco.languages.registerSignatureHelpProvider(language, - { - provideSignatureHelp: async function ( - model: monacoEditor.editor.ITextModel, - position: monacoEditor.Position, - _token: monacoEditor.CancellationToken) { - let client = capturedEditor.props.client; - let workspace = cloneWorkspace(capturedEditor.props.workspace); - let activeBuffer = capturedEditor.props.activeBufferId; - setBufferContent(workspace, activeBuffer, model.getValue()); - let result = await client.getSignatureHelp(workspace, activeBuffer, model.getOffsetAt(position)); - capturedEditor.setDiagnostics(result.diagnostics); - return result; - }, - signatureHelpTriggerCharacters: ["("] - } - ); - } - - private defineThemes = (defineTheme: (name: string, themeData: monacoEditor.editor.IStandaloneThemeData) => void) => { - if (this.props.themes) { - for (var name in this.props.themes) { - if (defineTheme === null) { - this.state.defineTheme(name, this.props.themes[name]); - } - else { - defineTheme(name, this.props.themes[name]); - } - } - } - } - - public componentDidUpdate(oldProps: IEditorProps) { - if (this.props.editorOptions) { - if (oldProps.editorOptions !== this.props.editorOptions) { - if (this.state && this.state.editor) { - this.state.editor.updateOptions(this.props.editorOptions); - } - } - } - - if (this.props.themes) { - if (!oldProps.themes || !deepEqual(oldProps.themes, this.props.themes)) { - if (this.state && this.state.defineTheme) { - this.defineThemes(null); - } - } - } - - if (this.props.theme) { - if (oldProps.theme !== this.props.theme) { - if (this.state && this.state.setTheme) { - - this.state.setTheme(this.props.theme); - } - } - } - - let runState = this.props.runState; - let compileState = this.props.compileState; - let diagnostics: IDiagnostic[] = []; - if (runState && runState.diagnostics && runState.diagnostics.length > 0) { - diagnostics = runState.diagnostics; - } else if (compileState && compileState.diagnostics && compileState.diagnostics.length > 0) { - diagnostics = compileState.diagnostics; - } - - this.setDiagnostics(diagnostics); - const canShowInstrumentation = this.state - && this.state.instrumentationAdapter - && this.props.runState - && this.props.runState.instrumentation; - - if (canShowInstrumentation) { - this.state.instrumentationAdapter.setOrUpdateInstrumentation(oldProps, this.props, this.state); - } - - const instrumentationEnabledFallingEdge = - this.props && oldProps && - oldProps.instrumentationEnabled && !this.props.instrumentationEnabled; - - if (instrumentationEnabledFallingEdge) { - this.state.instrumentationAdapter.clearInstrumentation(); - } - - if (this.props && oldProps && oldProps.workspace !== this.props.workspace) { - this.queueDiagnosticsUpdateRequest(); - } - - if (this.state && (this.props.editorLanguage !== oldProps.editorLanguage)) { - this.setState({ - ...this.state, - editorLanguage: this.props.editorLanguage - }); - - if (this.state && this.state.monacoModule && this.props.showCompletions) { - let language = this.props.editorLanguage; - let monaco = this.state.monacoModule; - let capturedEditor = this; - this.setupLanguageServices(monaco, language, capturedEditor); - } - } - } - - private setDiagnostics = ((diagnostics: IDiagnostic[]): void => { - let shouldUpdate = false; - if (this.state && this.state.diagnosticsAdapter) { - if (diagnostics && diagnostics.length > 0) { - shouldUpdate = this.state.diagnosticsAdapter.setDiagnostics(diagnostics); - } - else { - shouldUpdate = this.state.diagnosticsAdapter.clearDiagnostics(); - } - } - if (shouldUpdate && this.props && this.props.updateDiagnostics) { - this.props.updateDiagnostics(diagnostics); - } - }).bind(this); - - private onChange = ((newValue: any, _event: monacoEditor.editor.IModelContentChangedEvent) => { - if (this.props.sourceCodeDidChange) { - this.props.sourceCodeDidChange(newValue, this.props.activeBufferId); - } - - if (this.state && this.state.instrumentationAdapter) { - this.state.instrumentationAdapter.clearInstrumentation(); - } - - let offset = 0; - - if (this.state && this.state.editor) { - let model = this.state.editor.getModel() as monacoEditor.editor.ITextModel; - if (model) { - let pos = this.state.editor.getPosition(); - offset = model.getOffsetAt(pos); - } - } - - this.contentChangedChannel.next({ text: newValue, position: offset }); - //this.setDiagnostics([]); - }).bind(this); - - public render() { - return this.props.showEditor ? - ( - ) : - (
    ); - } - - public static defaultProps: IEditorProps = { - completionProvider: "", - editorDidMount: (_editor: monacoEditor.editor.IEditor) => { }, - editorWillMount: (_editor: typeof monacoEditor) => { }, - editorOptions: { scrollBeyondLastLine: false }, - showEditor: true, - sourceCodeDidChange: (_sourceCode: string) => { }, - client: - { - acceptCompletionItem: (_selection: ICompletionItem) => { throw Error(); }, - getWorkspaceFromGist: async (_gistId: string, _workspaceType: string, _extractBuffers: boolean) => { throw Error(); }, - getSourceCode: async (_request: IWorkspaceRequest) => { throw Error(); }, - run: async (_args: IRunRequest) => { throw Error(); }, - getCompletionList: async (_workspace: IWorkspace, _bufferId: string, _position: number, _completionProvider: string) => { throw Error(); }, - getSignatureHelp: async (_workspace: IWorkspace, _bufferId: string, _position: number) => { throw Error(); }, - compile: async (_args: IRunRequest) => { throw Error(); }, - createProjectFromGist: (_request: CreateProjectFromGistRequest) => { throw Error(); }, - createRegionsFromProjectFiles: (_request: CreateRegionsFromFilesRequest) => { throw Error(); }, - getDiagnostics: (_workspace: IWorkspace, _bufferId: string) => { throw Error(); }, - getConfiguration: () => { throw Error(); } - }, - showCompletions: true, - activeBufferId: "Program.cs", - editorLanguage: "csharp" - }; -} - -const mapStateToProps = (state: IState): IEditorProps => { - var props: IEditorProps = { - completionProvider: state.config.completionProvider, - editorOptions: { ...state.monaco.editorOptions, scrollBeyondLastLine: false }, - showEditor: state.ui.showEditor, - sourceCode: state.monaco.displayedCode, - theme: state.monaco.theme, - themes: state.monaco.themes, - client: state.config.client, - showCompletions: state.config.version >= 2, - runState: state.run, - compileState: state.compile, - activeBufferId: state.monaco.bufferId, - workspace: state.workspace.workspace, - instrumentationEnabled: state.workspace.workspace.includeInstrumentation, - editorLanguage: state.monaco.language - }; - return props; -}; - -const mapDispatchToProps: MapDispatchToProps = (dispatch: Dispatch, _ownProps: IEditorProps): IEditorProps => { - return ({ - editorDidMount: (editor: monacoEditor.editor.IEditor) => dispatch(actions.notifyMonacoReady(editor)), - sourceCodeDidChange: (sourceCode: string, bufferId: string) => { - dispatch(actions.updateWorkspaceBuffer(sourceCode, bufferId)); - }, - updateDiagnostics: (diagnostics: IDiagnostic[]) => dispatch(actions.setDiagnostics(diagnostics)) - }); -}; - -export default connect(mapStateToProps, mapDispatchToProps)(Editor); diff --git a/Microsoft.DotNet.Try.Client/src/components/Frame.tsx b/Microsoft.DotNet.Try.Client/src/components/Frame.tsx deleted file mode 100644 index 645aceaf4..000000000 --- a/Microsoft.DotNet.Try.Client/src/components/Frame.tsx +++ /dev/null @@ -1,154 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as React from "react"; -import IState from "../IState"; -import { connect, MapDispatchToProps } from "react-redux"; -import { Dispatch } from "redux"; -import * as runActions from "../actionCreators/runActionCreators"; -import * as notificationActions from "../actionCreators/notificationActionCreators"; - -export interface IFrameProps { - isActive?: boolean; - postMessageData?: object; - postMessageCallback?: (obj: any) => void; - sequence?: number; - src?: URL; - ready?: (id: string) => void; - editorId?: string; -} - -export interface IFrameState { - src: URL; - targetOrigin: string; -} - -export class Frame extends React.Component -{ - private _frame: HTMLIFrameElement; - - private _callbacks: { [seq: number]: (arg: any) => void } = {}; - - constructor(props: IFrameProps) { - super(props); - this.state = { src: props.src, targetOrigin: props.src.protocol + "//" + props.src.host }; - } - - public static defaultProps: IFrameProps = - { - postMessageData: null, - sequence: 0, - src: null - }; - - public componentWillReceiveProps(nextProps: IFrameProps) { - if (this.props.sequence !== nextProps.sequence && nextProps.postMessageData) { - // send a message if postMessageData changed - this.sendMessage( - nextProps.postMessageData, - nextProps.sequence, - nextProps.postMessageCallback); - } - } - - public sendMessage(data: any, sequence: number, callback: (arg: TResult) => void) { - const theThing = { data: data, sequence }; - if (callback) { - this._callbacks[sequence] = callback; - } - - this._frame.contentWindow.postMessage(this.serializePostMessageData(theThing), this.state.targetOrigin); - } - - public componentDidMount() { - let m = this; - if (this._frame && this._frame.contentWindow) - { - this._frame.contentWindow.addEventListener("message", (ev: MessageEvent) => { - m.onReceiveMessage(ev); - - }); - } - } - - public onReceiveMessage(event: any) { - try - { - let o = JSON.parse(event.data); - if (o.sequence && this._callbacks[o.sequence]) - { - this._callbacks[o.sequence](o.data); - } - - if (o.ready) - { - this.props.ready(this.props.editorId); - } - } - catch - { - } - } - - public serializePostMessageData(data: any) { - // To be on the safe side we can also ignore the browser's built-in serialization feature - // and serialize the data manually. - if (typeof data === "object") { - return JSON.stringify(data); - } else if (typeof data === "string") { - return data; - } else { - return `${data}`; - } - } - - public render() { - const defaultAttributes = { - allowFullScreen: false, - height: 1, - width: 1, - src: this.state.src.href - }; - - if (this.props.isActive) { - return ( - - - `, - { - url: configuration.hostOrigin, - runScripts: "dangerously" - }); - - return dom; -} - -export function buildMultiIFrameDom(configuration: Configuration): JSDOM { - let dom = new JSDOM( - ` - - - - - - - `, - { - url: configuration.hostOrigin, - runScripts: "dangerously" - }); - - return dom; -} - -export function buildDoubleIFrameDom(configuration: Configuration): JSDOM { - let dom = new JSDOM( - ` - - - - - - `, - { - url: configuration.hostOrigin, - runScripts: "dangerously" - }); - - return dom; -} - -export function getEditorIFrame(dom: JSDOM): HTMLIFrameElement { - let iframe = (dom.window.document.body.querySelector("iframe")); - return iframe; -} - -export function getEditorIFrames(dom: JSDOM): HTMLIFrameElement[] { - let nodes = dom.window.document.body.querySelectorAll("iframe"); - let iframes: HTMLIFrameElement[] = []; - nodes.forEach(iframe => { - iframes.push(iframe); - }); - return iframes; -} \ No newline at end of file diff --git a/Microsoft.DotNet.Try.js/test/fakes/fakeMessageBus.ts b/Microsoft.DotNet.Try.js/test/fakes/fakeMessageBus.ts deleted file mode 100644 index bb9111039..000000000 --- a/Microsoft.DotNet.Try.js/test/fakes/fakeMessageBus.ts +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import { IMessageBus } from "../../src/internals/messageBus"; -import { Subject, PartialObserver, Unsubscribable } from "rxjs"; -import { ApiMessage } from "../../src/internals/apiMessages"; - -export class FakeMessageBus implements IMessageBus { - - constructor(private busId: string) { - } - - public channel = new Subject(); - - dispose(): void { - } - - post(message: ApiMessage): void { - this.channel.next(message); - } - - subscribe(observer?: PartialObserver): Unsubscribable; - subscribe(next?: (value: ApiMessage) => void, error?: (error: any) => void, complete?: () => void): Unsubscribable; - subscribe(next?: any, error?: any, complete?: any): Unsubscribable { - return this.channel.subscribe(next, error, complete); - } - - id(): string { - return this.busId; - } -} diff --git a/Microsoft.DotNet.Try.js/test/includesProcessor.specs.ts b/Microsoft.DotNet.Try.js/test/includesProcessor.specs.ts deleted file mode 100644 index 30ff0016a..000000000 --- a/Microsoft.DotNet.Try.js/test/includesProcessor.specs.ts +++ /dev/null @@ -1,353 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as chai from "chai"; -import { extractIncludes } from "../src/domInjection/includesProcessor"; -import { JSDOM } from "jsdom"; -import { expect } from "chai"; -import { tryDotNetModes } from "../src/domInjection/types"; - -chai.should(); - -describe("include blocks", () => { - it("can be extracted from dom", () => { - let configuration = { - hostOrigin: "https://docs.microsoft.com" - }; - let dom = new JSDOM( - ` - - -
    -                
    -public class Utility{
    -    
    -}
    -                
    -            
    -
    -                
    -public class AnotherUtility{
    -    
    -}
    -                
    -            
    -
    -            
    -public class AnotherUtilityWhyNot{
    -
    -}
    -            
    -        
    - - `, - { - url: configuration.hostOrigin, - runScripts: "dangerously" - }); - - let includes = extractIncludes(dom.window.document); - expect(includes).not.to.be.null; - expect(includes).not.to.be.undefined; - expect(includes.global).not.to.be.undefined; - expect(includes.global).not.to.be.null; - let file = includes.global.files[0]; - expect(file).not.to.be.null; - - expect(includes["sessionInclude"]).not.to.be.undefined; - expect(includes["sessionInclude"]).not.to.be.null; - file = includes["sessionInclude"].files[0]; - expect(file).not.to.be.null; - - }); - - it("can declare documents", () => { - let configuration = { - hostOrigin: "https://docs.microsoft.com" - }; - let dom = new JSDOM( - ` - - -
    -                
    -public class Utility{
    -    
    -}
    -                
    -            
    -
    -                
    -public class AnotherUtility{
    -    
    -}
    -                
    -            
    -
    -                
    -public class AnotherUtilityAgain{
    -    
    -}
    -                
    -            
    - - `, - { - url: configuration.hostOrigin, - runScripts: "dangerously" - }); - - let includes = extractIncludes(dom.window.document); - expect(includes).not.to.be.null; - expect(includes).not.to.be.undefined; - expect(includes.global).not.to.be.undefined; - expect(includes.global).not.to.be.null; - let file = includes.global.files[0]; - expect(file).not.to.be.null; - - includes.global.documents.length.should.be.equal(2); - let documentOne = includes.global.documents[0]; - expect(documentOne).not.to.be.null; - documentOne.region.should.be.contain("region1"); - - let documentTwo = includes.global.documents[1]; - expect(documentTwo).not.to.be.null; - documentTwo.region.should.be.contain("region2"); - - documentOne.fileName.should.be.equal(documentTwo.fileName); - }); - - it("can concatenate code snippets targeting a single region", () => { - let configuration = { - hostOrigin: "https://docs.microsoft.com" - }; - let dom = new JSDOM( - ` - - -
    -                
    -public class Utility{
    -    
    -}
    -                
    -            
    -
    -                
    -public class AnotherUtility{
    -    
    -}
    -                
    -            
    -
    -                
    -public class AnotherUtilityAgain{
    -    
    -}
    -                
    -            
    - - `, - { - url: configuration.hostOrigin, - runScripts: "dangerously" - }); - - let includes = extractIncludes(dom.window.document); - expect(includes).not.to.be.null; - expect(includes).not.to.be.undefined; - expect(includes.global).not.to.be.undefined; - expect(includes.global).not.to.be.null; - let file = includes.global.files[0]; - expect(file).not.to.be.null; - - includes.global.documents.length.should.be.equal(3); - let documentOne = includes.global.documents[0]; - expect(documentOne).not.to.be.null; - documentOne.region.should.be.contain("region1"); - - let documentTwo = includes.global.documents[1]; - expect(documentTwo).not.to.be.null; - documentTwo.region.should.be.equal("region2[before]"); - - let documentThree = includes.global.documents[2]; - expect(documentThree).not.to.be.null; - documentThree.region.should.be.equal("region2[after]"); - - documentOne.fileName.should.be.equal(documentTwo.fileName); - }); - - it("can declare documents wrapping around editable one", () => { - let configuration = { - hostOrigin: "https://docs.microsoft.com" - }; - let dom = new JSDOM( - ` - - -
    -                
    -public class ClassBefore{
    -    
    -}
    -                
    -            
    -
    -                
    -public class EditableCode{
    -    
    -}
    -                
    -            
    -
    -                
    -public class ClassAfter{
    -    
    -}
    -                
    -            
    - -
    -            
    -public class AnotherClassAfter{
    -
    -}
    -            
    -        
    - - `, - { - url: configuration.hostOrigin, - runScripts: "dangerously" - }); - - let includes = extractIncludes(dom.window.document); - expect(includes).not.to.be.null; - expect(includes).not.to.be.undefined; - expect(includes.global).not.to.be.undefined; - expect(includes.global).not.to.be.null; - let file = includes.global.files[0]; - expect(file).not.to.be.null; - - includes.global.documents.length.should.be.equal(2); - let documentOne = includes.global.documents[0]; - expect(documentOne).not.to.be.null; - documentOne.region.should.be.contain("region2[before]"); - - let documentTwo = includes.global.documents[1]; - expect(documentTwo).not.to.be.null; - documentTwo.region.should.be.equal("region2[after]"); - - documentOne.fileName.should.be.equal(documentTwo.fileName); - }); - - it("can declare documents wrapping around editable one following the order attribute", () => { - let configuration = { - hostOrigin: "https://docs.microsoft.com" - }; - let dom = new JSDOM( - ` - - -
    -                
    -public class ClassBefore{
    -    
    -}
    -                
    -            
    -
    -
    -
    -                
    -public class EditableCode{
    -    
    -}
    -                
    -            
    -
    -
    -
    -                
    -public class ClassAfter{
    -    
    -}
    -                
    -            
    - -
    -            
    -public class AnotherClassAfter{
    -
    -}
    -            
    -        
    - - `, - { - url: configuration.hostOrigin, - runScripts: "dangerously" - }); - - let includes = extractIncludes(dom.window.document); - expect(includes).not.to.be.null; - expect(includes).not.to.be.undefined; - expect(includes.global).not.to.be.undefined; - expect(includes.global).not.to.be.null; - let file = includes.global.files[0]; - expect(file).not.to.be.null; - - includes.global.documents.length.should.be.equal(1); - let documentOne = includes.global.documents[0]; - expect(documentOne).not.to.be.null; - documentOne.region.should.be.contain("region2[before]"); - }); - - it("remmoves dom elements that are hidden", () => { - let configuration = { - hostOrigin: "https://docs.microsoft.com" - }; - let dom = new JSDOM( - ` - - -
    -                
    -public class Utility{
    -    
    -}
    -                
    -            
    -
    -                
    -public class AnotherUtility{
    -    
    -}
    -                
    -            
    -
    -            
    -public class AnotherUtilityWhyNot{
    -
    -}
    -            
    -        
    - - `, - { - url: configuration.hostOrigin, - runScripts: "dangerously" - }); - - let includes = extractIncludes(dom.window.document); - expect(includes).not.to.be.null; - - let includeElements = dom.window.document.querySelectorAll( - `pre>code[data-trydotnet-mode=${ - tryDotNetModes[tryDotNetModes.include] - }]` - ); - - includeElements.length.should.be.equal(0); - }); -}); diff --git a/Microsoft.DotNet.Try.js/test/internals/iframeMessageBus.specs.ts b/Microsoft.DotNet.Try.js/test/internals/iframeMessageBus.specs.ts deleted file mode 100644 index a72322a84..000000000 --- a/Microsoft.DotNet.Try.js/test/internals/iframeMessageBus.specs.ts +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as chai from "chai"; -import { Done } from "mocha"; -import { buildSimpleIFrameDom } from "../domUtilities"; -import * as trydotnet from "../../src/index"; -import { IFrameMessageBus } from "../../src/internals/messageBus"; -import { RUN_REQUEST, RUN_RESPONSE, HOST_EDITOR_READY_EVENT } from "../../src/internals/apiMessages"; -import { configureEmbeddableEditorIFrame } from "../../src/htmlDomHelpers"; - -chai.should(); - -describe("a message bus", () => { - - const defaultConfiguration: trydotnet.Configuration = { hostOrigin: "https://docs.microsoft.com" }; - - it("can post message to iframe", (done: Done) => { - var dom = buildSimpleIFrameDom(defaultConfiguration); - - let iframe = (dom.window.document.querySelector("iframe")); - iframe = configureEmbeddableEditorIFrame(iframe, "0", defaultConfiguration); - - iframe.contentWindow.addEventListener("message", (message: any) => { - if (message.data.type === RUN_REQUEST) { - done(); - } - }); - - let bus = new IFrameMessageBus(iframe, dom.window, "0"); - - bus.post({ type: RUN_REQUEST, requestId: "0" }); - }); - - it("can receive messages from the main window", (done: Done) => { - var dom = buildSimpleIFrameDom(defaultConfiguration);; - - let iframe = (dom.window.document.querySelector("iframe")); - iframe = configureEmbeddableEditorIFrame(iframe, "0", defaultConfiguration); - - dom.window.postMessage({ type: RUN_RESPONSE }, defaultConfiguration.hostOrigin); - - let bus = new IFrameMessageBus(iframe, dom.window, "0"); - - bus.subscribe((message) => { - done(); - }); - }); - - it("can receive messages from the main window with matching editorId", (done: Done) => { - var dom = buildSimpleIFrameDom(defaultConfiguration);; - - let iframe = (dom.window.document.querySelector("iframe")); - iframe = configureEmbeddableEditorIFrame(iframe, "0", defaultConfiguration); - - dom.window.postMessage({ type: HOST_EDITOR_READY_EVENT, editorId: "0" }, defaultConfiguration.hostOrigin); - - let bus = new IFrameMessageBus(iframe, dom.window, "0"); - - bus.subscribe((message) => { - done(); - }); - }); -}); \ No newline at end of file diff --git a/Microsoft.DotNet.Try.js/test/internals/monacoEditor.specs.ts b/Microsoft.DotNet.Try.js/test/internals/monacoEditor.specs.ts deleted file mode 100644 index 750046261..000000000 --- a/Microsoft.DotNet.Try.js/test/internals/monacoEditor.specs.ts +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as chai from "chai"; -import { MonacoTextEditor } from "../../src/internals/monacoTextEditor"; -import { FakeMessageBus } from "../fakes/fakeMessageBus"; -import { FakeIdGenerator } from "../fakes/fakeIdGenerator"; -import { ApiMessage, CONFIGURE_MONACO_REQUEST, DEFINE_THEMES_REQUEST } from "../../src/internals/apiMessages"; - -chai.should(); - -describe("a monaco editor", () => { - - let bus: FakeMessageBus; - let idGenerator: FakeIdGenerator; - let editor: MonacoTextEditor; - - beforeEach(() => { - bus = new FakeMessageBus("test bus"); - idGenerator = new FakeIdGenerator(); - editor = new MonacoTextEditor(bus, idGenerator, bus.id()); - }); - - it("can set the theme as string", () => { - let messages: ApiMessage[] = []; - bus.subscribe(m => messages.push(m)); - editor.setTheme("different theme"); - messages.should.not.be.empty; - messages[0].type.should.equal(CONFIGURE_MONACO_REQUEST); - }); - - it("can set the theme as object", () => { - let messages: ApiMessage[] = []; - bus.subscribe(m => messages.push(m)); - editor.setTheme({ - name: "different theme", - monacoEditorTheme: { - base: 'vs-dark', - inherit: true, - rules: [{ - token: 'comment', - foreground: 'red', - fontStyle: 'italic' - }] - } - }); - messages.should.not.be.empty; - messages[0].type.should.equal(DEFINE_THEMES_REQUEST); - (messages[0]).themes.should.deep.equal({ - "different theme": { - base: 'vs-dark', - inherit: true, - rules: [{ - token: 'comment', - foreground: 'red', - fontStyle: 'italic' - }] - } - }); - messages[1].type.should.equal(CONFIGURE_MONACO_REQUEST); - }); - - it("can set the editor options", () => { - let messages: ApiMessage[] = []; - bus.subscribe(m => messages.push(m)); - editor.setOptions({ - minimap: { - enabled: false - } - }); - messages.should.not.be.empty; - messages[0].type.should.equal(CONFIGURE_MONACO_REQUEST); - messages[0].type.should.equal(CONFIGURE_MONACO_REQUEST); - (messages[0]).editorOptions.minimap.should.deep.equal( - { - enabled: false - }); - }); - - it("can be configured", () => { - let messages: ApiMessage[] = []; - bus.subscribe(m => messages.push(m)); - editor.configure({ - theme: "different theme", - options: { - minimap: { - enabled: false - } - } - }); - messages.should.not.be.empty; - messages[0].type.should.equal(CONFIGURE_MONACO_REQUEST); - (messages[0]).editorOptions.minimap.should.deep.equal( - { - enabled: false - }); - messages[1].type.should.equal(CONFIGURE_MONACO_REQUEST); - (messages[1]).theme.should.equal("different theme"); - }); - -}); \ No newline at end of file diff --git a/Microsoft.DotNet.Try.js/test/internals/requestIdGenerator.specs.ts b/Microsoft.DotNet.Try.js/test/internals/requestIdGenerator.specs.ts deleted file mode 100644 index 0a928df42..000000000 --- a/Microsoft.DotNet.Try.js/test/internals/requestIdGenerator.specs.ts +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as chai from "chai"; -import { buildSimpleIFrameDom } from "../domUtilities"; -import * as trydotnet from "../../src/index"; -import { IFrameMessageBus } from "../../src/internals/messageBus"; -import { configureEmbeddableEditorIFrame } from "../../src/htmlDomHelpers"; -import { RequestIdGenerator } from "../../src/internals/requestIdGenerator"; -import { registerForRequestIdGeneration } from "../messagingMocks"; - -chai.should(); - -describe("a request id generator", () => { - - const defaultConfiguration: trydotnet.Configuration = { hostOrigin: "https://docs.microsoft.com" }; - - it("requests opeartionId from the editor", async () => { - var dom = buildSimpleIFrameDom(defaultConfiguration); - - let iframe = (dom.window.document.querySelector("iframe")); - iframe = configureEmbeddableEditorIFrame(iframe, "0", defaultConfiguration); - - registerForRequestIdGeneration(defaultConfiguration, iframe, dom.window, (_rid) => "TestRun"); - - let bus = new IFrameMessageBus(iframe, dom.window, "0"); - - let generator = new RequestIdGenerator(bus); - - let opId = await generator.getNewRequestId(); - - opId.should.equal("TestRun"); - }); - - it("uses local generator if cannot communicate with editor", async () => { - var dom = buildSimpleIFrameDom(defaultConfiguration); - - let iframe = (dom.window.document.querySelector("iframe")); - iframe = configureEmbeddableEditorIFrame(iframe, "0", defaultConfiguration); - - let bus = new IFrameMessageBus(iframe, dom.window, "0"); - - let generator = new RequestIdGenerator(bus, 100); - - let opId = await generator.getNewRequestId(); - - opId.should.contain("trydotnetjs.session."); - }); -}); \ No newline at end of file diff --git a/Microsoft.DotNet.Try.js/test/internals/workspace.specs.ts b/Microsoft.DotNet.Try.js/test/internals/workspace.specs.ts deleted file mode 100644 index 8fd6bdf77..000000000 --- a/Microsoft.DotNet.Try.js/test/internals/workspace.specs.ts +++ /dev/null @@ -1,211 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as chai from "chai"; -import { Workspace } from "../../src/internals/workspace"; -import { createProject } from "../../src"; -import { FakeMonacoTextEditor } from "../fakes/fakeMonacoTextEditor"; -import { FakeMessageBus } from "../fakes/fakeMessageBus"; -import { FakeIdGenerator } from "../fakes/fakeIdGenerator"; -import { expect } from "chai"; -chai.should(); - -describe("a workspace", () => { - - it("is not marked as modified at creation", () => { - let ws = new Workspace(new FakeMessageBus("0"), new FakeIdGenerator()); - ws.isModified().should.be.false; - }); - - it("is marked as modified when propulated from a project", async () => { - let ws = new Workspace(new FakeMessageBus("0"), new FakeIdGenerator()); - let project = await createProject({ packageName: "console", files: [{ name: "program.cs", content: "the program" }, { name: "otherFile.cs", content: "other file content" }] }); - ws.fromProject(project); - ws.isModified().should.be.true; - }); - - it("is should have default language", async () => { - let ws = new Workspace(new FakeMessageBus("0"), new FakeIdGenerator()); - let project = await createProject({ packageName: "console", files: [{ name: "program.cs", content: "the program" }, { name: "otherFile.cs", content: "other file content" }] }); - ws.fromProject(project); - ws.isModified().should.be.true; - let request = ws.toSetWorkspaceRequests(); - request.workspace.language.should.be.equal("csharp"); - }); - - it("is retains the language of hte project", async () => { - let ws = new Workspace(new FakeMessageBus("0"), new FakeIdGenerator()); - let project = await createProject({ packageName: "console", language: "fsharp", files: [{ name: "program.cs", content: "the program" }, { name: "otherFile.cs", content: "other file content" }] }); - ws.fromProject(project); - ws.isModified().should.be.true; - let request = ws.toSetWorkspaceRequests(); - request.workspace.language.should.be.equal("fsharp"); - }); - - it("is marked as modified when a document is opened", async () => { - let ws = new Workspace(new FakeMessageBus("0"), new FakeIdGenerator()); - let project = await createProject({ packageName: "console", files: [{ name: "program.cs", content: "the program" }, { name: "otherFile.cs", content: "other file content" }] }); - ws.fromProject(project); - await ws.openDocument({ fileName: "program.cs" }); - ws.isModified().should.be.true; - }); - - it("is not marked as modified when is exported as setWorkspaceRequest object", async () => { - let ws = new Workspace(new FakeMessageBus("0"), new FakeIdGenerator()); - let project = await createProject({ packageName: "console", files: [{ name: "program.cs", content: "the program" }, { name: "otherFile.cs", content: "other file content" }] }); - ws.fromProject(project); - ws.isModified().should.be.true; - ws.toSetWorkspaceRequests(); - ws.isModified().should.be.false; - }); - - it("is not marked as modified when a document is opened again", async () => { - let ws = new Workspace(new FakeMessageBus("0"), new FakeIdGenerator()); - let project = await createProject({ packageName: "console", files: [{ name: "program.cs", content: "the program" }, { name: "otherFile.cs", content: "other file content" }] }); - ws.fromProject(project); - ws.isModified().should.be.true; - let doc = await ws.openDocument({ fileName: "program.cs" }); - ws.toSetWorkspaceRequests(); - ws.isModified().should.be.false; - doc = await ws.openDocument({ fileName: "program.cs" }); - }); - - it("is marked as modified when a document is opened and the content is changed", async () => { - let ws = new Workspace(new FakeMessageBus("0"), new FakeIdGenerator()); - let project = await createProject({ packageName: "console", files: [{ name: "program.cs", content: "the program" }, { name: "otherFile.cs", content: "other file content" }] }); - ws.fromProject(project); - let doc = await ws.openDocument({ fileName: "program.cs" }); - doc.setContent("modified content"); - ws.isModified().should.be.true; - }); - - it("generates set workspace request object", async () => { - let ws = new Workspace(new FakeMessageBus("0"), new FakeIdGenerator()); - let project = await createProject({ packageName: "console", files: [{ name: "program.cs", content: "the program" }, { name: "otherFile.cs", content: "other file content" }] }); - ws.fromProject(project); - let doc = await ws.openDocument({ fileName: "program.cs" }); - doc.setContent("modified content"); - let wsr = ws.toSetWorkspaceRequests(); - wsr.should.not.be.null; - wsr.workspace.should.not.be.null; - wsr.workspace.buffers[0].should.not.be.null; - }); - - it("generates set workspace request object with active bufferId equal to the document currently open in an editor", async () => { - let ws = new Workspace(new FakeMessageBus("0"), new FakeIdGenerator()); - let project = await createProject( - { - packageName: "console", - files: - [ - { name: "program.cs", content: "the program" }, - { name: "otherFile.cs", content: "other file content" } - ] - }); - - ws.fromProject(project); - let editorZero = new FakeMonacoTextEditor("0"); - let editorOne = new FakeMonacoTextEditor("1"); - let programDocument = await ws.openDocument({ fileName: "program.cs", textEditor: editorZero }); - let otherFileDocument = await ws.openDocument({ fileName: "otherFile.cs", textEditor: editorOne }); - programDocument.setContent("modified content"); - let wsr = ws.toSetWorkspaceRequests(); - - wsr.workspace.should.not.be.null; - wsr.workspace.buffers[0].should.not.be.null; - wsr.workspace.buffers[1].should.not.be.null; - wsr.bufferIds[editorZero.id()].should.be.equal("program.cs"); - wsr.bufferIds[editorOne.id()].should.be.equal("otherFile.cs"); - }); - - it("can open a document and set its content", async () => { - let ws = new Workspace(new FakeMessageBus("0"), new FakeIdGenerator()); - let project = await createProject( - { - packageName: "console", - files: [ - { name: "program.cs", content: "the program" }, - { name: "otherFile.cs", content: "other file content" } - ] - }); - - ws.fromProject(project); - let doc = await ws.openDocument({ fileName: "program.cs", content: "content override" }); - expect(doc).not.to.be.null; - doc.getContent().should.be.equal("content override"); - }); - - it("can open a document in the editor and set its content", async () => { - let ws = new Workspace(new FakeMessageBus("0"), new FakeIdGenerator()); - let project = await createProject( - { - packageName: "console", - files: [ - { name: "program.cs", content: "the program" }, - { name: "otherFile.cs", content: "other file content" } - ] - }); - - let editorZero = new FakeMonacoTextEditor("0"); - ws.fromProject(project); - let doc = await ws.openDocument({ fileName: "program.cs", textEditor: editorZero, content: "content override" }); - expect(doc).not.to.be.null; - doc.getContent().should.be.equal("content override"); - doc.currentEditor().should.not.be.null; - doc.currentEditor().id().should.be.equal("0"); - editorZero.content.should.be.equal(doc.getContent()); - }); - - it("can open a document in one edtior at a time", async () => { - let ws = new Workspace(new FakeMessageBus("0"), new FakeIdGenerator()); - let project = await createProject( - { - packageName: "console", - files: [ - { name: "program.cs", content: "the program" }, - { name: "otherFile.cs", content: "other file content" } - ] - }); - - ws.fromProject(project); - let editorZero = new FakeMonacoTextEditor("0"); - let editorOne = new FakeMonacoTextEditor("1"); - let doc = await ws.openDocument({ fileName: "program.cs", textEditor: editorZero }); - - doc.isActiveInEditor().should.be.true; - doc.currentEditor().should.not.be.null; - doc.currentEditor().id().should.be.equal("0"); - - doc = await ws.openDocument({ fileName: "program.cs", textEditor: editorOne }); - doc.isActiveInEditor().should.be.true; - doc.currentEditor().should.not.be.null; - doc.currentEditor().id().should.be.equal("1"); - }); - - it("can open documents in different edtiors at same time", async () => { - let ws = new Workspace(new FakeMessageBus("0"), new FakeIdGenerator()); - let project = await createProject( - { - packageName: "console", - files: [ - { name: "program.cs", content: "the program" }, - { name: "otherFile.cs", content: "other file content" } - ] - }); - - ws.fromProject(project); - let editorZero = new FakeMonacoTextEditor("0"); - let editorOne = new FakeMonacoTextEditor("1"); - - let programDocument = await ws.openDocument({ fileName: "program.cs", textEditor: editorZero }); - let otherFileDocument = await ws.openDocument({ fileName: "otherFile.cs", textEditor: editorOne }); - - programDocument.isActiveInEditor().should.be.true; - programDocument.currentEditor().should.not.be.null; - programDocument.currentEditor().id().should.be.equal("0"); - - otherFileDocument.isActiveInEditor().should.be.true; - otherFileDocument.currentEditor().should.not.be.null; - otherFileDocument.currentEditor().id().should.be.equal("1"); - }); -}); diff --git a/Microsoft.DotNet.Try.js/test/messagingMocks.ts b/Microsoft.DotNet.Try.js/test/messagingMocks.ts deleted file mode 100644 index 008372e20..000000000 --- a/Microsoft.DotNet.Try.js/test/messagingMocks.ts +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import { DOMWindow } from "jsdom"; -import { Configuration } from "../src"; -import { ApiMessage, RUN_REQUEST, COMPILE_REQUEST, CREATE_OPERATION_ID_REQUEST, CREATE_OPERATION_ID_RESPONSE, CREATE_REGIONS_FROM_SOURCEFILES_REQUEST, CREATE_REGIONS_FROM_SOURCEFILES_RESPONSE, SET_EDITOR_CODE_REQUEST, CODE_CHANGED_EVENT, SET_ACTIVE_BUFFER_REQUEST, HOST_EDITOR_READY_EVENT, SET_WORKSPACE_REQUEST, HOST_RUN_READY_EVENT, } from "../src/internals/apiMessages"; -import { SourceFileRegion, SourceFile } from "../src/project"; -import { wait } from "./wait"; - -export type EditorState = { - content: string, - documentId: string -}; - -export function registerForRunRequest(configuration: Configuration, iframe: HTMLIFrameElement, window: DOMWindow, onRequest: (request: ApiMessage) => ApiMessage): void { - iframe.contentWindow.addEventListener("message", (message: any) => { - if (message.data.type === RUN_REQUEST) { - let apiCall = (message.data); - window.postMessage(onRequest(apiCall), configuration.hostOrigin); - } - }); -} - -export function registerForLongRunRequest(configuration: Configuration, iframe: HTMLIFrameElement, window: DOMWindow, onRequest: (request: ApiMessage) => ApiMessage): void { - iframe.contentWindow.addEventListener("message", (message: any) => { - if (message.data.type === RUN_REQUEST) { - let apiCall = (message.data); - wait(1000).then(() => { - window.postMessage(onRequest(apiCall), configuration.hostOrigin); - }); - } - }); -} - -export function registerForCompileRequest(configuration: Configuration, iframe: HTMLIFrameElement, window: DOMWindow, onRequest: (request: ApiMessage) => ApiMessage): void { - iframe.contentWindow.addEventListener("message", (message: any) => { - if (message.data.type === COMPILE_REQUEST) { - let apiCall = (message.data); - window.postMessage(onRequest(apiCall), configuration.hostOrigin); - } - }); -} - -export function registerForRequestIdGeneration(configuration: Configuration, iframe: HTMLIFrameElement, window: DOMWindow, onRequest: (requestId: string) => string) { - iframe.contentWindow.addEventListener("message", (message: any) => { - if (message.data.type === CREATE_OPERATION_ID_REQUEST) { - let response: ApiMessage = { - type: CREATE_OPERATION_ID_RESPONSE, - requestId: message.data.requestId, - operationId: onRequest(message.data.requestId) - - }; - window.postMessage(response, configuration.hostOrigin); - } - }); -} - -export function registerForRegionFromFile(configuration: Configuration, iframe: HTMLIFrameElement, window: DOMWindow, onRequest: (files: SourceFile[]) => SourceFileRegion[]) { - iframe.contentWindow.addEventListener("message", (message: any) => { - if (message.data.type === CREATE_REGIONS_FROM_SOURCEFILES_REQUEST) { - let response: ApiMessage = { - type: CREATE_REGIONS_FROM_SOURCEFILES_RESPONSE, - requestId: message.data.requestId, - regions: onRequest(message.data.files) - - }; - window.postMessage(response, configuration.hostOrigin); - } - }); -} - -export function registerForEditorMessages(configuration: Configuration, iframe: HTMLIFrameElement, window: DOMWindow, editorState: EditorState) { - iframe.contentWindow.addEventListener("message", (message: any) => { - let apiMessage = (message.data); - if (apiMessage.type === SET_ACTIVE_BUFFER_REQUEST) { - editorState.documentId = apiMessage.bufferId; - } - if (apiMessage.type === SET_EDITOR_CODE_REQUEST) { - editorState.content = apiMessage.sourceCode; - - let response: ApiMessage = { - type: CODE_CHANGED_EVENT, - requestId: apiMessage.requestId, - sourceCode: apiMessage.sourceCode, - bufferId: editorState.documentId - }; - - window.postMessage(response, configuration.hostOrigin); - } - }); -} - -export function trackSetWorkspaceRequests(configuration: Configuration, iframe: HTMLIFrameElement, window: DOMWindow, messageStack: ApiMessage[]) { - iframe.contentWindow.addEventListener("message", (message: any) => { - let apiMessage = (message.data); - if (apiMessage.type === SET_WORKSPACE_REQUEST) { - messageStack.push(apiMessage); - } - }); -} - -export function raiseTextChange(configuration: Configuration, window: DOMWindow, newText: string, documentId: string) { - let message = { - type: CODE_CHANGED_EVENT, - sourceCode: newText, - bufferId: documentId - }; - - window.postMessage(message, configuration.hostOrigin); -} - -export function notifyEditorReady(configuration: Configuration, window: DOMWindow) { - let response: ApiMessage = { - type: HOST_EDITOR_READY_EVENT - }; - - window.postMessage(response, configuration.hostOrigin); -} - -export function notifyEditorReadyWithId(configuration: Configuration, window: DOMWindow, editorId: string) { - let response: ApiMessage = { - type: HOST_EDITOR_READY_EVENT, - editorId: editorId - }; - - window.postMessage(response, configuration.hostOrigin); -} - -export function notifyRunReadyWithId(configuration: Configuration, window: DOMWindow, editorId: string) { - let response: ApiMessage = { - type: HOST_RUN_READY_EVENT, - editorId: editorId - }; - - window.postMessage(response, configuration.hostOrigin); -} \ No newline at end of file diff --git a/Microsoft.DotNet.Try.js/test/preOutputPanel.specs.ts b/Microsoft.DotNet.Try.js/test/preOutputPanel.specs.ts deleted file mode 100644 index f77ef9bcb..000000000 --- a/Microsoft.DotNet.Try.js/test/preOutputPanel.specs.ts +++ /dev/null @@ -1,220 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as chai from "chai"; -import { JSDOM } from "jsdom"; -import { PreOutputPanel } from "../src"; -import { isMainThread } from "worker_threads"; - -chai.should(); - -describe("a preOutputPanel", () => { - let dom: JSDOM = null; - - beforeEach(() => { - dom = new JSDOM( - ` - - -
    - - - `, - { - url: "http://localhost", - runScripts: "dangerously" - }); - }); - - it("can clear the content", async () => { - let div = dom.window.document.querySelector(`#outputPanel`); - let panel = new PreOutputPanel(div); - await panel.clear(); - div.innerHTML.should.be.equal("
    "); - }); - - it("can set the content", async () => { - let div = dom.window.document.querySelector(`#outputPanel`); - let panel = new PreOutputPanel(div); - await panel.write("new Entry"); - div.innerHTML.should.be.equal("
    new Entry
    "); - }); - - it("can set the content from a list of strings", async () => { - let div = dom.window.document.querySelector(`#outputPanel`); - let content = ["a", "b", "c"]; - let expectedContent = -`
    a
    -b
    -c
    `; - let panel = new PreOutputPanel(div); - await panel.write(content); - div.innerHTML.should.be.equal(expectedContent); - }); - - it("can append to the content", async () => { - let div = dom.window.document.querySelector(`#outputPanel`); - let panel = new PreOutputPanel(div); - var oldEntry = "old Entry"; - var newEntry = "new Entry"; - await panel.append(oldEntry); - await panel.append(newEntry); - let expectedContent = `
    ${oldEntry}${newEntry}
    `; - div.innerHTML.should.be.equal(expectedContent); - }); - - it("can append to the content from a list of strings", async () => { - let div = dom.window.document.querySelector(`#outputPanel`); - let oldEntry = "old Entry"; - let content = ["a", "b", "c"]; - let expectedContent = -`
    ${oldEntry}a
    -b
    -c
    `; - let panel = new PreOutputPanel(div); - await panel.append(oldEntry) - await panel.append(content); - div.innerHTML.should.be.equal(expectedContent); - }); - - it("html encodes the appended content", async () => { - let div = dom.window.document.querySelector(`#outputPanel`); - let content = ["
    code
    ", "b", "c"]; - let expectedContent = -`
    <div>code</div>
    -b
    -c
    `; - let panel = new PreOutputPanel(div); - await panel.append(content); - div.innerHTML.should.be.equal(expectedContent); - }); - - it("preserves white spaces", async () => { - let div = dom.window.document.querySelector(`#outputPanel`); - let content = [" 3 whitespaces before", "3 whitespaces after "]; - let expectedContent = -`
       3 whitespaces before
    -3 whitespaces after   
    `; - let panel = new PreOutputPanel(div); - await panel.append(content); - div.innerHTML.should.be.equal(expectedContent); - }); - - it("if the content is cleared and append is called, it retains the new content", async() => { - let div = dom.window.document.querySelector(`#outputPanel`); - let panel = new PreOutputPanel(div); - await panel.append("old content"); - await panel.clear(); - await panel.write("new content"); - div.innerHTML.should.be.equal("
    new content
    "); - }); - - describe("it can size-to-content", () => { - describe("write", () => { - it("if the length of the content is less than 5, it sets the height to 5em", async() => { - let div = dom.window.document.querySelector(`#outputPanel`); - let panel = new PreOutputPanel(div); - div.parentElement.style.height.should.be.empty; - await panel.write("Hello World"); - div.parentElement.style.height.should.be.equal("5em"); - }); - - it("if the length of the content is greater than 5, it sets the height to the content", async() => { - let div = dom.window.document.querySelector(`#outputPanel`); - let content = ["Line 1", "Line 2", "Line 3", "Line 4", "Line 5", "Line 6", "Line 7"]; - let panel = new PreOutputPanel(div); - div.parentElement.style.height.should.be.empty; - await panel.write(content); - div.parentElement.style.height.should.be.equal("7em"); - }); - - it("if the string contains break lines, the height is set accordingly", async() => { - let div = dom.window.document.querySelector(`#outputPanel`); - let panel = new PreOutputPanel(div); - div.parentElement.style.height.should.be.empty; - await panel.write("Line 1\nLine 2\nLine 3\n\nLine 4\nLine 5\nLine 6\nLine 7"); - div.parentElement.style.height.should.be.equal("8em"); - }); - - it("if the div doesnt have the size-to-content class, it doesnt modify the height", async() => { - let dom = new JSDOM( - ` - - -
    - - `, - { - url: "http://localhost", - runScripts: "dangerously" - }); - let div = dom.window.document.querySelector(`#outputPanel`); - let content = ["Line 1", "Line 2", "Line 3", "Line 4", "Line 5", "Line 6", "Line 7"]; - let panel = new PreOutputPanel(div); - await panel.write(content); - div.parentElement.style.height.should.be.empty; - }); - - it("once the height has been set it doesnt change in the next call", async() => { - let div = dom.window.document.querySelector(`#outputPanel`); - let panel = new PreOutputPanel(div); - let content = ["Line 1", "Line 2"]; - await panel.write(content); - div.parentElement.style.height.should.be.equal("5em"); - content = ["Line 1", "Line 2", "Line 3", "Line 4", "Line 5", "Line 6"]; - await panel.write(content); - div.parentElement.style.height.should.be.equal("5em"); - }); - }); - - describe("append", () => { - it("if the length of the content is less than 5, it sets the height to 5em", async() => { - let div = dom.window.document.querySelector(`#outputPanel`); - let panel = new PreOutputPanel(div); - div.parentElement.style.height.should.be.empty; - await panel.append("Hello World"); - div.parentElement.style.height.should.be.equal("5em"); - }); - - it("if the length of the content is greater than 5, it sets the height to the content", async() => { - let div = dom.window.document.querySelector(`#outputPanel`); - let content = ["Line 1", "Line 2", "Line 3", "Line 4", "Line 5", "Line 6", "Line 7"]; - let panel = new PreOutputPanel(div); - div.parentElement.style.height.should.be.empty; - await panel.append(content); - div.parentElement.style.height.should.be.equal("7em"); - }); - - it("once the height has been set it doesnt change in the next call", async() => { - let div = dom.window.document.querySelector(`#outputPanel`); - let panel = new PreOutputPanel(div); - let content = ["Line 1", "Line 2"]; - await panel.append(content); - div.parentElement.style.height.should.be.equal("5em"); - content = ["Line 1", "Line 2", "Line 3", "Line 4", "Line 5", "Line 6"]; - await panel.append(content); - div.parentElement.style.height.should.be.equal("5em"); - }); - - it("if the div doesnt have the size-to-content class, it doesnt modify the height", async() => { - let dom = new JSDOM( - ` - - -
    - - `, - { - url: "http://localhost", - runScripts: "dangerously" - }); - let div = dom.window.document.querySelector(`#outputPanel`); - let content = ["Line 1", "Line 2", "Line 3", "Line 4", "Line 5", "Line 6", "Line 7"]; - let panel = new PreOutputPanel(div); - await panel.append(content); - div.parentElement.style.height.should.be.empty; - }); - }); - }); - -}); \ No newline at end of file diff --git a/Microsoft.DotNet.Try.js/test/session.compileapi.specs.ts b/Microsoft.DotNet.Try.js/test/session.compileapi.specs.ts deleted file mode 100644 index a9c49467a..000000000 --- a/Microsoft.DotNet.Try.js/test/session.compileapi.specs.ts +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as chai from "chai"; -import { Configuration, configureEmbeddableEditorIFrame, createProject } from "../src/index"; -import { buildSimpleIFrameDom } from "./domUtilities"; -import { JSDOM } from "jsdom"; -import { registerForCompileRequest, registerForRequestIdGeneration, notifyEditorReady } from "./messagingMocks"; -import { ApiMessage, COMPILE_RESPONSE, COMPILE_REQUEST, SERVICE_ERROR_RESPONSE } from "../src/internals/apiMessages"; -import { createReadySession } from "./sessionFactory"; -import { Done } from "mocha"; -chai.should(); - -describe("a user", () => { - - let configuration: Configuration; - let dom: JSDOM; - let editorIFrame: HTMLIFrameElement; - - beforeEach(() => { - configuration = { hostOrigin: "https://docs.microsoft.com" }; - dom = buildSimpleIFrameDom(configuration); - let iframe = (dom.window.document.querySelector("iframe")); - editorIFrame = configureEmbeddableEditorIFrame(iframe, "0", configuration); - }); - - describe("with a trydotnet session", () => { - it("can compile the loaded project", async () => { - let session = await createReadySession(configuration, editorIFrame, dom.window); - - registerForCompileRequest(configuration, editorIFrame, dom.window, (request: ApiMessage): ApiMessage => { - return { - type: COMPILE_RESPONSE, - requestId: request.type === COMPILE_REQUEST ? request.requestId : undefined, - outcome: request.type === COMPILE_REQUEST ? "Success" : "CompilationError" - } - }); - - registerForRequestIdGeneration(configuration, editorIFrame, dom.window, (_rid) => "TestRun"); - - let project = await createProject({ packageName: "console", files: [{ name: "program.cs", content: "" }] }); - session.openProject(project); - - let result = await session.compile(); - result.succeeded.should.be.true; - }); - - it("can compile the loaded project and intercept service error", (done: Done) => { - let awaitableSession = createReadySession(configuration, editorIFrame, dom.window); - awaitableSession.then(session => { - registerForCompileRequest(configuration, editorIFrame, dom.window, (request: ApiMessage): ApiMessage => { - return { - type: SERVICE_ERROR_RESPONSE, - requestId: request.type === COMPILE_REQUEST ? request.requestId : undefined, - message: "failed to run", - statusCode: "503" - } - }); - - registerForRequestIdGeneration(configuration, editorIFrame, dom.window, (_rid) => "TestRun"); - - session.openProject({ package: "console", files: [{ name: "program.cs", content: "" }] }); - - session.compile().catch(error => { - if (error.message === "failed to run") { - done(); - } - }); - }); - }); - }); -}); \ No newline at end of file diff --git a/Microsoft.DotNet.Try.js/test/session.creationapi.specs.ts b/Microsoft.DotNet.Try.js/test/session.creationapi.specs.ts deleted file mode 100644 index 8823acb69..000000000 --- a/Microsoft.DotNet.Try.js/test/session.creationapi.specs.ts +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as chai from "chai"; -import * as chaiAsPromised from "chai-as-promised"; -import { Configuration, createSessionWithProjectAndOpenDocument, createSession } from "../src/index"; -import { buildSimpleIFrameDom, getEditorIFrames, buildMultiIFrameDom } from "./domUtilities"; -import { notifyEditorReady, notifyEditorReadyWithId } from "./messagingMocks"; -import { tryGetEditorId } from "../src/internals/messageBus"; - -chai.use(chaiAsPromised); -chai.should(); - -describe("a user", () => { - let configuration: Configuration; - - beforeEach(() => { - configuration = { hostOrigin: "https://docs.microsoft.com" }; - }); - describe("with single iframe", () => { - it("can create a session with initial project", async () => { - let dom = buildSimpleIFrameDom(configuration); - let editorIFrames = getEditorIFrames(dom); - let awaitableSession = createSessionWithProjectAndOpenDocument( - configuration, - editorIFrames, - dom.window, - { - package: "console", - files: [{ name: "program.cs", content: "" }] - }, - "program.cs"); - - notifyEditorReady(configuration, dom.window); - let session = await awaitableSession; - session.should.not.be.null; - }); - }); - describe("with multiple iframes", () => { - it("can create a session", async () => { - let dom = buildMultiIFrameDom(configuration); - let editorIFrames = getEditorIFrames(dom); - let awaitableSession = createSession(configuration, - editorIFrames, - dom.window); - - editorIFrames.forEach((iframe, index) => { - notifyEditorReadyWithId(configuration, dom.window, tryGetEditorId(iframe, index.toString())); - }); - - let session = await awaitableSession; - session.should.not.be.null; - }); - - it("requires all buses to be ready", async () => { - let dom = buildMultiIFrameDom(configuration); - let editorIFrames = getEditorIFrames(dom); - let awaitableSession = createSession(configuration, - editorIFrames, - dom.window); - - notifyEditorReadyWithId(configuration, dom.window, tryGetEditorId(editorIFrames[0], "0")); - - awaitableSession.should.not.be.fulfilled; - }); - }); -}); \ No newline at end of file diff --git a/Microsoft.DotNet.Try.js/test/session.documentapi.specs.ts b/Microsoft.DotNet.Try.js/test/session.documentapi.specs.ts deleted file mode 100644 index f81b282aa..000000000 --- a/Microsoft.DotNet.Try.js/test/session.documentapi.specs.ts +++ /dev/null @@ -1,243 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as chai from "chai"; -import { Configuration, SourceFile, createProject } from "../src/index"; -import { JSDOM } from "jsdom"; -import { buildSimpleIFrameDom, getEditorIFrame, buildMultiIFrameDom, getEditorIFrames, buildDoubleIFrameDom } from "./domUtilities"; -import * as chaiAsPromised from "chai-as-promised"; -import { registerForRegionFromFile, registerForRequestIdGeneration, registerForEditorMessages, notifyEditorReady, EditorState, trackSetWorkspaceRequests, raiseTextChange } from "./messagingMocks"; -import { wait } from "./wait"; -import { createReadySession, createReadySessionWithMultipleEditors } from "./sessionFactory"; -import { ApiMessage, SET_WORKSPACE_REQUEST } from "../src/internals/apiMessages"; -import { IWorkspace } from "../src/internals/workspace"; -import { expect } from "chai"; - -chai.use(chaiAsPromised); -chai.should(); - - - -describe("A user", () => { - - let configuration: Configuration; - let dom: JSDOM; - let editorIFrame: HTMLIFrameElement; - - beforeEach(() => { - configuration = { hostOrigin: "https://docs.microsoft.com" }; - dom = buildSimpleIFrameDom(configuration); - editorIFrame = getEditorIFrame(dom); - }); - describe("with a trydotnet session", () => { - it("can open a document", async () => { - let session = await createReadySession(configuration, editorIFrame, dom.window); - let project = await createProject({ packageName: "console", files: [{ name: "program.cs", content: "file content" }] }); - await session.openProject(project); - let document = await session.openDocument({ fileName: "program.cs" }); - - document.id().should.equal("program.cs"); - document.getContent().should.equal("file content"); - }); - - it("creates a empty document when the project does not have a matching file", async () => { - let session = await createReadySession(configuration, editorIFrame, dom.window); - let project = await createProject({ packageName: "console", files: [{ name: "program.cs", content: "file content" }] }); - await session.openProject(project); - - let document = await session.openDocument({ fileName: "program_two.cs" }); - expect(document).to.not.be.null; - document.id().should.equal("program_two.cs"); - document.getContent().should.equal(""); - }); - - it("creates a empty document when using region and the project does not have a matching file", async () => { - let session = await createReadySession(configuration, editorIFrame, dom.window); - let project = await createProject({ packageName: "console", files: [{ name: "program.cs", content: "file content" }] }); - await session.openProject(project); - - let document = await session.openDocument({ fileName: "program_two.cs", region: "controller" }); - expect(document).to.not.be.null; - document.id().should.equal("program_two.cs@controller"); - document.getContent().should.equal(""); - }); - - it("can open a document with region as identifier", async () => { - let session = await createReadySession(configuration, editorIFrame, dom.window); - let project = await createProject({ packageName: "console", files: [{ name: "program.cs", content: "//pre\n#region controller\n//content\n e#endregion\n//post/n" }] }); - await session.openProject(project); - - registerForRequestIdGeneration(configuration, editorIFrame, dom.window, (_rid) => "TestRun"); - registerForRegionFromFile(configuration, editorIFrame, dom.window, (files: SourceFile[]) => { - if (files) { - return [{ id: "program.cs@controller", content: "//content" }] - } - return null; - }) - let document = await session.openDocument({ fileName: "program.cs", region: "controller" }); - document.id().should.equal("program.cs@controller"); - document.getContent().should.equal("//content"); - }); - - it("can open a document and bind it immediately to an editor", async () => { - let editorState = { content: "", documentId: "" }; - let session = await createReadySession(configuration, editorIFrame, dom.window); - let defaultEditor = session.getTextEditor(); - let project = await createProject({ packageName: "console", files: [{ name: "program.cs", content: "file content" }] }); - registerForRequestIdGeneration(configuration, editorIFrame, dom.window, _r => "TestRun0"); - await session.openProject(project); - registerForEditorMessages(configuration, editorIFrame, dom.window, editorState); - await session.openDocument({ fileName: "program.cs", editorId: defaultEditor.id() }); - await wait(1000); - editorState.content.should.equal("file content"); - editorState.documentId.should.equal("program.cs"); - }); - - it("can return the open documents", async() => { - let session = await createReadySession(configuration, editorIFrame, dom.window); - let defaultEditor = session.getTextEditor(); - let project = await createProject({ packageName: "console", files: [{ name: "program.cs", content: "file content" }]}); - await session.openProject(project); - await session.openDocument({ fileName: "program.cs", editorId: defaultEditor.id(), content:"i am a document" }); - let documents = session.getOpenDocuments(); - documents.should.have.length(1); - documents[0].getContent().should.equal("i am a document"); - }); - - describe("and with a document", () => { - it("can set the content and affect editor", async () => { - let editorState = { content: "", documentId: "" }; - let session = await createReadySession(configuration, editorIFrame, dom.window); - let defaultEditor = session.getTextEditor(); - let project = await createProject({ packageName: "console", files: [{ name: "program.cs", content: "file content" }] }); - await session.openProject(project); - registerForRequestIdGeneration(configuration, editorIFrame, dom.window, _r => "TestRun1"); - - await session.openProject(project); - let document = await session.openDocument({ fileName: "program.cs", editorId: defaultEditor.id() }); - registerForEditorMessages(configuration, editorIFrame, dom.window, editorState); - await document.setContent("new content"); - document.getContent().should.equal("new content"); - await wait(1000); - editorState.content.should.equal("new content"); - }); - - it("can track editor changes", async () => { - let editorState = { content: "", documentId: "" }; - let session = await createReadySession(configuration, editorIFrame, dom.window); - let defaultEditor = session.getTextEditor(); - let project = await createProject({ packageName: "console", files: [{ name: "program.cs", content: "file content" }] }); - await session.openProject(project); - registerForRequestIdGeneration(configuration, editorIFrame, dom.window, _r => "TestRun2"); - registerForEditorMessages(configuration, editorIFrame, dom.window, editorState); - let document = await session.openDocument({ fileName: "program.cs", editorId: defaultEditor.id() }); - let editor = session.getTextEditor(); - await editor.setContent("new editor content"); - await wait(1000); - document.getContent().should.equal("new editor content"); - }); - - it("can track editor changes with multiple editors", async () => { - dom = buildMultiIFrameDom(configuration); - let editorIFrames = getEditorIFrames(dom); - let editorStates: { [key: string]: EditorState } = {}; - - let session = await createReadySessionWithMultipleEditors(configuration, editorIFrames, dom.window); - - let project = await createProject( - { - packageName: "console", files: [ - { name: "program.cs", content: "the program" }, - { name: "otherFile.cs", content: "other file content" } - ] - }); - - await session.openProject(project); - - for (let iframe of editorIFrames) { - editorStates[iframe.dataset.trydotnetEditorId] = { content: "", documentId: "" }; - registerForRequestIdGeneration(configuration, iframe, dom.window, _r => "TestRun2"); - registerForEditorMessages(configuration, iframe, dom.window, editorStates[iframe.dataset.trydotnetEditorId]); - } - - let editorIds = Object.getOwnPropertyNames(editorStates); - let lastIndex = editorIds.length - 1; - let programDocument = await session.openDocument({ editorId: editorIds[lastIndex], fileName: "program.cs" }); - let otherFileDocument = await session.openDocument({ editorId: editorIds[0], fileName: "otherFile.cs" }); - - raiseTextChange(configuration, dom.window, "new editor content", programDocument.id()); - raiseTextChange(configuration, dom.window, "new content in the other file!", otherFileDocument.id()); - - await wait(1000); - - programDocument.getContent().should.equal("new editor content"); - otherFileDocument.getContent().should.equal("new content in the other file!"); - }); - - it("can dispatch editor change messages with multiple editors", async () => { - dom = buildDoubleIFrameDom(configuration); - let editorIFrames = getEditorIFrames(dom); - let editorMessageStacks: { [key: string]: ApiMessage[] } = {}; - - let session = await createReadySessionWithMultipleEditors(configuration, editorIFrames, dom.window); - - let project = await createProject( - { - packageName: "console", files: [ - { name: "program.cs", content: "the program" }, - { name: "otherFile.cs", content: "other file content" } - ] - }); - - await session.openProject(project); - - for (let iframe of editorIFrames) { - editorMessageStacks[iframe.dataset.trydotnetEditorId] = []; - registerForRequestIdGeneration(configuration, iframe, dom.window, _r => "TestRun2"); - trackSetWorkspaceRequests(configuration, iframe, dom.window, editorMessageStacks[iframe.dataset.trydotnetEditorId]); - } - - let editorIds = Object.getOwnPropertyNames(editorMessageStacks); - let lastIndex = editorIds.length - 1; - let programDocument = await session.openDocument({ editorId: editorIds[lastIndex], fileName: "program.cs" }); - let otherFileDocument = await session.openDocument({ editorId: editorIds[0], fileName: "otherFile.cs" }); - - raiseTextChange(configuration, dom.window, "new content in program!", programDocument.id()); - raiseTextChange(configuration, dom.window, "new content in the other file!", otherFileDocument.id()); - - await wait(1100); - - let programEditorMessages = editorMessageStacks[editorIds[lastIndex]]; - let otherFileEditorMessages = editorMessageStacks[editorIds[0]]; - - programEditorMessages.length.should.be.greaterThan(0); - otherFileEditorMessages.length.should.be.greaterThan(0); - - let lastProgramEditorMessage = <{ - type: typeof SET_WORKSPACE_REQUEST, - workspace: any, - bufferId: string, - requestId: string - }>programEditorMessages[programEditorMessages.length - 1]; - - let lastOtherFileEditorMessage = <{ - type: typeof SET_WORKSPACE_REQUEST, - workspace: any, - bufferId: string, - requestId: string - }>otherFileEditorMessages[otherFileEditorMessages.length - 1]; - - lastProgramEditorMessage.type.should.equal(SET_WORKSPACE_REQUEST); - lastProgramEditorMessage.type.should.equal(lastOtherFileEditorMessage.type); - - lastProgramEditorMessage.workspace.should.deep.equal(lastOtherFileEditorMessage.workspace); - lastProgramEditorMessage.bufferId.should.be.equal(programDocument.id()); - lastOtherFileEditorMessage.bufferId.should.be.equal(otherFileDocument.id()); - - lastProgramEditorMessage.workspace.buffers.should.deep.equal(lastOtherFileEditorMessage.workspace.buffers); - ((lastProgramEditorMessage.workspace)).buffers.find(b => b.id === "program.cs").content.should.be.equal("new content in program!"); - ((lastProgramEditorMessage.workspace)).buffers.find(b => b.id === "otherFile.cs").content.should.be.equal("new content in the other file!"); - }); - }); - }); -}); \ No newline at end of file diff --git a/Microsoft.DotNet.Try.js/test/session.intellisense.specs.ts b/Microsoft.DotNet.Try.js/test/session.intellisense.specs.ts deleted file mode 100644 index 304951ab7..000000000 --- a/Microsoft.DotNet.Try.js/test/session.intellisense.specs.ts +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as chai from "chai"; -import { Configuration, createProject } from "../src/index"; -import { buildSimpleIFrameDom, getEditorIFrame } from "./domUtilities"; -import { JSDOM } from "jsdom"; -import { createReadySession } from "./sessionFactory"; -chai.should(); - -describe.skip("a user", () => { - let configuration: Configuration; - let dom: JSDOM; - let editorIFrame: HTMLIFrameElement; - - beforeEach(() => { - configuration = { hostOrigin: "https://docs.microsoft.com" }; - dom = buildSimpleIFrameDom(configuration); - editorIFrame = getEditorIFrame(dom); - }); - - describe("with a trydotnet session", () => { - it("can request completion list", async () => { - let session = await createReadySession(configuration, editorIFrame, dom.window); - let project = await createProject({ packageName: "console", files: [{ name: "program.cs", content: "Console.W" }] }) - session.openProject(project); - let completionListResult = await session.getCompletionList("program.cs", 9); - completionListResult.should.not.be.null; - }); - - it("can request completion list with a scope", async () => { - let session = await createReadySession(configuration, editorIFrame, dom.window); - let project = await createProject({ packageName: "console", files: [{ name: "program.cs", content: "var a = 10; #region controller Console.W #endregion" }] }); - session.openProject(project); - let completionListResult = await session.getCompletionList("program.cs", 9, "controller"); - completionListResult.should.not.be.null; - }); - - it("can request signature help", async () => { - let session = await createReadySession(configuration, editorIFrame, dom.window); - let project = await createProject({ packageName: "console", files: [{ name: "program.cs", content: "Console.Write()" }] }); - session.openProject(project); - - let singatureHelpResult = await session.getSignatureHelp("program.cs", 14); - singatureHelpResult.should.not.be.null; - }); - - it("can request signature help with a scope", async () => { - let session = await createReadySession(configuration, editorIFrame, dom.window); - let project = await createProject({ packageName: "console", files: [{ name: "program.cs", content: "var a = 10; #region controller Console.Write() #endregion" }] }); - session.openProject(project); - - let singatureHelpResult = await session.getSignatureHelp("program.cs", 14, "controller"); - singatureHelpResult.should.not.be.null; - - }); - }); -}); \ No newline at end of file diff --git a/Microsoft.DotNet.Try.js/test/session.projectapi.specs.ts b/Microsoft.DotNet.Try.js/test/session.projectapi.specs.ts deleted file mode 100644 index 8886acc0d..000000000 --- a/Microsoft.DotNet.Try.js/test/session.projectapi.specs.ts +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as chai from "chai"; -import { Configuration, createProject } from "../src/index"; -import { buildSimpleIFrameDom, getEditorIFrame } from "./domUtilities"; -import { JSDOM } from "jsdom"; -import { createReadySession } from "./sessionFactory"; -chai.should(); - -describe("a user", () => { - let configuration: Configuration; - let dom: JSDOM; - let editorIFrame: HTMLIFrameElement; - - beforeEach(() => { - configuration = { hostOrigin: "https://docs.microsoft.com" }; - dom = buildSimpleIFrameDom(configuration); - editorIFrame = getEditorIFrame(dom); - }); - - describe("with a trydotnet session", () => { - it("can open a project", async () => { - let session = await createReadySession(configuration, editorIFrame, dom.window); - let project = await createProject({ packageName: "console", files: [{ name: "program.cs", content: "" }] }); - await session.openProject(project); - }); - }); -}); \ No newline at end of file diff --git a/Microsoft.DotNet.Try.js/test/session.runapi.specs.ts b/Microsoft.DotNet.Try.js/test/session.runapi.specs.ts deleted file mode 100644 index 7ec0f8332..000000000 --- a/Microsoft.DotNet.Try.js/test/session.runapi.specs.ts +++ /dev/null @@ -1,208 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as chai from "chai"; -import { Configuration, configureEmbeddableEditorIFrame } from "../src/index"; -import { buildSimpleIFrameDom } from "./domUtilities"; -import { JSDOM } from "jsdom"; -import { Done } from "mocha"; -import { ApiMessage, RUN_RESPONSE, RUN_REQUEST, SERVICE_ERROR_RESPONSE, } from "../src/internals/apiMessages"; -import { registerForRunRequest, registerForRequestIdGeneration, registerForLongRunRequest, notifyEditorReadyWithId, notifyRunReadyWithId } from "./messagingMocks"; -import { createReadySession } from "./sessionFactory"; - -chai.should(); - -describe("a user", () => { - - describe("with a trydotnet session", () => { - - let configuration: Configuration; - let dom: JSDOM; - let editorIFrame: HTMLIFrameElement; - - beforeEach(() => { - configuration = { hostOrigin: "https://docs.microsoft.com" }; - dom = buildSimpleIFrameDom(configuration); - let iframe = (dom.window.document.querySelector("iframe")); - editorIFrame = configureEmbeddableEditorIFrame(iframe, "0", configuration); - }); - - it("can run the loaded project", (done: Done) => { - let awaitableSession = createReadySession(configuration, editorIFrame, dom.window); - awaitableSession.then(session => { - registerForRunRequest(configuration, editorIFrame, dom.window, (request: ApiMessage): ApiMessage => { - return { - type: RUN_RESPONSE, - requestId: request.type === RUN_REQUEST ? request.requestId : undefined, - outcome: "Success" - }; - }); - - registerForRequestIdGeneration(configuration, editorIFrame, dom.window, (_rid) => "TestRun"); - - session.openProject({ package: "console", files: [{ name: "program.cs", content: "" }] }); - - session.run().then(result => { - if (result.succeeded) { - done(); - } else { - - } - }); - }); - }); - - it("will get the current run if requesting one while previous one is inflight", (done: Done) => { - let awaitableSession = createReadySession(configuration, editorIFrame, dom.window); - let count = 0; - let results = ["", ""]; - - awaitableSession.then(session => { - registerForLongRunRequest(configuration, editorIFrame, dom.window, (request: ApiMessage): ApiMessage => { - count++; - return { - type: RUN_RESPONSE, - requestId: request.type === RUN_REQUEST ? request.requestId : undefined, - outcome: "Success", - output: [`${count}`] - }; - }); - - registerForRequestIdGeneration(configuration, editorIFrame, dom.window, (_rid) => "TestRun"); - - session.openProject({ package: "console", files: [{ name: "program.cs", content: "" }] }); - - session.run().then(result => { - if (result.succeeded) { - results[0] = result.output[0]; - if (results[0] === results[1]) { - done(); - } - } else { - - } - }); - - session.run().then(result => { - if (result.succeeded) { - results[1] = result.output[0]; - if (results[0] === results[1]) { - done(); - } - } else { - - } - }); - }); - }); - - it("can subscribe to output events", (done: Done) => { - let awaitableSession = createReadySession(configuration, editorIFrame, dom.window); - awaitableSession.then(session => { - registerForRunRequest(configuration, editorIFrame, dom.window, (request: ApiMessage): ApiMessage => { - return { - type: RUN_RESPONSE, - requestId: request.type === RUN_REQUEST ? request.requestId : undefined, - outcome: "Success", - output: ["line one", "line two"] - } - }); - - registerForRequestIdGeneration(configuration, editorIFrame, dom.window, (_rid) => "TestRun"); - - session.openProject({ package: "console", files: [{ name: "program.cs", content: "" }] }); - - let subscriptions = session.subscribeToOutputEvents((event) => { - event.stdout.should.be.deep.equal(["line one", "line two"]); - done(); - }); - session.run(); - }); - }); - - it("can run the loaded project and intercept service error", (done: Done) => { - let awaitableSession = createReadySession(configuration, editorIFrame, dom.window); - awaitableSession.then(session => { - registerForRunRequest(configuration, editorIFrame, dom.window, (request: ApiMessage): ApiMessage => { - return { - type: SERVICE_ERROR_RESPONSE, - requestId: request.type === RUN_REQUEST ? request.requestId : undefined, - message: "failed to run", - statusCode: "503" - } - }); - - registerForRequestIdGeneration(configuration, editorIFrame, dom.window, (_rid) => "TestRun"); - - session.openProject({ package: "console", files: [{ name: "program.cs", content: "" }] }); - - session.run().catch(error => { - if (error.message === "failed to run") { - done(); - } - }); - }); - }); - - it("can run the loaded project as instrumented", (done: Done) => { - let awaitableSession = createReadySession(configuration, editorIFrame, dom.window); - awaitableSession.then(session => { - registerForRunRequest(configuration, editorIFrame, dom.window, (request: ApiMessage): ApiMessage => { - return { - type: RUN_RESPONSE, - requestId: request.type === RUN_REQUEST ? request.requestId : undefined, - outcome: request.type === RUN_REQUEST && request.parameters["instrument"] ? "Success" : "Exception" - } - }); - - registerForRequestIdGeneration(configuration, editorIFrame, dom.window, (_rid) => "TestRun"); - - session.openProject({ package: "console", files: [{ name: "program.cs", content: "" }] }); - session.run({ instrument: true }).then(result => { - if (result.succeeded) { - done(); - } - }); - }); - }); - - it("waits for run ready notification", (done: Done) => { - let awaitableSession = createReadySession(configuration, editorIFrame, dom.window); - - awaitableSession.then(session => { - session.onCanRunChanged(val => { - if (val) - { - done() - } - }) - - }); - - notifyRunReadyWithId(configuration, dom.window, "0"); - - }); - - it("can run the loaded project with workflow id", (done: Done) => { - let awaitableSession = createReadySession(configuration, editorIFrame, dom.window); - awaitableSession.then(session => { - registerForRunRequest(configuration, editorIFrame, dom.window, (request: ApiMessage): ApiMessage => { - return { - type: RUN_RESPONSE, - requestId: request.type === RUN_REQUEST ? request.requestId : undefined, - outcome: request.type === RUN_REQUEST && request.parameters["runWorkflowId"] === "webApi" ? "Success" : "Exception" - } - }); - - registerForRequestIdGeneration(configuration, editorIFrame, dom.window, (_rid) => "TestRun"); - - session.openProject({ package: "console", files: [{ name: "program.cs", content: "" }] }); - session.run({ runWorkflowId: "webApi" }).then(result => { - if (result.succeeded) { - done(); - } - }); - }); - }); - }); -}); diff --git a/Microsoft.DotNet.Try.js/test/session.themeapi.specs.ts b/Microsoft.DotNet.Try.js/test/session.themeapi.specs.ts deleted file mode 100644 index 83530cbe1..000000000 --- a/Microsoft.DotNet.Try.js/test/session.themeapi.specs.ts +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import * as chai from "chai"; -import { Configuration, SourceFile, createProject } from "../src/index"; -import { JSDOM } from "jsdom"; -import { buildSimpleIFrameDom, getEditorIFrame, buildMultiIFrameDom, getEditorIFrames, buildDoubleIFrameDom } from "./domUtilities"; -import * as chaiAsPromised from "chai-as-promised"; -import { registerForRegionFromFile, registerForRequestIdGeneration, registerForEditorMessages, notifyEditorReady, EditorState, trackSetWorkspaceRequests, raiseTextChange } from "./messagingMocks"; -import { wait } from "./wait"; -import { createReadySession, createReadySessionWithMultipleEditors } from "./sessionFactory"; -import { ApiMessage, SET_WORKSPACE_REQUEST } from "../src/internals/apiMessages"; -import { IWorkspace } from "../src/internals/workspace"; -import { expect } from "chai"; - -chai.use(chaiAsPromised); -chai.should(); - - - -describe("A user", () => { - - let configuration: Configuration; - let dom: JSDOM; - let editorIFrame: HTMLIFrameElement; - - beforeEach(() => { - configuration = { hostOrigin: "https://docs.microsoft.com" }; - dom = buildSimpleIFrameDom(configuration); - editorIFrame = getEditorIFrame(dom); - }); - - describe("with a trydotnet session", () => { - }); -}); \ No newline at end of file diff --git a/Microsoft.DotNet.Try.js/test/sessionFactory.ts b/Microsoft.DotNet.Try.js/test/sessionFactory.ts deleted file mode 100644 index 05e947a3f..000000000 --- a/Microsoft.DotNet.Try.js/test/sessionFactory.ts +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -import { DOMWindow } from "jsdom"; -import { ISession, createSession, Configuration } from "../src"; -import { notifyEditorReadyWithId } from "./messagingMocks"; - -export function createReadySession(configuration: Configuration, editorIFrame: HTMLIFrameElement, window: DOMWindow): Promise{ - let awaitableSession = createSession(configuration, [editorIFrame], window); - notifyEditorReadyWithId(configuration, window, "0"); - return awaitableSession; -} - -export function createReadySessionWithMultipleEditors(configuration: Configuration, editorIFrames: HTMLIFrameElement[], window: DOMWindow): Promise{ - let awaitableSession = createSession(configuration, editorIFrames, window); - for(let editorIframe of editorIFrames){ - notifyEditorReadyWithId(configuration, window, editorIframe.dataset.trydotnetEditorId); - } - return awaitableSession; -} \ No newline at end of file diff --git a/Microsoft.DotNet.Try.js/testConfig.json b/Microsoft.DotNet.Try.js/testConfig.json deleted file mode 100644 index dd5027d8f..000000000 --- a/Microsoft.DotNet.Try.js/testConfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "reporterEnabled": "spec,mocha-trx-reporter", - "mochaTrxReporterReporterOptions": { - "output": "../artifacts/TestResults/Release/Microsoft.DotNet.Try.js.trx" - } -} diff --git a/Microsoft.DotNet.Try.js/tsconfig.json b/Microsoft.DotNet.Try.js/tsconfig.json deleted file mode 100644 index 5d2b825f3..000000000 --- a/Microsoft.DotNet.Try.js/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "compilerOptions": { - "lib": ["es2015", "dom"], - "declaration": true, - "noImplicitAny": true, - "module": "commonjs", - "outDir": "./dist", - "target": "es5" - }, - "include": [ - "src/**/*" - ], - "exclude": ["node_modules"] - } diff --git a/Microsoft.DotNet.Try.js/wallaby.js b/Microsoft.DotNet.Try.js/wallaby.js deleted file mode 100644 index 5060b6fa5..000000000 --- a/Microsoft.DotNet.Try.js/wallaby.js +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -module.exports = function (wallaby) { - return { - env: { - type: "node" - }, - files: [ - "src/**/*.ts", - { pattern:"test/**/*.ts", instrument: false }, - "!test/**/*.specs.ts*" - ], - tests: ["test/**/*.specs.ts"], - compilers: { - '**/*.ts?(x)': wallaby.compilers.typeScript({ - typescript: require('typescript'), - module: 'commonjs', - }) - }, - testFramework: 'mocha', - debug: true, - setup: function (wallaby) { - var mocha = wallaby.testFramework; - mocha.timeout(10000); - } - }; -}; diff --git a/NotIntegration.Tests/ConditionalIntegrationTestFactAttribute.cs b/NotIntegration.Tests/ConditionalIntegrationTestFactAttribute.cs deleted file mode 100644 index b0e9666c0..000000000 --- a/NotIntegration.Tests/ConditionalIntegrationTestFactAttribute.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using Xunit; - -namespace NotIntegration.Tests -{ - public class ConditionalIntegrationTestFactAttribute : FactAttribute - { - const string RUN_DOTNET_TRY_INTEGRATION_TESTS = nameof(RUN_DOTNET_TRY_INTEGRATION_TESTS); - - public ConditionalIntegrationTestFactAttribute() - { - var variable = Environment.GetEnvironmentVariable(RUN_DOTNET_TRY_INTEGRATION_TESTS); - if (!bool.TryParse(variable, out var value) || !value) - { - base.Skip = base.Skip ?? $"Integration tests disabled. Set {RUN_DOTNET_TRY_INTEGRATION_TESTS}=true to run them"; - } - } - } -} diff --git a/NotIntegration.Tests/DotnetTryFixture.cs b/NotIntegration.Tests/DotnetTryFixture.cs deleted file mode 100644 index fbc8b5c7c..000000000 --- a/NotIntegration.Tests/DotnetTryFixture.cs +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - - -using System; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Net.Http; -using System.Runtime.CompilerServices; -using System.Threading.Tasks; -using Microsoft.DotNet.Interactive.Utility; -using MLS.Agent; -using MLS.Agent.Tools; -using WorkspaceServer; -using WorkspaceServer.Packaging; - -namespace NotIntegration.Tests -{ - public class DotnetTryFixture : IDisposable - { - private readonly DisposableDirectory _disposableDirectory; - private Process _process; - private HttpClient _client; - private readonly AsyncLazy _lazyReady; - - public DotnetTryFixture() - { - _disposableDirectory = DisposableDirectory.Create(); - _lazyReady = new AsyncLazy(ReadyAsync); - } - - public void Dispose() - { - _process?.Kill(); - _disposableDirectory.Dispose(); - } - - private async Task ReadyAsync() - { - var dotnet = new Dotnet(); - var installResult = await dotnet.ToolInstall("dotnet-try", _disposableDirectory.Directory, version: "1.0.44142.42", addSource: GetPackageSource().ToString()); - installResult.ThrowOnFailure(); - - await Start(); - return true; - } - - private async Task Start() - { - var tcs = new TaskCompletionSource(); - var dotnetTry = _disposableDirectory.Directory.GetFiles("dotnet-try*").First().FullName; - _process = CommandLine.StartProcess(dotnetTry, "--port 7891 hosted", _disposableDirectory.Directory, - output => - { - if (output.Contains("Now listening on")) - { - tcs.SetResult(true); - } - }, - error => - { - if (!string.IsNullOrWhiteSpace(error)) - { - tcs.TrySetException(new Exception(error)); - Console.Write(error); - } - }); - - _client = new HttpClient(); - _client.BaseAddress = new Uri("http://localhost:7891"); - await tcs.Task; - } - - private PackageSource GetPackageSource([CallerFilePath] string callerFile = "") - { - var dotnetTryPackageSource = Environment.GetEnvironmentVariable("PACKAGESOURCE"); - - var directory = !string.IsNullOrWhiteSpace(dotnetTryPackageSource) - ? new DirectoryInfo(dotnetTryPackageSource) - : new DirectoryInfo(Path.Combine(Path.GetDirectoryName(callerFile), "../artifacts/packages/Debug/Shipping")); - - if (!directory.Exists) - { - throw new Exception($"Expected packages directory {directory.FullName} to exist but it does not"); - } - - return new PackageSource(directory.FullName); - } - - public async Task GetAsync(string requestUri) - { - await _lazyReady.ValueAsync(); - return await _client.GetAsync(requestUri); - } - } -} diff --git a/NotIntegration.Tests/IntegrationTests.cs b/NotIntegration.Tests/IntegrationTests.cs deleted file mode 100644 index ac18fad24..000000000 --- a/NotIntegration.Tests/IntegrationTests.cs +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - - -using System.Threading.Tasks; -using FluentAssertions; -using Xunit; - -namespace NotIntegration.Tests -{ - public class IntegrationTests : IClassFixture - { - private readonly DotnetTryFixture _fixture; - - public IntegrationTests(DotnetTryFixture fixture) - { - _fixture = fixture; - } - - [ConditionalIntegrationTestFact(Skip = "This doesn't work yet")] - public async Task Can_serve_blazor_console_code_runner() - { - var response = await _fixture.GetAsync(@"/LocalCodeRunner/blazor-console"); - - response.StatusCode.Should().Be(200); - var result = await response.Content.ReadAsStringAsync(); - result.Should().Contain("Loading..."); - } - - [ConditionalIntegrationTestFact] - public async Task Can_serve_bundleCss() - { - var response = await _fixture.GetAsync(@"/client/bundle.css"); - response.StatusCode.Should().Be(200); - var content = await response.Content.ReadAsStringAsync(); - content.Should().NotBeNullOrEmpty(); - } - - [ConditionalIntegrationTestFact] - public async Task Can_serve_bundlejs() - { - var response = await _fixture.GetAsync(@"/client/2.bundle.js"); - response.StatusCode.Should().Be(200); - var content = await response.Content.ReadAsStringAsync(); - content.Should().NotBeNullOrEmpty(); - } - - [ConditionalIntegrationTestFact] - public async Task Can_serve_clientapi() - { - var response = await _fixture.GetAsync(@"/api/trydotnet.min.js"); - response.StatusCode.Should().Be(200); - var content = await response.Content.ReadAsStringAsync(); - content.Should().NotBeNullOrEmpty(); - } - } -} diff --git a/NotIntegration.Tests/NotIntegration.Tests.csproj b/NotIntegration.Tests/NotIntegration.Tests.csproj deleted file mode 100644 index 25c1c1607..000000000 --- a/NotIntegration.Tests/NotIntegration.Tests.csproj +++ /dev/null @@ -1,37 +0,0 @@ - - - - net6.0 - true - $(NoWarn);CS8002 - - - - - - - - - - - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - diff --git a/NuGet.config b/NuGet.config index 6daedfaa2..689748dac 100644 --- a/NuGet.config +++ b/NuGet.config @@ -8,9 +8,22 @@ + - - + + + + + + + + + + + + + + diff --git a/PackageTool.Tests/CommandLineParserTests.cs b/PackageTool.Tests/CommandLineParserTests.cs deleted file mode 100644 index 7ea61b089..000000000 --- a/PackageTool.Tests/CommandLineParserTests.cs +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.CommandLine; -using System.CommandLine.IO; -using System.CommandLine.Parsing; -using FluentAssertions; -using System.Threading.Tasks; -using Xunit; -using Xunit.Abstractions; - -namespace MLS.PackageTool.Tests -{ - public class CommandLineParserTests - { - private readonly ITestOutputHelper _output; - private readonly TestConsole _console = new TestConsole(); - private readonly Parser _parser; - private string _command; - - public CommandLineParserTests(ITestOutputHelper output) - { - _output = output; - _parser = CommandLineParser.Create( - getBuildAsset: (_) => { _command = PackageToolConstants.LocateProjectAsset; }, - getWasmAsset: (_) => { _command = PackageToolConstants.LocateWasmAsset; }, - prepare: (_) => { - _command = "prepare-package"; - return Task.CompletedTask; - }); - } - - [Fact] - public async Task Parse_locate_build_locates_build() - { - await _parser.InvokeAsync(PackageToolConstants.LocateProjectAsset, _console); - _command.Should().Be(PackageToolConstants.LocateProjectAsset); - } - - [Fact] - public async Task Parse_locate_wasm_locates_wasm() - { - await _parser.InvokeAsync(PackageToolConstants.LocateWasmAsset, _console); - _command.Should().Be(PackageToolConstants.LocateWasmAsset); - } - - - [Fact] - public async Task Parse_extract_calls_prepare() - { - await _parser.InvokeAsync("prepare-package", _console); - _command.Should().Be("prepare-package"); - } - } -} \ No newline at end of file diff --git a/PackageTool.Tests/HandlerTests.cs b/PackageTool.Tests/HandlerTests.cs deleted file mode 100644 index 3a67cba46..000000000 --- a/PackageTool.Tests/HandlerTests.cs +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System.CommandLine; -using System.CommandLine.Invocation; -using System.CommandLine.IO; -using System.IO; -using FluentAssertions; -using System.Threading.Tasks; -using Xunit; -using Xunit.Abstractions; -using System.Linq; - -namespace MLS.PackageTool.Tests -{ - public class HandlerTests - { - private readonly ITestOutputHelper _output; - private readonly TestConsole _console = new TestConsole(); - - public HandlerTests(ITestOutputHelper output) - { - _output = output; - } - - // [Fact] - // public void Locate_assembly_does_something() - // { - // Program.LocateAssemblyHandler(_console); - // _console.Out.ToString().Should().Contain("project"); - // } - - // [Fact] - // public async Task Extract_extracts_something() - // { - // await Program.ExtractPackageHandler(_console); - // var children = Directory.GetDirectories(Program.AssemblyDirectory()); - // children.Single().Should().EndWith("project"); - // Directory.Delete(Path.Combine(Program.AssemblyDirectory(), "project"), recursive: true); - - // } - } -} \ No newline at end of file diff --git a/PackageTool.Tests/PackageTool.Tests.csproj b/PackageTool.Tests/PackageTool.Tests.csproj deleted file mode 100644 index f6efc2d8f..000000000 --- a/PackageTool.Tests/PackageTool.Tests.csproj +++ /dev/null @@ -1,34 +0,0 @@ - - - - net6.0 - - false - - - - - - - - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - diff --git a/PeakyTests.ipynb b/PeakyTests.ipynb new file mode 100644 index 000000000..55fa4b832 --- /dev/null +++ b/PeakyTests.ipynb @@ -0,0 +1,98 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "csharp" + }, + "polyglot_notebook": { + "kernelName": "csharp" + }, + "vscode": { + "languageId": "polyglot-notebook" + } + }, + "outputs": [], + "source": [ + "#r \"nuget:Peaky.Client\"\n", + "\n", + "using Peaky.Client;\n", + "using System.Net.Http;\n", + "\n", + "// var peakyClient = new PeakyClient(new Uri(\"https://localhost:7061/tests\"));\n", + "var peakyClient = new PeakyClient(new Uri(\"https://try-ppe.dot.net/tests\"));" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "csharp" + }, + "polyglot_notebook": { + "kernelName": "csharp" + }, + "vscode": { + "languageId": "polyglot-notebook" + } + }, + "outputs": [], + "source": [ + "var tests = (await peakyClient.GetTestsAsync( )) \n", + " .Where(t => t.Tags.Any(tag => tag == \"self\"))\n", + " ;\n", + "tests.Display();" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "csharp" + }, + "polyglot_notebook": { + "kernelName": "csharp" + }, + "vscode": { + "languageId": "polyglot-notebook" + } + }, + "outputs": [], + "source": [ + "foreach (var test in tests)\n", + "{\n", + " var result = await test.GetResultAsync();\n", + " result.Display();\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "dotnet_interactive": { + "language": "csharp" + }, + "polyglot_notebook": { + "kernelName": "csharp" + }, + "vscode": { + "languageId": "polyglot-notebook" + } + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/README.md b/README.md index 9d2b3a5a7..7c3860353 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,36 @@ -# Try .NET dotnet bot in space -|| [**Contribution Guidelines**](#contribution-guidelines) || [**Table of contents**](#table-of-contents) || [**Customers & Partners**](#customers--partners) || +# After nearly 8 years and over 1 billion code executions, Try .NET is **retiring on December 31st, 2025**. + +When we launched in 2017, GitHub Codespaces didn't exist yet, C# Dev Kit was years away, and AI-powered coding wasn't on the horizon. Try .NET gave developers something they needed: the ability to experiment with C# directly in their browser, no setup required. -![Try_.NET Enabled](https://img.shields.io/badge/Try_.NET-Enabled-501078.svg) +We're incredibly proud of what Try .NET accomplished and grateful to everyone who used it, learned with it, and contributed to it. You helped shape what came next and the world has evolved. Today's developers have powerful local development tools that would have seemed like magic back then. It's time for us to focus our energy there. +Thank you for being part of the journey. Try .NET may be retiring, but the mission to make C# development delightful and accessible continues. +**Get started with modern C#:** [C# Dev Kit tutorial](https://dotnet.microsoft.com/en-us/learn/dotnet/hello-world-tutorial) -[![Build Status](https://dev.azure.com/dnceng/public/_apis/build/status/dotnet/try/try-ci?branchName=main)](https://dev.azure.com/dnceng/public/_build/latest?definitionId=495&branchName=main) +--- + +# Try .NET dotnet bot in space ## Welcome to the Try .NET repo. Try .NET provides developers and content authors with tools to create interactive experiences. There are two different Try .NET interactive experiences: -* The web experience powered by Blazor (as seen on [Microsoft docs](https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/intro-to-csharp/hello-world)) -* Interactive documentation with Markdown for .NET Core with the [dotnet try global tool](DotNetTry.md). +* The web experience powered by Blazor (as seen on [Microsoft Learn](https://learn.microsoft.com/dotnet/csharp/tour-of-csharp/tutorials/hello-world)) +* Interactive documentation with Markdown for .NET Core with the [dotnet try global tool](DotNetTry.md). ### Online, powered by Blazor -Microsoft Docs uses Try .NET to create interactive documentation. Users can run and edit code all in the browser. +Microsoft Learn uses Try .NET to create interactive documentation. Users can run and edit code all in the browser. -_**Please Note**: At the moment, the Try .NET online (`trydotnet.js API`) is currently only used internally at Microsoft as seen on docs and [.NET page](https://dotnet.microsoft.com/learn/dotnet/in-browser-tutorial/1)._ +_**Please Note**: At the moment, the Try .NET online (`trydotnet.js API`) is currently only used internally at Microsoft as seen on Learn and [.NET page](https://dotnet.microsoft.com/learn/dotnet/in-browser-tutorial/1)._ ### Interactive .NET Core documentation with the `dotnet try` global tool Try .NET enables .NET developers to create interactive markdown files. -To make your markdown files interactive, you will need the [.NET Core 3.0 SDK](https://dotnet.microsoft.com/download/dotnet-core/3.0), the `dotnet try` global tool and [Visual Studio](https://visualstudio.microsoft.com/) / [VS Code](https://code.visualstudio.com/) (or any other editor of your choice). +To make your markdown files interactive, you will need the [.NET Core 3.0 SDK](https://dotnet.microsoft.com/download/dotnet-core/3.0), the `dotnet try` global tool and [Visual Studio](https://visualstudio.microsoft.com/) / [VS Code](https://code.visualstudio.com/) (or any other editor of your choice). @@ -40,12 +45,12 @@ If you find an issue or have a feature suggestion, please open an [issue](https: ## Customers & Partners -**Microsoft Docs** +**Microsoft Learn** -Microsoft Docs uses [Try .NET](https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/intro-to-csharp/hello-world) to create interactive documentation. Users can run and edit .NET code in the browser. +Microsoft Learn uses [Try .NET](https://learn.microsoft.com/dotnet/csharp/tour-of-csharp/tutorials/hello-world) to create interactive documentation. Users can run and edit .NET code in the browser. ## Community Showcase -**NCache Live by Alachisoft** +**NCache Live by Alachisoft** -[NCache Live](https://www.alachisoft.com/blogs/try-ncache-anywhere-anytime-with-ncache-live/) uses [Try .NET](https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/intro-to-csharp/hello-world) to let the user experience NCache APIs with the help of executable and editable .NET code in the browser. \ No newline at end of file +[NCache Live](https://www.alachisoft.com/blogs/try-ncache-anywhere-anytime-with-ncache-live/) uses [Try .NET](https://learn.microsoft.com/dotnet/csharp/tour-of-csharp/tutorials/hello-world) to let the user experience NCache APIs with the help of executable and editable .NET code in the browser. diff --git a/Ruleset.ruleset b/Ruleset.ruleset deleted file mode 100644 index 40ebe9773..000000000 --- a/Ruleset.ruleset +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/Samples/Beginners/HelloWorld.md b/Samples/Beginners/HelloWorld.md deleted file mode 100644 index b093d48e9..000000000 --- a/Samples/Beginners/HelloWorld.md +++ /dev/null @@ -1,12 +0,0 @@ -# Intro to Programming - -### Run your First Program -Just click the `run` icon to get started - -``` cs --region intro --source-file .\myapp\Program.cs --project .\myapp\myapp.csproj -Console.WriteLine("Hello World!"); -``` -Congratulations! You've run your first C# program. It used the Console.WriteLine method to print `Hello World`. `Console` is a type that represents the console window. `WriteLine` is a method of the `Console` type that prints a line of text. - - -#### Next: [Strings & Variables »](./Strings.md) Previous: [Home «](../Readme.md) \ No newline at end of file diff --git a/Samples/Beginners/Methods.md b/Samples/Beginners/Methods.md deleted file mode 100644 index ae48d3cc2..000000000 --- a/Samples/Beginners/Methods.md +++ /dev/null @@ -1,21 +0,0 @@ -# Learning Methods and Collections - -### Methods -A **method** is a block of code that implements some action. `ToUpper()` is a method you can invoke on a string, like the *name* variable. It will return the same string, converted to uppercase. -``` cs --region methods --source-file .\myapp\Program.cs --project .\myapp\myapp.csproj -var name ="Rain"; -Console.WriteLine($"Hello {name.ToUpper()}!"); -``` -### Collections -**Collections** hold multiple values of the same type. - -Replace the *name* variable with a *names* variable that has a list of names. Then use a `foreach loop` to iterate over all the names and say hello to each person. - -``` cs --region collections --source-file .\myapp\Program.cs --project .\myapp\myapp.csproj - var names = new List { "Rain", "Sage", "Lee" }; - foreach (var name in names) - { - Console.WriteLine($"Hello {name.ToUpper()}!"); - } -``` -#### Previous - [Strings & Variables «](./Strings.md) Home - [Home](../Readme.md) \ No newline at end of file diff --git a/Samples/Beginners/Strings.md b/Samples/Beginners/Strings.md deleted file mode 100644 index 6ae6b84ee..000000000 --- a/Samples/Beginners/Strings.md +++ /dev/null @@ -1,27 +0,0 @@ -# Learning Strings - -### Strings -Try modifying the code so that the console says hello to *your name*, instead of the *world*. For example, I used the *Rain*. Replace *Rain* with your name. - -``` cs --region strings --source-file .\myapp\Program.cs --project .\myapp\myapp.csproj -Console.WriteLine("Hello Rain"); -``` -### Variables -In programming we want to store values in a container so we can use them later; these are called `variables`. -Let's store your name in a variable, then read the value from that variable when creating the output message. - -``` cs --region variables --source-file .\myapp\Program.cs --project .\myapp\myapp.csproj -var name = "Rain"; -Console.WriteLine("Hello " + name + "!"); -``` -The first line `var name = "Your Name";` declares a variable, *name* and assigns it a value,`Your Name`. The second line prints out the name. - -### String Interpolation -You've been using `+` to combine variables and constant strings. There is a cleaner way to do this. -Start with including a `$` before the opening quotes of the string. Now, place a variable between curly braces `{ variable name}`, and this will tell C# to replace `variable name` with the value of the variable. This is called **string interpolation**. - -``` cs --region interpolation --source-file .\myapp\Program.cs --project .\myapp\myapp.csproj -var name = "Rain"; -Console.WriteLine($"Hello {name}!"); -``` -#### Next: [Methods »](./Methods.md) Previous: [Hello World «](./HelloWorld.md) Home - [Home](../Readme.md) diff --git a/Samples/Beginners/TeachTheComputer-formatting.md b/Samples/Beginners/TeachTheComputer-formatting.md deleted file mode 100644 index 62418a39b..000000000 --- a/Samples/Beginners/TeachTheComputer-formatting.md +++ /dev/null @@ -1,32 +0,0 @@ -# Let the computer repeat tasks - -Your code should have looked like the following once you finished updating the initialization: - -``` cs --region initialize-in-loop --source-file .\myapp\PascalsTriangle.cs --project .\myapp\myapp.csproj -``` - -That's better. The last step is to improve the formatting. Replace the existing loop to print the rows of the triangle with the following code: - -```csharp -const int fieldWidth = 6; -foreach (int[] row in triangle) -{ - int indent = (5- row.Length) * (fieldWidth / 2); - Console.Write(new string(' ', indent)); - foreach (var item in row) - Console.Write($"{item, fieldWidth}"); - Console.WriteLine(); -} -``` - -This final version makes it easy to build more and more rows. You may notice the number `5` in many places in this code. You can declare a constant instead.: - -```csharp -const int MaxRows = 5; -``` - -Then, replace all instances of `5` with `MaxRows`. Now, if you change `MaxRows`, you'll generate however many rows you want!. Well, within reason. In this environment, your program will time out if go too far. - -You've finished this tutorial. You've taught the computer to do some of your math homework. - -#### Previous: [Build the triangle «](./TeachTheComputer-repetition-2.md) Home: [Home](../Readme.md) diff --git a/Samples/Beginners/TeachTheComputer-repetition-2.md b/Samples/Beginners/TeachTheComputer-repetition-2.md deleted file mode 100644 index 2eea29e02..000000000 --- a/Samples/Beginners/TeachTheComputer-repetition-2.md +++ /dev/null @@ -1,41 +0,0 @@ -# Let the computer repeat tasks - -Your code should have looked like the following once you finished creating the array of rows: - -``` cs --region more-arrays --source-file .\myapp\PascalsTriangle.cs --project .\myapp\myapp.csproj -``` - -That's better. Now, let's update this code to make the computers do the repetitive work instead of you. When you copied and pasted the code for each row, you probably did something like the following: - -1. Paste the previous row. -1. Add 1 to the index of the row. -1. Copy and paste one element in the array, then increase the column indexes. - -Let's make the computer do that for us. Start by removing the statements that initialize the rows of the array. Replace those statements with loop to run for rows 0 through 4: - -```csharp -for (int rowIndex = 0; rowIndex < 5; rowIndex++) -{ -} -``` - -Add code to create a new array for the row. Then set the `1` values for the first and last values: - -```csharp -triangle[rowIndex] = new int[rowIndex + 1]; -triangle[rowIndex][0] = 1; - -triangle[rowIndex][rowIndex] = 1; -``` - -Next, set the columns between the first and last using the previous row. Put the following code where the blank line is in the previous example: - -```csharp -for (int column = 1; column < rowIndex; column++) - triangle[rowIndex][column] = triangle[rowIndex - 1][column - 1] + triangle[rowIndex - 1][column]; -``` - - -Try to modify the sample at the top of the page using these instructions. Then continue to see the answer and improve the formatting. - -#### Next: [Improve formatting »](./TeachTheComputer-formatting.md) Previous: [Less repetition «](./TeachTheComputer-repetition.md) Home: [Home](../Readme.md) diff --git a/Samples/Beginners/TeachTheComputer-repetition.md b/Samples/Beginners/TeachTheComputer-repetition.md deleted file mode 100644 index 0ef53203e..000000000 --- a/Samples/Beginners/TeachTheComputer-repetition.md +++ /dev/null @@ -1,29 +0,0 @@ -# Let the computer repeat tasks - -Your hand coded solution should look something like the following code: - -``` cs --region handcoded-answer --source-file .\myapp\PascalsTriangle.cs --project .\myapp\myapp.csproj -``` - -As you put together that solution, you likely found yourself copying, pasting, and modifying some of the code. That is often a great way to explore a problem and try different ways to solve it. Once you understand the problem and have found a good solution, you can improve the code so you don't copy and past similar statements. Instead, let the computer repeat those steps. - -You'll make these changes in two steps. In the first step, you'll make a collection for all the rows in the triangle. Instead of the variables `row0`, `row1`, and so on, declare an array of arrays like the following: - -```csharp -int[][] triangle = new int[5][]; -``` - -From that, you can replace any use of `row0` with `triangle[0]`, `row1` with `triangle[1]` and so on. You'll also remove the declarations of `int[]` before `row0`, `row1` and so on. The variable `triangle` already creates the definitions for those types. As you start replacing variables, you'll see red squiggles highlighting where you use the variables you're replacing. After those replacements, you can replace the code that writes the values with one loop: - -```csharp -foreach (int[] row in triangle) -{ - foreach (var item in row) - Console.Write(item + " "); - Console.WriteLine(); -} -``` - -Try to modify the sample at the top of the page using these instructions. Run when you don't have red squiggles under your code. If the output window turns red, you may have the wrong indices in your array. Once you've got this working, continue for a bit more changes. - -#### Next: [Build the triangle »](./TeachTheComputer-repetition-2.md) Previous: [Teach the computer «](./TeachTheComputer.md) Home: [Home](../Readme.md) diff --git a/Samples/Beginners/TeachTheComputer.md b/Samples/Beginners/TeachTheComputer.md deleted file mode 100644 index 13f6ae8a8..000000000 --- a/Samples/Beginners/TeachTheComputer.md +++ /dev/null @@ -1,38 +0,0 @@ -# Teach the computer - -As you learn more about programming, you'll find that you can teach the computer to do more and more work for you. Let's use an example you may recognize from math class. Try this even if math isn't your favorite class. You'll learn to get the computer to do your work for you. - -Pascal's triangle is a visualization of math pattern. The first row is a single `1`. The following rows all have one more item than the previous. Each row is created by adding `1` as the first and last element. Each inner element is found by taking the sum of the two numbers above directly to the left and right. You can see this in the row `1 2 1`. The `2` is the sum of the two `1`s above. Similarly, the `1 3 3 1` row: The first `3` is from the `1 2` in the row above, and next `3` is from the `2 1` that ends the row above. - -```console - 1 - 1 1 - 1 2 1 - 1 3 3 1 - 1 4 6 4 1 - 1 5 10 10 5 1 - 1 6 15 20 15 6 1 - 1 7 21 35 35 21 7 1 - 1 8 28 56 70 56 28 8 1 - 1 9 36 84 126 126 84 36 9 1 - 1 10 45 120 210 252 210 120 45 10 1 - 1 11 55 165 330 462 462 330 165 55 11 1 - 1 12 66 220 495 792 924 792 495 220 66 12 1 - 1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1 - 1 14 91 364 1001 2002 3003 3432 3003 2002 1001 364 91 14 1 - 1 15 105 455 1365 3003 5005 6435 6435 5005 3003 1365 455 105 15 1 - 1 16 120 560 1820 4368 8008 11440 12870 11440 8008 4368 1820 560 120 16 1 -``` - -Computing successive rows in the triangle is not hard. But, it's very repetitive. Computers are great at tasks like these. You can teach it! - -## Explore code - -A good way to teach the computer is to start by exploring the problem yourself. The first step is to create some simple code that generates the first few rows. Try the following code yourself. It uses some of the concepts you've already learned. This example creates an array for each row of elements. It initializes the elements in the array. The last part prints the values in each row. - -``` cs --region handcoded --source-file .\myapp\PascalsTriangle.cs --project .\myapp\myapp.csproj -``` - -The format of the output doesn't form a nice triangle yet. Let's concentrate on the values first. Try and add a couple more rows to the triangle. Copy and paste the `row2` line and add rows 3 and 4. Do the same with the `foreach` loops that write the values. - -#### Next: [Less repetition »](./TeachTheComputer-repetition.md) Home: [Home](../Readme.md) diff --git a/Samples/Beginners/myapp/PascalsTriangle.cs b/Samples/Beginners/myapp/PascalsTriangle.cs deleted file mode 100644 index f63612979..000000000 --- a/Samples/Beginners/myapp/PascalsTriangle.cs +++ /dev/null @@ -1,124 +0,0 @@ -using System; - -namespace myapp -{ - public class PascalsTriangle - { - public static void HardCoded() - { - #region handcoded - int[] row0 = new int[] { 1 }; - int[] row1 = new int[] { 1, 1 }; - int[] row2 = new int[] { 1, row1[0] + row1[1], 1 }; - Console.WriteLine(row0[0]); - - foreach (var item in row1) - Console.Write(item + " "); - Console.WriteLine(); - - foreach (var item in row2) - Console.Write(item + " "); - Console.WriteLine(); - #endregion - } - - public static void MoreHardCoded() - { - #region handcoded-answer - int[] row0 = new int[] { 1 }; - int[] row1 = new int[] { 1, 1 }; - int[] row2 = new int[] { 1, row1[0] + row1[1], 1 }; - int[] row3 = new int[] { 1, row2[0] + row2[1], row2[1] + row2[2], 1 }; - int[] row4 = new int[] { 1, row3[0] + row3[1], row3[1] + row3[2], row3[2] + row3[3], 1 }; - Console.WriteLine(row0[0]); - - foreach (var item in row1) - Console.Write(item + " "); - Console.WriteLine(); - - foreach (var item in row2) - Console.Write(item + " "); - Console.WriteLine(); - - foreach (var item in row3) - Console.Write(item + " "); - Console.WriteLine(); - - foreach (var item in row4) - Console.Write(item + " "); - Console.WriteLine(); - #endregion - } - - public static void ArraysOfArrays() - { - #region more-arrays - int[][] triangle = new int[5][]; - triangle[0] = new int[] { 1 }; - triangle[1] = new int[] { 1, 1 }; - triangle[2] = new int[] { 1, triangle[1][0] + triangle[1][1], 1 }; - triangle[3] = new int[] { 1, triangle[2][0] + triangle[2][1], triangle[2][1] + triangle[2][2], 1 }; - triangle[4] = new int[] { 1, triangle[3][0] + triangle[3][1], triangle[3][1] + triangle[3][2], triangle[3][2] + triangle[3][3], 1 }; - - foreach (int[] row in triangle) - { - foreach (var item in row) - Console.Write(item + " "); - Console.WriteLine(); - } - #endregion - } - - public static void InitInLoops() - { - #region initialize-in-loop - - int[][] triangle = new int[5][]; - for (int rowIndex = 0; rowIndex < 5; rowIndex++) - { - triangle[rowIndex] = new int[rowIndex + 1]; - triangle[rowIndex][0] = 1; - - for (int column = 1; column < rowIndex; column++) - triangle[rowIndex][column] = triangle[rowIndex - 1][column - 1] + triangle[rowIndex - 1][column]; - - triangle[rowIndex][rowIndex] = 1; - } - foreach (int[] row in triangle) - { - foreach (var item in row) - Console.Write(item + " "); - Console.WriteLine(); - } - #endregion - } - - public static void Formattings() - { - #region formatting - const int MaxRows = 5; - int[][] triangle = new int[MaxRows][]; - for (int rowIndex = 0; rowIndex < MaxRows; rowIndex++) - { - triangle[rowIndex] = new int[rowIndex + 1]; - triangle[rowIndex][0] = 1; - - for (int column = 1; column < rowIndex; column++) - triangle[rowIndex][column] = triangle[rowIndex - 1][column - 1] + triangle[rowIndex - 1][column]; - - triangle[rowIndex][rowIndex] = 1; - rowIndex++; - } - const int fieldWidth = 6; - foreach (int[] row in triangle) - { - int indent = (MaxRows - row.Length) * (fieldWidth / 2); - Console.Write(new string(' ', indent)); - foreach (var item in row) - Console.Write($"{item, fieldWidth}"); - Console.WriteLine(); - } - #endregion - } - } -} diff --git a/Samples/Beginners/myapp/Program.cs b/Samples/Beginners/myapp/Program.cs deleted file mode 100644 index 1c71a64c9..000000000 --- a/Samples/Beginners/myapp/Program.cs +++ /dev/null @@ -1,209 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -namespace myapp -{ - class Program - { - static void Main(string region = null, - string session = null, - string package = null, - string project = null, - string[] args = null) - { - switch(region) - { - case "intro": - Intro(); - break; - case "strings": - Strings(); - break; - case "variables": - Variables(); - break; - case "interpolation": - Interpolation(); - break; - case "methods": - Methods(); - break; - case "collections": - Collections(); - break; - case "handcoded": - PascalsTriangle.HardCoded(); - break; - case "handcoded-answer": - PascalsTriangle.MoreHardCoded(); - break; - case "more-arrays": - PascalsTriangle.ArraysOfArrays(); - break; - case "initialize-in-loop": - PascalsTriangle.InitInLoops(); - break; - } - } - public static void Intro() - { - #region intro - Console.WriteLine("Hello World!"); - #endregion - } - public static void Strings() - { - #region strings - Console.WriteLine("Hello Rain"); - #endregion - } - public static void Variables() - { - #region variables - var name = "Rain"; - Console.WriteLine("Hello " + name + "!"); - #endregion - } - - public static void Interpolation() - { - #region interpolation - var name = "Rain"; - Console.WriteLine($"Hello {name}!"); - #endregion - } - public static void Methods() - { - #region methods - var name ="Rain"; - Console.WriteLine($"Hello {name.ToUpper()}!"); - #endregion - } - public static void Collections() - { - #region collections - var names = new List { "Rain", "Sage", "Lee" }; - foreach (var name in names) - { - Console.WriteLine($"Hello {name.ToUpper()}!"); - } - #endregion - } - - public static void PascalsTriangleHardCoded() - { - #region handcoded - int[] row0 = new int[] { 1 }; - int[] row1 = new int[] { 1, 1 }; - int[] row2 = new int[] { 1, row1[0] + row1[1], 1 }; - Console.WriteLine(row0[0]); - - foreach (var item in row1) - Console.Write(item + " "); - Console.WriteLine(); - - foreach (var item in row2) - Console.Write(item + " "); - Console.WriteLine(); - #endregion - } - - public static void PascalsTriangleMoreHardCoded() - { - #region handcoded-answer - int[] row0 = new int[] { 1 }; - int[] row1 = new int[] { 1, 1 }; - int[] row2 = new int[] { 1, row1[0] + row1[1], 1 }; - int[] row3 = new int[] { 1, row2[0] + row2[1], row2[1] + row2[2], 1 }; - int[] row4 = new int[] { 1, row3[0] + row3[1], row3[1] + row3[2], row3[2] + row3[3], 1 }; - Console.WriteLine(row0[0]); - - foreach (var item in row1) - Console.Write(item + " "); - Console.WriteLine(); - - foreach (var item in row2) - Console.Write(item + " "); - Console.WriteLine(); - - foreach (var item in row3) - Console.Write(item + " "); - Console.WriteLine(); - - foreach (var item in row4) - Console.Write(item + " "); - Console.WriteLine(); - #endregion - } - - public static void PascalsTriangleArraysOfArrays() - { - #region more-arrays - int[][] triangle = new int[5][]; - triangle[0] = new int[] { 1 }; - triangle[1] = new int[] { 1, 1 }; - triangle[2] = new int[] { 1, triangle[1][0] + triangle[1][1], 1 }; - triangle[3] = new int[] { 1, triangle[2][0] + triangle[2][1], triangle[2][1] + triangle[2][2], 1 }; - triangle[4] = new int[] { 1, triangle[3][0] + triangle[3][1], triangle[3][1] + triangle[3][2], triangle[3][2] + triangle[3][3], 1 }; - - foreach (int[] row in triangle) - { - foreach (var item in row) - Console.Write(item + " "); - Console.WriteLine(); - } - #endregion - } - - public static void PascalsTriangleInitInLoops() - { - #region initialize-in-loop - int[][] triangle = new int[5][]; - for (int rowIndex = 0; rowIndex < 5; rowIndex++) - { - triangle[rowIndex] = new int[rowIndex + 1]; - triangle[rowIndex][0] = 1; - - for (int column = 1; column < rowIndex; column++) - triangle[rowIndex][column] = triangle[rowIndex - 1][column - 1] + triangle[rowIndex - 1][column]; - - triangle[rowIndex][rowIndex] = 1; - } - foreach (int[] row in triangle) - { - foreach (var item in row) - Console.Write(item + " "); - Console.WriteLine(); - } - #endregion - } - - public static void PascalsTriangleFormattings() - { - #region formatting - const int MaxRows = 5; - int[][] triangle = new int[MaxRows][]; - for (int rowIndex = 0; rowIndex < MaxRows; rowIndex++) - { - triangle[rowIndex] = new int[rowIndex + 1]; - triangle[rowIndex][0] = 1; - - for (int column = 1; column < rowIndex; column++) - triangle[rowIndex][column] = triangle[rowIndex - 1][column - 1] + triangle[rowIndex - 1][column]; - - triangle[rowIndex][rowIndex] = 1; - rowIndex++; - } - const int fieldWidth = 6; - foreach (int[] row in triangle) - { - int indent = (MaxRows - row.Length) * (fieldWidth / 2); - Console.Write(new string(' ', indent)); - foreach (var item in row) - Console.Write($"{item, fieldWidth}"); - Console.WriteLine(); - } - #endregion - } - } -} diff --git a/Samples/Beginners/myapp/myapp.csproj b/Samples/Beginners/myapp/myapp.csproj deleted file mode 100644 index c18668769..000000000 --- a/Samples/Beginners/myapp/myapp.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - Exe - netcoreapp3.1 - - - - - - - - diff --git a/Samples/Directory.Build.props b/Samples/Directory.Build.props deleted file mode 100644 index c00835cd0..000000000 --- a/Samples/Directory.Build.props +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Samples/Directory.Build.targets b/Samples/Directory.Build.targets deleted file mode 100644 index c00835cd0..000000000 --- a/Samples/Directory.Build.targets +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Samples/Readme.md b/Samples/Readme.md deleted file mode 100644 index 982739af5..000000000 --- a/Samples/Readme.md +++ /dev/null @@ -1,14 +0,0 @@ -# Try .NET Enabled Samples -![dotnet try Enabled](https://img.shields.io/badge/Try_.NET-Enabled-501078.svg) - -*Please read the [Try .NET quick setup guide](Setup.md) before starting the tutorial below.* - -

    - -

    -

    Try .NET Samples

    - -### Table of Content -- [Introduction Programming with C#](Beginners/HelloWorld.md) -- [Pascals Triangle](Beginners/TeachTheComputer.md) -- [A tour of C#8](csharp8/index.md) diff --git a/Samples/Setup.md b/Samples/Setup.md deleted file mode 100644 index e9b9de482..000000000 --- a/Samples/Setup.md +++ /dev/null @@ -1,15 +0,0 @@ -![dotnet try Enabled](https://img.shields.io/badge/Try_.NET-Enabled-501078.svg) - -### How do get started with a Try .NET enabled repo? -- Clone this repo -- Install .NET Core SDK [3.0](https://dotnet.microsoft.com/download/dotnet-core/3.0) and [2.1](https://dotnet.microsoft.com/download/dotnet-core/2.1) currently dotnet try global tool targets 2.1. -- Go to your terminal -- Install the [Try .NET tools](https://www.nuget.org/packages/dotnet-try/) -`dotnet tool install --global dotnet-try` -- Navigate to the Samples directory of this repository and, type the following `dotnet try`. -![dotnet try](https://user-images.githubusercontent.com/2546640/57164943-ab35f080-6dc3-11e9-8230-ee521e00e428.gif) -- This will launch the browser. - -![dotnet try - _Readme md (2)](https://user-images.githubusercontent.com/2546640/57165217-737b7880-6dc4-11e9-8b4e-0e70966ac03d.gif) - -- Now, you can read the documentation and run code in one place. diff --git a/Samples/csharp8/ExploreCsharpEight/AsyncStreams.cs b/Samples/csharp8/ExploreCsharpEight/AsyncStreams.cs deleted file mode 100644 index 91e4abe97..000000000 --- a/Samples/csharp8/ExploreCsharpEight/AsyncStreams.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; - -namespace ExploreCsharpEight -{ - class AsyncStreams - { - #region AsyncStreams_Declare - internal async IAsyncEnumerable GenerateSequence() - { - for (int i = 0; i < 20; i++) - { - // every 3 elements, wait 2 seconds: - if (i % 3 == 0) - await Task.Delay(3000); - yield return i; - } - } - #endregion - - internal async Task ConsumeStream() - { - #region AsyncStreams_Consume - await foreach (var number in GenerateSequence()) - { - Console.WriteLine($"The time is {DateTime.Now:hh:mm:ss}. Retrieved {number}"); - } - #endregion - - return 0; - } - - } -} diff --git a/Samples/csharp8/ExploreCsharpEight/ExploreCsharpEight.csproj b/Samples/csharp8/ExploreCsharpEight/ExploreCsharpEight.csproj deleted file mode 100644 index e3be89707..000000000 --- a/Samples/csharp8/ExploreCsharpEight/ExploreCsharpEight.csproj +++ /dev/null @@ -1,14 +0,0 @@ - - - - Exe - netcoreapp3.1 - 8.0 - - - - - - - - diff --git a/Samples/csharp8/ExploreCsharpEight/ExternalSystems.cs b/Samples/csharp8/ExploreCsharpEight/ExternalSystems.cs deleted file mode 100644 index ca71e16df..000000000 --- a/Samples/csharp8/ExploreCsharpEight/ExternalSystems.cs +++ /dev/null @@ -1,29 +0,0 @@ -namespace ConsumerVehicleRegistration -{ - public class Car - { - public int Passengers { get; set; } - } -} - -namespace CommercialRegistration -{ - public class DeliveryTruck - { - public int GrossWeightClass { get; set; } - } -} - -namespace LiveryRegistration -{ - public class Taxi - { - public int Fares { get; set; } - } - - public class Bus - { - public int Capacity { get; set; } - public int Riders { get; set; } - } -} diff --git a/Samples/csharp8/ExploreCsharpEight/IndicesAndRanges.cs b/Samples/csharp8/ExploreCsharpEight/IndicesAndRanges.cs deleted file mode 100644 index 19854878f..000000000 --- a/Samples/csharp8/ExploreCsharpEight/IndicesAndRanges.cs +++ /dev/null @@ -1,171 +0,0 @@ -using System; -using System.Linq; - -namespace ExploreCsharpEight -{ - class IndicesAndRanges - { - // TODO: replace in IndicesAndRanges.md when non-editable blocks are supported. - #region IndicesAndRanges_Initialization - private string[] words = new string[] - { - // index from start index from end - "The", // 0 ^9 - "quick", // 1 ^8 - "brown", // 2 ^7 - "fox", // 3 ^6 - "jumped", // 4 ^5 - "over", // 5 ^4 - "the", // 6 ^3 - "lazy", // 7 ^2 - "dog" // 8 ^1 - }; - #endregion - - internal int Syntax_LastIndex() - { - #region IndicesAndRanges_LastIndex - Console.WriteLine($"The last word is {words[^1]}"); - #endregion - return 0; - } - - internal int Syntax_Range() - { - #region IndicesAndRanges_Range - var quickBrownFox = words[1..4]; - foreach (var word in quickBrownFox) - Console.Write($"< {word} >"); - Console.WriteLine(); - #endregion - return 0; - } - - internal int Syntax_LastRange() - { - #region IndicesAndRanges_LastRange - var lazyDog = words[^2..^0]; - foreach (var word in lazyDog) - Console.Write($"< {word} >"); - Console.WriteLine(); - #endregion - return 0; - } - - internal int Syntax_PartialRange() - { - #region IndicesAndRanges_PartialRanges - var allWords = words[..]; // contains "The" through "dog". - var firstPhrase = words[..4]; // contains "The" through "fox" - var lastPhrase = words[6..]; // contains "the, "lazy" and "dog" - foreach (var word in allWords) - Console.Write($"< {word} >"); - Console.WriteLine(); - foreach (var word in firstPhrase) - Console.Write($"< {word} >"); - Console.WriteLine(); - foreach (var word in lastPhrase) - Console.Write($"< {word} >"); - Console.WriteLine(); - #endregion - return 0; - } - - internal int Syntax_IndexRangeType() - { - #region IndicesAndRanges_RangeIndexTypes - Index the = ^3; - Console.WriteLine(words[the]); - Range phrase = 1..4; - var text = words[phrase]; - foreach (var word in text) - Console.Write($"< {word} >"); - Console.WriteLine(); - #endregion - return 0; - } - - internal int Syntax_WhyChosenSemantics() - { - #region IndicesAndRanges_CreateRange - var numbers = Enumerable.Range(0, 100).ToArray(); - int x = 12; - int y = 25; - int z = 36; - #endregion - - #region IndicesAndRanges_MathWithLength - Console.WriteLine("===================== ^0 is the same as Length. =>"); - Console.WriteLine($"{numbers[^x]} is the same as {numbers[numbers.Length - x]}"); - Console.WriteLine($"{numbers[x..y].Length} is the same as {y - x}"); - Console.WriteLine(); - #endregion - - #region IndicesAndRanges_Disjoint - Console.WriteLine("===================== Consecutive disjoint sequences. =>"); - Console.WriteLine("numbers[x..y] and numbers[y..z] are consecutive and disjoint:"); - Span x_y = numbers[x..y]; - Span y_z = numbers[y..z]; - Console.WriteLine($"\tnumbers[x..y] is {x_y[0]} through {x_y[^1]}, numbers[y..z] is {y_z[0]} through {y_z[^1]}"); - Console.WriteLine(); - #endregion - - #region IndicesAndRanges_RemoveFromEnds - Console.WriteLine("===================== Remove elements from both ends. =>"); - Console.WriteLine("numbers[x..^x] removes x elements at each end:"); - Span x_x = numbers[x..^x]; - Console.WriteLine($"\tnumbers[x..^x] starts with {x_x[0]} and ends with {x_x[^1]}"); - Console.WriteLine(); - #endregion - - #region IndicesAndRanges_IncompleteRanges - Console.WriteLine("===================== Incomplete sequences imply 0, ^0 =>"); - Console.WriteLine("numbers[..x] means numbers[0..x] and numbers[x..] means numbers[x..^0]"); - Span start_x = numbers[..x]; - Span zero_x = numbers[0..x]; - Console.WriteLine($"\t{start_x[0]}..{start_x[^1]} is the same as {zero_x[0]}..{zero_x[^1]}"); - Span z_end = numbers[z..]; - Span z_zero = numbers[z..]; - Console.WriteLine($"\t{z_end[0]}..{z_end[^1]} is the same as {z_zero[0]}..{z_zero[^1]}"); - Console.WriteLine(); - #endregion - return 0; - } - - internal int ComputeMovingAverages() - { - #region IndicesAndRanges_MovingAverage - int[] sequence = Sequence(1000); - - - for(int start = 0; start < sequence.Length; start += 100) - { - Range r = start..(start+10); - var (min, max, average) = MovingAverage(sequence, r); - Console.WriteLine($"From {r.Start} to {r.End}: \tMin: {min},\tMax: {max},\tAverage: {average}"); - } - - for (int start = 0; start < sequence.Length; start += 100) - { - Range r = ^(start + 10)..^start; - var (min, max, average) = MovingAverage(sequence, r); - Console.WriteLine($"From {r.Start} to {r.End}: \tMin: {min},\tMax: {max},\tAverage: {average}"); - } - - (int min, int max, double average) MovingAverage(int[] subSequence, Range range) => - ( - subSequence[range].Min(), - subSequence[range].Max(), - subSequence[range].Average() - ); - #endregion - return 0; - } - - - private int[] Sequence(int count) - { - return Enumerable.Range(0, count).Select(x => (int)(Math.Sqrt(x) * 100)).ToArray(); - } - } -} diff --git a/Samples/csharp8/ExploreCsharpEight/NullableReferences.cs b/Samples/csharp8/ExploreCsharpEight/NullableReferences.cs deleted file mode 100644 index 9e8f96ca3..000000000 --- a/Samples/csharp8/ExploreCsharpEight/NullableReferences.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace ExploreCsharpEight -{ - #region Nullable_PersonDefinition - #nullable enable - internal class Person - { - public string FirstName { get; set; } - public string MiddleName { get; set; } - public string LastName { get; set; } - - public Person(string first, string last) => - (FirstName, LastName) = (first, last); - - public Person(string first, string middle, string last) => - (FirstName, MiddleName, LastName) = (first, middle, last); - - public override string ToString() => $"{FirstName} {MiddleName} {LastName}"; - } - #nullable restore - #endregion - - class NullableReferences - { - - #region Nullable_GetLengthMethod - #nullable enable - private static int GetLengthOfMiddleName(Person p) - { - string middleName = p.MiddleName; - return middleName.Length; - } - #nullable restore - #endregion - - internal int NullableTestBed() - { - #region Nullable_Usage - #nullable enable - Person miguel = new Person("Miguel", "de Icaza"); - var length = GetLengthOfMiddleName(miguel); - Console.WriteLine(length); - #nullable restore - //Was this tested on a person who doesn't have a middle name? - #endregion - return 0; - } - } -} diff --git a/Samples/csharp8/ExploreCsharpEight/Patterns.cs b/Samples/csharp8/ExploreCsharpEight/Patterns.cs deleted file mode 100644 index e123890f8..000000000 --- a/Samples/csharp8/ExploreCsharpEight/Patterns.cs +++ /dev/null @@ -1,323 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using CommercialRegistration; -using ConsumerVehicleRegistration; -using LiveryRegistration; - - -namespace ExploreCsharpEight -{ - // I made this interface so I can usethe same test routine - // with each iteration of the toll calculator - interface ITollCalculator - { - decimal CalculateToll(object vehicle); - } - - class TollCalculator_V1 : ITollCalculator - { - #region Pattern_CalculateToll - public decimal CalculateToll(object vehicle) => - vehicle switch - { - Car c => 2.00m, - Taxi t => 3.50m, - Bus b => 5.00m, - DeliveryTruck t => 10.00m, - {} => throw new ArgumentException(message: "Not a known vehicle type", paramName: nameof(vehicle)), - null => throw new ArgumentNullException(nameof(vehicle)) - }; - #endregion - } - - class TollCalculator_V2 : ITollCalculator - { - #region Pattern_CarTaxiOccupancy - public decimal CalculateToll(object vehicle) => - vehicle switch - { - Car { Passengers: 0 } => 2.00m + 0.50m, - Car { Passengers: 1 } => 2.0m, - Car { Passengers: 2 } => 2.0m - 0.50m, - Car _ => 2.00m - 1.0m, - - Taxi { Fares: 0 } => 3.50m + 1.00m, - Taxi { Fares: 1 } => 3.50m, - Taxi { Fares: 2 } => 3.50m - 0.50m, - Taxi _ => 3.50m - 1.00m, - - Bus b => 5.00m, - DeliveryTruck t => 10.00m, - {} => throw new ArgumentException(message: "Not a known vehicle type", paramName: nameof(vehicle)), - null => throw new ArgumentNullException(nameof(vehicle)) - }; - #endregion - } - - class TollCalculator_V3 : ITollCalculator - { - #region Pattern_BusOccupancy - public decimal CalculateToll(object vehicle) => - vehicle switch - { - Car { Passengers: 0 } => 2.00m + 0.50m, - Car { Passengers: 1 } => 2.0m, - Car { Passengers: 2 } => 2.0m - 0.50m, - Car _ => 2.00m - 1.0m, - - Taxi { Fares: 0 } => 3.50m + 1.00m, - Taxi { Fares: 1 } => 3.50m, - Taxi { Fares: 2 } => 3.50m - 0.50m, - Taxi _ => 3.50m - 1.00m, - - Bus b when ((double)b.Riders / (double)b.Capacity) < 0.50 => 5.00m + 2.00m, - Bus b when ((double)b.Riders / (double)b.Capacity) > 0.90 => 5.00m - 1.00m, - Bus _ => 5.00m, - - DeliveryTruck t => 10.00m, - {} => throw new ArgumentException(message: "Not a known vehicle type", paramName: nameof(vehicle)), - null => throw new ArgumentNullException(nameof(vehicle)) - }; - #endregion - } - - class TollCalculator_V4 : ITollCalculator - { - #region Pattern_DeliveryTruckWeight - public decimal CalculateToll(object vehicle) => - vehicle switch - { - Car { Passengers: 0 } => 2.00m + 0.50m, - Car { Passengers: 1 } => 2.0m, - Car { Passengers: 2 } => 2.0m - 0.50m, - Car _ => 2.00m - 1.0m, - - Taxi { Fares: 0 } => 3.50m + 1.00m, - Taxi { Fares: 1 } => 3.50m, - Taxi { Fares: 2 } => 3.50m - 0.50m, - Taxi _ => 3.50m - 1.00m, - - Bus b when ((double)b.Riders / (double)b.Capacity) < 0.50 => 5.00m + 2.00m, - Bus b when ((double)b.Riders / (double)b.Capacity) > 0.90 => 5.00m - 1.00m, - Bus _ => 5.00m, - - DeliveryTruck t when (t.GrossWeightClass > 5000) => 10.00m + 5.00m, - DeliveryTruck t when (t.GrossWeightClass < 3000) => 10.00m - 2.00m, - DeliveryTruck _ => 10.00m, - - {} => throw new ArgumentException(message: "Not a known vehicle type", paramName: nameof(vehicle)), - null => throw new ArgumentNullException(nameof(vehicle)) - }; - #endregion - } - - class TollCalculator_V5 : ITollCalculator - { - #region Pattern_ChainedPatterns - public decimal CalculateToll(object vehicle) => - vehicle switch - { - Car c => c.Passengers switch - { - 0 => 2.00m + 0.5m, - 1 => 2.0m, - 2 => 2.0m - 0.5m, - _ => 2.00m - 1.0m - }, - - Taxi t => t.Fares switch - { - 0 => 3.50m + 1.00m, - 1 => 3.50m, - 2 => 3.50m - 0.50m, - _ => 3.50m - 1.00m - }, - - Bus b when ((double)b.Riders / (double)b.Capacity) < 0.50 => 5.00m + 2.00m, - Bus b when ((double)b.Riders / (double)b.Capacity) > 0.90 => 5.00m - 1.00m, - Bus b => 5.00m, - - DeliveryTruck t when (t.GrossWeightClass > 5000) => 10.00m + 5.00m, - DeliveryTruck t when (t.GrossWeightClass < 3000) => 10.00m - 2.00m, - DeliveryTruck t => 10.00m, - - {} => throw new ArgumentException(message: "Not a known vehicle type", paramName: nameof(vehicle)), - null => throw new ArgumentNullException(nameof(vehicle)) - }; - #endregion - - private enum TimeBand - { - MorningRush, - Daytime, - EveningRush, - Overnight - } - - private static TimeBand GetTimeBand(DateTime timeOfToll) - { - int hour = timeOfToll.Hour; - if (hour < 6) - return TimeBand.Overnight; - else if (hour < 10) - return TimeBand.MorningRush; - else if (hour < 16) - return TimeBand.Daytime; - else if (hour < 20) - return TimeBand.EveningRush; - else - return TimeBand.Overnight; - } - - private static bool IsWeekDay(DateTime timeOfToll) => - timeOfToll.DayOfWeek switch - { - DayOfWeek.Saturday => false, - DayOfWeek.Sunday => false, - _ => true - }; - - #region Pattern_PeakTime - public decimal PeakTimePremium(DateTime timeOfToll, bool inbound) => - (IsWeekDay(timeOfToll), GetTimeBand(timeOfToll), inbound) switch - { - (true, TimeBand.Overnight, _) => 0.75m, - (true, TimeBand.Daytime, _) => 1.5m, - (true, TimeBand.MorningRush, true) => 2.0m, - (true, TimeBand.EveningRush, false) => 2.0m, - (_, _, _) => 1.0m, - }; - #endregion - - } - - class Patterns - { - internal int VehicleType() - { - #region Patterns_VehicleType - var tollCalc = new TollCalculator_V1(); - - var car = new Car(); - var taxi = new Taxi(); - var bus = new Bus(); - var truck = new DeliveryTruck(); - - Console.WriteLine($"The toll for a car is {tollCalc.CalculateToll(car)}"); - Console.WriteLine($"The toll for a taxi is {tollCalc.CalculateToll(taxi)}"); - Console.WriteLine($"The toll for a bus is {tollCalc.CalculateToll(bus)}"); - Console.WriteLine($"The toll for a truck is {tollCalc.CalculateToll(truck)}"); - - try - { - tollCalc.CalculateToll("this will fail"); - } - catch (ArgumentException e) - { - Console.WriteLine("Caught an argument exception when using the wrong type"); - } - try - { - tollCalc.CalculateToll(null); - } - catch (ArgumentNullException e) - { - Console.WriteLine("Caught an argument exception when using null"); - } - #endregion - return 0; - } - - internal int TestOccupancy(string regionName) - { - - ITollCalculator tollCalc = regionName switch - { - "Pattern_CarTaxiOccupancy" => new TollCalculator_V2() as ITollCalculator, - "Pattern_BusOccupancy" => new TollCalculator_V3() as ITollCalculator, - "Pattern_DeliveryTruckWeight" => new TollCalculator_V4() as ITollCalculator, - "Pattern_ChainedPatterns" => new TollCalculator_V5() as ITollCalculator, - _ => new TollCalculator_V1() as ITollCalculator, - }; - - var soloDriver = new Car(); - var twoRideShare = new Car { Passengers = 1 }; - var threeRideShare = new Car { Passengers = 2 }; - var fullVan = new Car { Passengers = 5 }; - var emptyTaxi = new Taxi(); - var singleFare = new Taxi { Fares = 1 }; - var doubleFare = new Taxi { Fares = 2 }; - var fullVanPool = new Taxi { Fares = 5 }; - var lowOccupantBus = new Bus { Capacity = 90, Riders = 15 }; - var normalBus = new Bus { Capacity = 90, Riders = 75 }; - var fullBus = new Bus { Capacity = 90, Riders = 85 }; - - var heavyTruck = new DeliveryTruck { GrossWeightClass = 7500 }; - var truck = new DeliveryTruck { GrossWeightClass = 4000 }; - var lightTruck = new DeliveryTruck { GrossWeightClass = 2500 }; - - Console.WriteLine($"The toll for a solo driver is {tollCalc.CalculateToll(soloDriver)}"); - Console.WriteLine($"The toll for a two ride share is {tollCalc.CalculateToll(twoRideShare)}"); - Console.WriteLine($"The toll for a three ride share is {tollCalc.CalculateToll(threeRideShare)}"); - Console.WriteLine($"The toll for a fullVan is {tollCalc.CalculateToll(fullVan)}"); - - Console.WriteLine($"The toll for an empty taxi is {tollCalc.CalculateToll(emptyTaxi)}"); - Console.WriteLine($"The toll for a single fare taxi is {tollCalc.CalculateToll(singleFare)}"); - Console.WriteLine($"The toll for a double fare taxi is {tollCalc.CalculateToll(doubleFare)}"); - Console.WriteLine($"The toll for a full van taxi is {tollCalc.CalculateToll(fullVanPool)}"); - - Console.WriteLine($"The toll for a low-occupant bus is {tollCalc.CalculateToll(lowOccupantBus)}"); - Console.WriteLine($"The toll for a regular bus is {tollCalc.CalculateToll(normalBus)}"); - Console.WriteLine($"The toll for a bus is {tollCalc.CalculateToll(fullBus)}"); - - Console.WriteLine($"The toll for a truck is {tollCalc.CalculateToll(heavyTruck)}"); - Console.WriteLine($"The toll for a truck is {tollCalc.CalculateToll(truck)}"); - Console.WriteLine($"The toll for a truck is {tollCalc.CalculateToll(lightTruck)}"); - - try - { - tollCalc.CalculateToll("this will fail"); - } - catch (ArgumentException e) - { - Console.WriteLine("Caught an argument exception when using the wrong type"); - } - try - { - tollCalc.CalculateToll(null!); - } - catch (ArgumentNullException e) - { - Console.WriteLine("Caught an argument exception when using null"); - } - return 1; - } - - internal int PeakPricing() - { - var tollCalc = new TollCalculator_V5(); - - var testTimes = new DateTime[] - { - new DateTime(2019, 3, 4, 8, 0, 0), // morning rush - new DateTime(2019, 3, 6, 11, 30, 0), // daytime - new DateTime(2019, 3, 7, 17, 15, 0), // evening rush - new DateTime(2019, 3, 14, 03, 30, 0), // overnight - - new DateTime(2019, 3, 16, 8, 30, 0), // weekend morning rush - new DateTime(2019, 3, 17, 14, 30, 0), // weekend daytime - new DateTime(2019, 3, 17, 18, 05, 0), // weekend evening rush - new DateTime(2019, 3, 16, 01, 30, 0), // weekend overnight - }; - - foreach (var time in testTimes) - { - Console.WriteLine($"Inbound premium at {time} is {tollCalc.PeakTimePremium(time, true)}"); - Console.WriteLine($"Outbound premium at {time} is {tollCalc.PeakTimePremium(time, false)}"); - } - return 0; - } - - } -} diff --git a/Samples/csharp8/ExploreCsharpEight/Program.cs b/Samples/csharp8/ExploreCsharpEight/Program.cs deleted file mode 100644 index aff32bedb..000000000 --- a/Samples/csharp8/ExploreCsharpEight/Program.cs +++ /dev/null @@ -1,129 +0,0 @@ -using System; -using System.Threading.Tasks; - -namespace ExploreCsharpEight -{ - // These are my sample creation notes, with the goal - // of making a set of recommendations for upcoming tutorials (online or local) - - // Rule 1: Make a new class for each section. - // Rule 2: Each section should have two parts: - // a. Basic syntax for the new feature. - // b. A scenario for using the feature. - - // Questions: - // What is "package" used for? - // How to include non-editable blocks - class Program - { -#nullable enable - static async Task Main(string? region = null, - string? session = null, - string? package = null, - string? project = null, - string[]? args = null) - { - return region switch - { - "Pattern_CalculateToll" => new Patterns().VehicleType(), - "Pattern_CarTaxiOccupancy" => new Patterns().TestOccupancy("Pattern_CarTaxiOccupancy"), - "Pattern_BusOccupancy" => new Patterns().TestOccupancy("Pattern_BusOccupancy"), - "Pattern_DeliveryTruckWeight" => new Patterns().TestOccupancy("Pattern_DeliveryTruckWeight"), - "Pattern_ChainedPatterns" => new Patterns().TestOccupancy("Pattern_ChainedPatterns"), - "Pattern_PeakTime" => new Patterns().PeakPricing(), - - "LocalFunction_Counting" => new StaticLocalFunctions().LocalFunctionWithCapture(), - - "Using_Block" => new UsingDeclarationsRefStruct().OldStyle(), - "Using_Declaration" => new UsingDeclarationsRefStruct().NewStyle(), - - "Nullable_PersonDefinition" => new NullableReferences().NullableTestBed(), - "Nullable_GetLengthMethod" => new NullableReferences().NullableTestBed(), - "Nullable_Usage" => new NullableReferences().NullableTestBed(), - - "AsyncStreams_Declare" => await new AsyncStreams().ConsumeStream(), - "AsyncStreams_Consume" => await new AsyncStreams().ConsumeStream(), - - "IndicesAndRanges_LastIndex" => new IndicesAndRanges().Syntax_LastIndex(), - "IndicesAndRanges_Range" => new IndicesAndRanges().Syntax_Range(), - "IndicesAndRanges_LastRange" => new IndicesAndRanges().Syntax_LastRange(), - "IndicesAndRanges_PartialRanges" => new IndicesAndRanges().Syntax_PartialRange(), - "IndicesAndRanges_RangeIndexTypes" => new IndicesAndRanges().Syntax_IndexRangeType(), - "IndicesAndRanges_CreateRange" => new IndicesAndRanges().Syntax_WhyChosenSemantics(), - "IndicesAndRanges_MathWithLength" => new IndicesAndRanges().Syntax_WhyChosenSemantics(), - "IndicesAndRanges_Disjoint" => new IndicesAndRanges().Syntax_WhyChosenSemantics(), - "IndicesAndRanges_RemoveFromEnds" => new IndicesAndRanges().Syntax_WhyChosenSemantics(), - "IndicesAndRanges_IncompleteRanges" => new IndicesAndRanges().ComputeMovingAverages(), - "IndicesAndRanges_MovingAverage" => new IndicesAndRanges().ComputeMovingAverages(), - null => await RunAll(), - _ => await RunAll() - }; - } -#nullable restore - - private static async Task RunAll() - { - Console.WriteLine("========== Starting pattern matching samples. =========="); - var patterns = new Patterns(); - Console.WriteLine(" ========== Run vehicle type. =========="); - patterns.VehicleType(); - Console.WriteLine(" ========== Run car taxi occupancy. =========="); - patterns.TestOccupancy("Pattern_CarTaxiOccupancy"); - Console.WriteLine(" ========== Run bus occupancy. =========="); - patterns.TestOccupancy("Pattern_BusOccupancy"); - Console.WriteLine(" ========== Run delivery truck. =========="); - patterns.TestOccupancy("Pattern_DeliveryTruckWeight"); - Console.WriteLine(" ========== Run chained patterns. =========="); - patterns.TestOccupancy("Pattern_ChainedPatterns"); - Console.WriteLine(" ========== Run peak pricing. =========="); - patterns.PeakPricing(); - - Console.WriteLine("========== Starting static local functions. =========="); - var localFuncs = new StaticLocalFunctions(); - Console.WriteLine(" ========== Run local func capture. =========="); - localFuncs.LocalFunctionWithCapture(); - Console.WriteLine(" ========== Run local static func. =========="); - localFuncs.LocalFunctionWithNoCapture(); - - Console.WriteLine("========== Starting using declaration / ref struct. =========="); - var usings = new UsingDeclarationsRefStruct(); - Console.WriteLine(" ========== Run using block style. =========="); - usings.OldStyle(); - Console.WriteLine(" ========== Run declaration style. =========="); - usings.NewStyle(); - - Console.WriteLine("========== Starting nullable reference samples. =========="); - var nullableSamples = new NullableReferences(); - Console.WriteLine(" ========== Run nullable. =========="); - try - { - nullableSamples.NullableTestBed(); - }catch (NullReferenceException) - { - Console.WriteLine("Initial nullable sample threw the expected NullReferenceException"); - } - Console.WriteLine("========== Starting Async Stream Samples. =========="); - var asyncSamples = new AsyncStreams(); - Console.WriteLine(" ========== Generate sequence. =========="); - await asyncSamples.ConsumeStream(); - - Console.WriteLine("========== Starting Index and Range Samples. =========="); - var indexSamples = new IndicesAndRanges(); - Console.WriteLine(" ========== Last Index. =========="); - indexSamples.Syntax_LastIndex(); - Console.WriteLine(" ========== Range. =========="); - indexSamples.Syntax_Range(); - Console.WriteLine(" ========== Last Range. =========="); - indexSamples.Syntax_LastRange(); - Console.WriteLine(" ========== Partial Range. =========="); - indexSamples.Syntax_PartialRange(); - Console.WriteLine(" ========== Index and Range types. =========="); - indexSamples.Syntax_IndexRangeType(); - Console.WriteLine(" ========== Why this syntax. =========="); - indexSamples.Syntax_WhyChosenSemantics(); - Console.WriteLine(" ========== Scenario. =========="); - indexSamples.ComputeMovingAverages(); - return 0; - } - } -} diff --git a/Samples/csharp8/ExploreCsharpEight/StaticLocalFunctions.cs b/Samples/csharp8/ExploreCsharpEight/StaticLocalFunctions.cs deleted file mode 100644 index 9405a935e..000000000 --- a/Samples/csharp8/ExploreCsharpEight/StaticLocalFunctions.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace ExploreCsharpEight -{ - class StaticLocalFunctions - { - #region LocalFunction_Counting - public IEnumerable Counter(int start, int end) - { - if (start >= end) throw new ArgumentOutOfRangeException("start must be less than end"); - - return localCounter(); - - IEnumerable localCounter() - { - for (int i = start; i < end; i++) - yield return i; - } - } - #endregion - - internal int LocalFunctionWithCapture() - { - var items = Counter(1, 10); - foreach(var item in items) - { - Console.WriteLine(item); - } - return 1; - } - - internal int LocalFunctionWithNoCapture() - { - var items = StaticCounter(1, 10); - foreach (var item in items) - { - Console.WriteLine(item); - } - return 1; - } - - - #region LocalFunction_Static - public IEnumerable StaticCounter(int start, int end) - { - if (start >= end) throw new ArgumentOutOfRangeException("start must be less than end"); - - return localCounter(start, end); - - static IEnumerable localCounter(int first, int endLocation) - { - for (int i = first; i < endLocation; i++) - yield return i; - } - } - #endregion - - } -} diff --git a/Samples/csharp8/ExploreCsharpEight/UsingDeclarationsRefStruct.cs b/Samples/csharp8/ExploreCsharpEight/UsingDeclarationsRefStruct.cs deleted file mode 100644 index 6598ac7e3..000000000 --- a/Samples/csharp8/ExploreCsharpEight/UsingDeclarationsRefStruct.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; - -namespace ExploreCsharpEight -{ - internal class ResourceHog : IDisposable - { - private string name; - private bool beenDisposed; - - public ResourceHog(string name) => this.name = name; - - public void Dispose() - { - beenDisposed = true; - Console.WriteLine($"Disposing {name}"); - } - - internal void CopyFrom(ResourceHog src) - { - switch (beenDisposed, src.beenDisposed) - { - case (true, true): throw new ObjectDisposedException($"Resource {name} has already been disposed"); - case (true, false): throw new ObjectDisposedException($"Resource {name} has already been disposed"); - case (false, true): throw new ObjectDisposedException($"Resource {name} has already been disposed"); - default: Console.WriteLine($"Copying from {src.name} to {name}"); return; - }; - - } - } - - internal class UsingDeclarationsRefStruct - { - internal int OldStyle() - { - #region Using_Block - using (var src = new ResourceHog("source")) - { - using (var dest = new ResourceHog("destination")) - { - dest.CopyFrom(src); - } - Console.WriteLine("After closing destination block"); - } - Console.WriteLine("After closing source block"); - #endregion - return 0; - } - internal int NewStyle() - { - #region Using_Declaration - using var src = new ResourceHog("source"); - using var dest = new ResourceHog("destination"); - dest.CopyFrom(src); - Console.WriteLine("Exiting block"); - #endregion - return 0; - } - } -} diff --git a/Samples/csharp8/asynchronous-streams.md b/Samples/csharp8/asynchronous-streams.md deleted file mode 100644 index b591a3b62..000000000 --- a/Samples/csharp8/asynchronous-streams.md +++ /dev/null @@ -1,24 +0,0 @@ -## Asynchronous streams - -Starting with C# 8.0, you can create and consume streams asynchronously. A method that returns an asynchronous stream has three properties: - -1. It's declared with the `async` modifier. -1. It returns an `System.Collections.Generic.IAsyncEnumerable` -1. The method contains `yield return` statements to return successive elements in the asynchronous stream. - -Consuming an asynchronous stream requires you to add the `await` keyword before the `foreach` keyword when you enumerate the elements of the stream. Adding the `await` keyword requires the method that enumerates the asynchronous stream to be declared with the `async` modifier and to return a type allowed for an `async` method. Typically that means returning a `System.Threading.Tasks.Task` or `System.Threading.Tasks.Task`. It can also be a `System.Threading.Tasks.ValueTask` or `System.Threading.Tasks.ValueTask`. A method can both consume and produce an asynchronous stream, which means it would return an `System.Collections.Generic.IAsyncEnumerable`. The following code generates a sequence from 0 to 19. Every 3 elements, it pauses for 2 seconds to simulate retrieving the next set from a device: - -```cs --project ./ExploreCsharpEight/ExploreCsharpEight.csproj --source-file ./ExploreCsharpEight/AsyncStreams.cs --region AsyncStreams_Declare --session async-stream -``` - -You would enumerate the sequence using the `await foreach` statement: - -```cs --project ./ExploreCsharpEight/ExploreCsharpEight.csproj --source-file ./ExploreCsharpEight/AsyncStreams.cs --region AsyncStreams_Consume --session async-stream -``` - -Click the run button to experiment. Look at the times when elements are retrieved. Change some of the constants to experiment with different values, or time delays. - -> *Note*: -> This sandbox environment will timeout and halt programs that appear to be stuck. Avoid very long delays or very large sequences. - -#### Next: [Indices and ranges »](./indices-and-ranges.md) Previous: [Nullable reference types «](./nullable-fix-class.md) Home: [Home](index.md) diff --git a/Samples/csharp8/index.md b/Samples/csharp8/index.md deleted file mode 100644 index 149be754b..000000000 --- a/Samples/csharp8/index.md +++ /dev/null @@ -1,22 +0,0 @@ -# What's new in C# 8.0 - exploration - -This exploration enables you to experiment with the features that have been released in C# 8.0, preview 2. You can try the code in the samples, modify it, and see the effects of using the new features in a variety of scenarios. - -You can try the following features that first appeared in preview 2: - -- [Pattern matching enhancements](./patterns.md): -- [Static local functions](static-local-functions.md) -- [Using declarations](using-declarations-ref-structs.md) - -The following language features first appeared in C# 8.0 preview 1: - -- [Nullable reference types](nullable-reference-types.md) -- [Asynchronous streams](asynchronous-streams.md) -- [Indices and ranges](indices-and-ranges.md) - -> *Note*: -> This exploration was last updated for C# 8.0 preview 2. - -You can try all of the features in the upcoming version of C# by stepping through the different sections of this tutorial. Or, you can select any of the preceding links to go to the feature you want to explore first. - -#### Next: [More patterns in more places »](./patterns.md) diff --git a/Samples/csharp8/indices-and-ranges-examples.md b/Samples/csharp8/indices-and-ranges-examples.md deleted file mode 100644 index df8e504b7..000000000 --- a/Samples/csharp8/indices-and-ranges-examples.md +++ /dev/null @@ -1,33 +0,0 @@ -# Indices and ranges - -The previous examples show two design decisions that caused much debate: - -- Ranges are *exclusive*, meaning the element at the last index is not in the range. -- The index `^0` is *the end* of the collection, not *the last element* in the collection. - -You can explore several examples that highlight reasons for these decisions on this page. Start by defining an array of elements, and three variables to use as indices into that array. All these samples are tied together. You can edit the values of `x`, `y` and `z`, or the expressions in the other windows, click the *indices-ranges* button and see the results. - -```cs --project ./ExploreCsharpEight/ExploreCsharpEight.csproj --source-file ./ExploreCsharpEight/IndicesAndRanges.cs --region IndicesAndRanges_CreateRange --session indices-ranges -``` - -The choice that `^0` matches *the end* means math using the `Length` property is reasonable: - -```cs --project ./ExploreCsharpEight/ExploreCsharpEight.csproj --source-file ./ExploreCsharpEight/IndicesAndRanges.cs --region IndicesAndRanges_MathWithLength --session indices-ranges -``` - -Ranges are *exclusive*, making consecutive, disjoint sequences clear: - -```cs --project ./ExploreCsharpEight/ExploreCsharpEight.csproj --source-file ./ExploreCsharpEight/IndicesAndRanges.cs --region IndicesAndRanges_Disjoint --session indices-ranges -``` - -The choice of end means removing the same number of elements from each end of a sequence is obvious: - -```cs --project ./ExploreCsharpEight/ExploreCsharpEight.csproj --source-file ./ExploreCsharpEight/IndicesAndRanges.cs --region IndicesAndRanges_RemoveFromEnds --session indices-ranges -``` - -Incomplete ranges can assume `0` or `^0` for the missing index. - -```cs --project ./ExploreCsharpEight/ExploreCsharpEight.csproj --source-file ./ExploreCsharpEight/IndicesAndRanges.cs --region IndicesAndRanges_IncompleteRanges --session indices-ranges -``` - -#### Next: [Indices and ranges scenario »](./indices-and-ranges-scenario.md) Previous: [Indices and ranges «](./nullable-fix-class.md) Home: [Home](index.md) diff --git a/Samples/csharp8/indices-and-ranges-scenario.md b/Samples/csharp8/indices-and-ranges-scenario.md deleted file mode 100644 index 2ac0ce24a..000000000 --- a/Samples/csharp8/indices-and-ranges-scenario.md +++ /dev/null @@ -1,10 +0,0 @@ -# Indices and ranges - -This final example shows taking a moving average on a sequence of numbers that approaches a maximum value. As you move through the range looking at small samples of data, you can get a clear picture of general shape of the data. - -```cs --project ./ExploreCsharpEight/ExploreCsharpEight.csproj --source-file ./ExploreCsharpEight/IndicesAndRanges.cs --region IndicesAndRanges_MovingAverage -``` - -Consider using this new syntax whenever you are working with subsets of data. - -#### Previous: [Indices and ranges examples «](./indices-and-ranges-examples.md) Home: [Home](index.md) diff --git a/Samples/csharp8/indices-and-ranges.md b/Samples/csharp8/indices-and-ranges.md deleted file mode 100644 index 518934d3a..000000000 --- a/Samples/csharp8/indices-and-ranges.md +++ /dev/null @@ -1,56 +0,0 @@ -# Indices and ranges - -Ranges and indices provide a succinct syntax for specifying subranges in an array, `Span`, or `ReadOnlySpan`. - -## Language support for indices and ranges - -You can specify an index **from the end**. You specify **from the end** using the `^` operator. You are familiar with `array[2]` meaning the element "2 from the start". Now, `array[^2]` means the element "2 from the end". The index `^0` means "the end", or the index that follows the last element. - -You can specify a **range** with the **range operator**: `..`. For example, `0..^0` specifies the entire range of the array: 0 from the start up to, but not including 0 from the end. Either operand may use "from the start" or "from the end". Furthermore, either operand may be omitted. The defaults are `0` for the start index, and `^0` for the end index. - -Let's look at a few examples. Consider the following array, annotated with its index from the start and from the end: - -```csharp -private string[] words = new string[] -{ - // index from start index from end - "The", // 0 ^9 - "quick", // 1 ^8 - "brown", // 2 ^7 - "fox", // 3 ^6 - "jumped", // 4 ^5 - "over", // 5 ^4 - "the", // 6 ^3 - "lazy", // 7 ^2 - "dog" // 8 ^1 -}; -``` - -The index of each element reinforces the concept of "from the start", and "from the end", and that ranges are exclusive of the end of the range. The "start" of the entire array is the first element. The "end" of the entire array is *past* the last element. - -You can retrieve the last word with the `^1` index: - -```cs --project ./ExploreCsharpEight/ExploreCsharpEight.csproj --source-file ./ExploreCsharpEight/IndicesAndRanges.cs --region IndicesAndRanges_LastIndex -``` - -The following code creates a subrange with the words "quick", "brown", and "fox". It includes `words[1]` through `words[3]`. The element `words[4]` is not in the range. - -```cs --project ./ExploreCsharpEight/ExploreCsharpEight.csproj --source-file ./ExploreCsharpEight/IndicesAndRanges.cs --region IndicesAndRanges_Range -``` - -The following code creates a subrange with "lazy" and "dog". It includes `words[^2]` and `words[^1]`. The end index `words[^0]` is not included: - -```cs --project ./ExploreCsharpEight/ExploreCsharpEight.csproj --source-file ./ExploreCsharpEight/IndicesAndRanges.cs --region IndicesAndRanges_LastRange -``` - -The following examples create ranges that are open ended for the start, end, or both: - -```cs --project ./ExploreCsharpEight/ExploreCsharpEight.csproj --source-file ./ExploreCsharpEight/IndicesAndRanges.cs --region IndicesAndRanges_PartialRanges -``` - -You can also declare ranges or indices as variables. The variable can then be used inside the `[` and `]` characters: - -```cs --project ./ExploreCsharpEight/ExploreCsharpEight.csproj --source-file ./ExploreCsharpEight/IndicesAndRanges.cs --region IndicesAndRanges_RangeIndexTypes -``` - -#### Next: [Indices and ranges examples »](./indices-and-ranges-examples.md) Previous: [Asynchronous streams «](./asynchronous-streams.md) Home: [Home](index.md) diff --git a/Samples/csharp8/nullable-fix-class.md b/Samples/csharp8/nullable-fix-class.md deleted file mode 100644 index 54fcdc12c..000000000 --- a/Samples/csharp8/nullable-fix-class.md +++ /dev/null @@ -1,40 +0,0 @@ -# Declare nullable property - -The following code shows the existing definition for the `Person` class, displayed in a **nullable enabled** context. You should see the warning in the constructor that takes `firstName` and `lastName` arguments, but does not set the `MiddleName` property. - -On this page, you're going to modify the `Person` class in different ways to remove the warning. Farther down this page, you see the code that uses the `Person` class. Different changes to the `Person` class will generate different warnings in those later samples. - -```cs --project ./ExploreCsharpEight/ExploreCsharpEight.csproj --source-file ./ExploreCsharpEight/NullableReferences.cs --region Nullable_PersonDefinition --session nullable -``` - -Think about your design intent. Should `MiddleName` always be non-null? Or does it better reflect your design for `MiddleName` to be `null` for some people? You can either initialize the `MiddleName` property, or change `string` to `string?` in the declaration: - -```csharp -public string? MiddleName { get; set; } -``` - -After you've made that change, look at the two code snippets that follow. Once the environment analyzes your code, you'll see warnings. Examine each and adjust the code to fix the warnings. Start with the `GetLengthOfMiddleName` method: - -```cs --project ./ExploreCsharpEight/ExploreCsharpEight.csproj --source-file ./ExploreCsharpEight/NullableReferences.cs --region Nullable_GetLengthMethod --session nullable -``` - -If needed, fix the code that calls it: - -```cs --project ./ExploreCsharpEight/ExploreCsharpEight.csproj --source-file ./ExploreCsharpEight/NullableReferences.cs --region Nullable_Usage --session nullable -``` - -One possible solution for `GetLengthOfName` would be the following code: - -```csharp - private static int GetLengthOfMiddleName(Person p) - { - string? middleName = p.MiddleName; - return middleName?.Length ?? 0; - } -``` - -You can let the *may be null* type flow among declarations. You can use the `?.` operator to safely dereference a *may be null* variable, combined with the `??` operator to provide a default value. - -Nullable reference types enable you to declare your intent around reference types: some should never be `null`, while for others `null` indicates a missing value. By declaring your intent, the compiler can help you enforce that intent. - -#### Next: [Asynchronous streams »](./asynchronous-streams.md) Previous: [Nullable reference types «](./nullable-reference-types.md) Home: [Home](index.md) diff --git a/Samples/csharp8/nullable-reference-types.md b/Samples/csharp8/nullable-reference-types.md deleted file mode 100644 index a4f86d5a5..000000000 --- a/Samples/csharp8/nullable-reference-types.md +++ /dev/null @@ -1,28 +0,0 @@ -# Nullable reference types - -C# 8/0 defines new syntax and static analysis rules so that you can declare your design intent regarding the nullability of any reference variable. - -Earlier, C# compiled all code in a **nullable oblivious** context. The compiler had no information about your design intent: Did you expect every variable to be initialized and assigned to non-null values? Or was `null` a valid value that you should check before dereferencing the variable? In a **nullable oblivious** context, the compiler does not issue any nullability warnings, and assumes you understand your design intent throughout your codebase. - -Beginning with C# 8.0, the compiler defaults to a **nullable disabled** context. You can also opt in to a **nullable enabled** context. A **nullable disabled** context behaves the same as the earlier **nullable oblivious** behavior. You can opt in to a **nullable enabled** context. In a **nullable enabled** context, any variable of a reference type is a **non-nullable reference**. You can declare reference type variables with the `?` suffix to indicate that a variable's value may be null. - -In a **nullable enabled** context, the compiler uses static analysis to enforce these rules: - -- A non-nullable reference must be initialized to a non-null value. -- A non-nullable reference cannot be assigned to a variable that may be null. -- A nullable reference may only be dereferenced safely when static analysis determines its value cannot be null. - -There may be situations where you know a variable is not null, even though static analysis cannot prove it. For those situations, you can use the null forgiveness operator, `!`, to declare that the variable is not null. - -The nullable enabled context provides more safety against null reference exceptions. You can declare your intent, and the compiler issues warnings when your code isn't consistent with that declared intent. - -## Explore a basic scenario - -Try running the following code block: - -```cs --project ./ExploreCsharpEight/ExploreCsharpEight.csproj --source-file ./ExploreCsharpEight/NullableReferences.cs --region Nullable_Usage -``` - -**Note:** That block throws a `NullReferenceException` because the `MiddleName` property is null for this person. Someone coded this error and the compiler didn't provide any helpful information to inform them that this code wasn't safe. In the next pages, you'll explore how nullable reference types would have avoided this bug. - -#### Next: [Declare design intent »](./nullable-fix-class.md) Previous: [Using declarations «](./using-declarations-ref-structs.md) Home: [Home](index.md) diff --git a/Samples/csharp8/patterns-occupancy.md b/Samples/csharp8/patterns-occupancy.md deleted file mode 100644 index fe9008a87..000000000 --- a/Samples/csharp8/patterns-occupancy.md +++ /dev/null @@ -1,35 +0,0 @@ -# Add occupancy pricing - -The toll authority wants to encourage vehicles to travel at maximum capacity. They've decided to charge more when vehicles have fewer passengers, and encourage full vehicles by offering lower pricing: - -- Cars and taxis with no passengers pay an extra $0.50. -- Cars and taxis with two passengers get a 0.50 discount. -- Cars and taxis with three or more passengers get a $1.00 discount. -- Buses that are less than 50% full pay an extra $2.00. -- Buses that are more than 90% full get a $1.00 discount. - -These rules can be implemented using the **property pattern** in the same switch expression. The property pattern examines properties of the object once the type has been determined. The single case for a `Car` expands to four different cases, as does the single case for `Taxi`: - -```cs --project ./ExploreCsharpEight/ExploreCsharpEight.csproj --source-file ./ExploreCsharpEight/Patterns.cs --region Pattern_CarTaxiOccupancy -``` - -The first three cases test the type as a `Car`, then check the value of the `Passengers` property. If both match, that expression is evaluated and returned. Next, implement the occupancy rules by expanding the cases for buses, as shown in the following example: - -```cs --project ./ExploreCsharpEight/ExploreCsharpEight.csproj --source-file ./ExploreCsharpEight/Patterns.cs --region Pattern_BusOccupancy -``` - -The toll authority isn't concerned with the number of passengers in the delivery trucks. Instead, they charge more based on the weight class of the trucks. Trucks over 5000 lbs are charged an extra $5.00. Light trucks under 3000 lbs are given a $2.00 discount. That rule is implemented with the following code: - -```cs --project ./ExploreCsharpEight/ExploreCsharpEight.csproj --source-file ./ExploreCsharpEight/Patterns.cs --region Pattern_DeliveryTruckWeight -``` - -Many of these switch arms are examples of **recursive patterns**. For example, `Car { Passengers: 1}` shows a constant pattern inside a property pattern. - -You can make this code less repetitive by using nested switches. The `Car` and `Taxi` both have four different arms in the preceding examples. In both cases, you can create a type pattern that feeds into a property pattern. This technique is shown in the following code: - -```cs --project ./ExploreCsharpEight/ExploreCsharpEight.csproj --source-file ./ExploreCsharpEight/Patterns.cs --region Pattern_ChainedPatterns -``` - -In the preceding sample, using a recursive expression means you don't repeat the `Car` and `Taxi` arms containing child arms that test the property value. This technique isn't used for the `Bus` and `DeliveryTruck` arms because those arms are testing ranges for the property, not discrete values. - -#### Next: [Add peak time pricing »](./patterns-peakpricing.md) Previous: [Type pattern «](./patterns-types.md) Home: [Home](index.md) diff --git a/Samples/csharp8/patterns-peakpricing.md b/Samples/csharp8/patterns-peakpricing.md deleted file mode 100644 index 9d973a9a8..000000000 --- a/Samples/csharp8/patterns-peakpricing.md +++ /dev/null @@ -1,154 +0,0 @@ -# Add peak pricing - -For the final feature, the toll authority wants to add time sensitive peak pricing. During the morning and evening rush hours, the tolls are doubled. That rule only affects traffic in one direction: inbound to the city in the morning, and outbound in the evening rush hour. During other times during the workday, tolls increase by 50%. Late night and early morning, tolls are reduced by 25%. During the weekend, it's the normal rate, regardless of the time. - -You'll use pattern matching for this feature, but you'll integrate it with other techniques. You could build a single pattern match expression that would account for all the combinations of direction, day of the week, and time. The result would be a complicated expression. It would be hard to read and difficult to understand. That makes it hard to ensure correctness. Instead, combine those methods to build a tuple of values that concisely describes all those states. Then use pattern matching to calculate a multiplier for the toll. The tuple contains three discrete conditions: - -- The day is either a weekday or a weekend. -- The band of time when the toll is collected. -- The direction is into the city or out of the city - -The following table shows the combinations of input values and the peak pricing multiplier: - -| Day | Time | Direction | Premium | -| ---------- | ------------ | --------- |--------:| -| Weekday | morning rush | inbound | x 2.00 | -| Weekday | morning rush | outbound | x 1.00 | -| Weekday | daytime | inbound | x 1.50 | -| Weekday | daytime | outbound | x 1.50 | -| Weekday | evening rush | inbound | x 1.00 | -| Weekday | evening rush | outbound | x 2.00 | -| Weekday | overnight | inbound | x 0.75 | -| Weekday | overnight | outbound | x 0.75 | -| Weekend | morning rush | inbound | x 1.00 | -| Weekend | morning rush | outbound | x 1.00 | -| Weekend | daytime | inbound | x 1.00 | -| Weekend | daytime | outbound | x 1.00 | -| Weekend | evening rush | inbound | x 1.00 | -| Weekend | evening rush | outbound | x 1.00 | -| Weekend | overnight | inbound | x 1.00 | -| Weekend | overnight | outbound | x 1.00 | - -There are 16 different combinations of the three variables. By combining some of the conditions, you'll simplify the final switch expression. - -The system that collects the tolls uses a structure for the time when the toll was collected. Build member methods that create the variables from the preceding table. The following function uses a pattern matching switch expression to express whether a represents a weekend or a weekday: - -```csharp -private static bool IsWeekDay(DateTime timeOfToll) => - timeOfToll.DayOfWeek switch - { - DayOfWeek.Monday => true, - DayOfWeek.Tuesday => true, - DayOfWeek.Wednesday => true, - DayOfWeek.Thursday => true, - DayOfWeek.Friday => true, - DayOfWeek.Saturday => false, - DayOfWeek.Sunday => false - }; -``` - -That method works, but it's repetitious. You can simplify it, as shown in the following code: - -```csharp -private static bool IsWeekDay(DateTime timeOfToll) => - timeOfToll.DayOfWeek switch - { - DayOfWeek.Saturday => false, - DayOfWeek.Sunday => false, - _ => true - }; -``` - -Next, add a similar function to categorize the time into the blocks: - -```csharp -private enum TimeBand -{ - MorningRush, - Daytime, - EveningRush, - Overnight -} - -private static GetTimeBand GetTimeBand(DateTime timeOfToll) -{ - int hour = timeOfToll.Hour; - if (hour < 6) - return TimeBand.Overnight; - else if (hour < 10) - return TimeBand.MorningRush; - else if (hour < 16) - return TimeBand.Daytime; - else if (hour < 20) - return TimeBand.EveningRush; - else - return TimeBand.Overnight; -} -``` - -The previous method doesn't use pattern matching. It's clearer using a familiar cascade of `if` statements. You do add a private `enum` to convert each range of time to a discrete value. - -After you create those methods, you can use another `switch` expression with the **tuple pattern** to calculate the pricing premium. You could build a `switch` expression with all 16 arms: - -```csharp -public decimal PeakTimePremiumFull(DateTime timeOfToll, bool inbound) => - (IsWeekDay(timeOfToll), GetTimeBand(timeOfToll), inbound) switch - { - (true, TimeBand.MorningRush, true) => 2.00m, - (true, TimeBand.MorningRush, false) => 1.00m, - (true, TimeBand.Daytime, true) => 1.50m, - (true, TimeBand.Daytime, false) => 1.50m, - (true, TimeBand.EveningRush, true) => 1.00m, - (true, TimeBand.EveningRush, false) => 2.00m, - (true, TimeBand.Overnight, true) => 0.75m, - (true, TimeBand.Overnight, false) => 0.75m, - (false, TimeBand.MorningRush, true) => 1.00m, - (false, TimeBand.MorningRush, false) => 1.00m, - (false, TimeBand.Daytime, true) => 1.00m, - (false, TimeBand.Daytime, false) => 1.00m, - (false, TimeBand.EveningRush, true) => 1.00m, - (false, TimeBand.EveningRush, false) => 1.00m, - (false, TimeBand.Overnight, true) => 1.00m, - (false, TimeBand.Overnight, false) => 1.00m, - }; -``` - -The above code works, but it can be simplified. All eight combinations for the weekend have the same toll. You can replace all eight with the following line: - -```csharp -(false, _, _) => 1.0m, -``` - -Both inbound and outbound traffic have the same multiplier during the weekday daytime and overnight hours. Those four switch arms can be replaced with the following two lines: - -```csharp -(true, TimeBand.Overnight, _) => 0.75m, -(true, TimeBand.Daytime, _) => 1.5m, -``` - -The code should look like the following code after those two changes: - -```csharp -public decimal PeakTimePremium(DateTime timeOfToll, bool inbound) => - (IsWeekDay(timeOfToll), GetTimeBand(timeOfToll), inbound) switch - { - (true, TimeBand.MorningRush, true) => 2.00m, - (true, TimeBand.MorningRush, false) => 1.00m, - (true, TimeBand.Daytime, _) => 1.50m, - (true, TimeBand.EveningRush, true) => 1.00m, - (true, TimeBand.EveningRush, false) => 2.00m, - (true, TimeBand.Overnight, _) => 0.75m, - (false, _, _) => 1.00m, - }; -``` - -Finally, you can remove the two rush hour times that pay the regular price. Once you remove those arms, you can replace the `false` with a discard (`_`) in the final switch arm. You'll have the following finished method: - -```cs --project ./ExploreCsharpEight/ExploreCsharpEight.csproj --source-file ./ExploreCsharpEight/Patterns.cs --region Pattern_PeakTime -``` - -This example highlights one of the advantages of pattern matching: the pattern branches are evaluated in order. If you rearrange them so that an earlier branch handles one of your later cases, the compiler warns you about the unreachable code. Those language rules made it easier to do the preceding simplifications with confidence that the code didn't change. - -Pattern matching makes some types of code more readable and offers an alternative to object-oriented techniques when you can't add code to your classes. The cloud is causing data and functionality to live apart. The *shape* of the data and the *operations* on it aren't necessarily described together. In this tutorial, you consumed existing data in entirely different ways from its original function. Pattern matching gave you the ability to write functionality that overrode those types, even though you couldn't extend them. - -#### Next: [static local functions »](./static-local-functions.md) Previous: [Add occupancy pricing «](./patterns-occupancy.md) Home: [Home](index.md) diff --git a/Samples/csharp8/patterns-types.md b/Samples/csharp8/patterns-types.md deleted file mode 100644 index 73fcf95f5..000000000 --- a/Samples/csharp8/patterns-types.md +++ /dev/null @@ -1,28 +0,0 @@ -# Pattern matching designs - -This scenario highlights the kinds of problems that pattern matching is well-suited to solve: - -- The objects you need to work with aren't in an object hierarchy that matches your goals. You may be working with classes that are part of unrelated systems. -- The functionality you're adding isn't part of the core abstraction for these classes. The toll paid by a vehicle *changes* for different types of vehicles, but the toll isn't a core function of the vehicle. - -When the *shape* of the data and the *operations* on that data are not described together, the pattern matching features in C# make it easier to work with. - -## Implement the basic toll calculations - -The most basic toll calculation relies only on the vehicle type: - -- A `Car` is $2.00. -- A `Taxi` is $3.50. -- A `Bus` is $5.00. -- A `DeliveryTruck` is $10.00 - -Create a new `TollCalculator` class, and implement pattern matching on the vehicle type to get the toll amount. The following code shows the initial implementation of the `TollCalculator` class's `CalculateToll`. - -```cs --project ./ExploreCsharpEight/ExploreCsharpEight.csproj --source-file ./ExploreCsharpEight/Patterns.cs --region Pattern_CalculateToll -``` - -The preceding code uses a **switch expression** (not the same as a [`switch`](../language-reference/keywords/switch.md) statement) that tests the **type pattern**. A **switch expression** begins with the variable, `vehicle` in the preceding code, followed by the `switch` keyword. Next comes all the **switch arms** inside curly braces. The `switch` expression makes other refinements to the syntax that surrounds the `switch` statement. The `case` keyword is omitted, and the result of each arm is an expression. The last two arms show a new language feature. The `{ }` case matches any non-null object that didn't match an earlier arm. This arm catches any incorrect types passed to this method. The `{ }` case must follow the cases for each vehicle type. If the order were reversed, the `{ }` case would take precedence. Finally, the `null` pattern detects when a `null` is passed to this method. The `null` pattern can be last because the other type patterns match only a non-null object of the correct type. - -You're starting to see how patterns can help you create algorithms where the code and the data are separate. The `switch` expression tests the type and produces different values based on the results. That's only the beginning. - -#### Next: [Add occupancy pricing »](./patterns-occupancy.md) Previous: [Pattern Matching «](./patterns.md) Home: [Home](index.md) diff --git a/Samples/csharp8/patterns.md b/Samples/csharp8/patterns.md deleted file mode 100644 index d12fd69ee..000000000 --- a/Samples/csharp8/patterns.md +++ /dev/null @@ -1,63 +0,0 @@ -# More patterns in more places - -**Pattern matching** gives tools to provide shape-dependent functionality across related but different kinds of data. C# 7.0 introduced syntax for type patterns and constant patterns by using the [`is`](../language-reference/keywords/is.md) expression and the [`switch`](../language-reference/keywords/switch.md) statement. These features represented the first tentative steps toward supporting programming paradigms where data and functionality live apart. As the industry moves toward more microservices and other cloud-based architectures, other language tools are needed. - -C# 8.0 expands this vocabulary so you can use more pattern expressions in more places in your code. Consider these features when your data and functionality are separate. Consider pattern matching when your algorithms depend on a fact other than the runtime type of an object. These techniques provide another way to express designs. - -## Scenarios for pattern matching - -Modern development often includes integrating data from multiple sources and presenting information and insights from that data in a single cohesive application. You and your team won't have control or access for all the types that represent the incoming data. - -The classic object-oriented design would call for creating types in your application that represent each data type from those multiple data sources. Then, your application would work with those new types, build inheritance hierarchies, create virtual methods, and implement abstractions. Those techniques work, and sometimes they are the best tools. Other times you can write less code. You can write more clear code using techniques that separate the data from the operations that manipulate that data. - -In this tutorial, you'll create and explore an application that takes incoming data from several external sources for a single scenario. You'll see how **pattern matching** provides an efficient way to consume and process that data in ways that weren't part of the original system. - -Consider a major metro area that is using tolls and peak time pricing to manage traffic. You write an application that calculates tolls for a vehicle based on its type. Later enhancements incorporate pricing based on the number of occupants in the vehicle. Further enhancements add pricing based on the time and the day of the week. - -From that brief description, you may have quickly sketched out an object hierarchy to model this system. However, your data is coming from multiple sources like other vehicle registration management systems. These systems provide different classes to model that data and you don't have a single object model you can use. In this tutorial, you'll use these simplified classes to model for the vehicle data from these external systems, as shown in the following three short code snippets. - -The `Car` class comes from the `ConsumerVehicleRegistration` system: - -```csharp -namespace ConsumerVehicleRegistration -{ - public class Car - { - public int Passengers { get; set; } - } -} -``` - -The `DeliveryTruck` class comes from the `CommercialRegistration` system: - -```csharp -namespace CommercialRegistration -{ - public class DeliveryTruck - { - public int GrossWeightClass { get; set; } - } -} -``` - -And the `LiveryRegistration` system manages the `Taxi` and `Bus` classes: - -```csharp -namespace LiveryRegistration -{ - public class Taxi - { - public int Fares { get; set; } - } - - public class Bus - { - public int Capacity { get; set; } - public int Riders { get; set; } - } -} -``` - -These classes are from different systems, and are in different namespaces. No common base class, other than `System.Object` can be leveraged. Object Oriented techniques will not serve for this problem. - -#### Next: [Explore type patterns »](./patterns-types.md) Home: [Home](index.md) diff --git a/Samples/csharp8/static-local-functions.md b/Samples/csharp8/static-local-functions.md deleted file mode 100644 index f9e26d75f..000000000 --- a/Samples/csharp8/static-local-functions.md +++ /dev/null @@ -1,24 +0,0 @@ -# Static local functions - -You can now add the `static` modifier to local functions to ensure that local function doesn't capture (reference) any variables from the enclosing scope. Doing so generates `CS8421`, "A static local function can't contain a reference to \." - -Typically, any resources declared or used in a function are released when the function exits. However, when a function *captures* a variable that is declared in an enclosing scope, that resource has a lifetime that extends beyond the function itself. In many scenarios, this isn't an issue. In others, capturing and preventing the release of resources can impact performance. Declaring local functions as `static` ensures this doesn't happen. - -Consider the following code. The local function `LocalFunction` accesses the variable `y`, declared in the enclosing scope (the method `M`). Therefore, `LocalFunction` can't be declared with the `static` modifier: - -```cs --project ./ExploreCsharpEight/ExploreCsharpEight.csproj --source-file ./ExploreCsharpEight/StaticLocalFunctions.cs --region LocalFunction_Counting -``` - -The local iterator method *captures* the parameters `start` and `end`. Add the `static` modifier to see the compiler generated warning. You'll need to declare arguments to the local function so that those values aren't captured. Make the changes shown below to get the warning removed: - -```csharp -static IEnumerable localCounter(int first, int endLocation) -{ - for (int i = first; i < endLocation; i++) - yield return i; -} -``` - -The sample should compile and run correctly. - -#### Next: [disposable ref structs and using declarations »](using-declarations-ref-structs.md) Previous: [Add peak pricing «](./patterns-peakpricing.md) Home: [Home](index.md) diff --git a/Samples/csharp8/using-declarations-ref-structs.md b/Samples/csharp8/using-declarations-ref-structs.md deleted file mode 100644 index 559e42225..000000000 --- a/Samples/csharp8/using-declarations-ref-structs.md +++ /dev/null @@ -1,21 +0,0 @@ -# using declarations - -A **using declaration** is a variable declaration preceded by the `using` keyword. It tells the compiler that the variable being declared should be disposed at the end of the enclosing scope. The `using` block has always been recommended for local variables when the type implements `IDisposable`. The following example shows a hypothetical use of two objects that implement `IDisposable`. Run the code and you'll see the `ResourceHog` writes a message when it is being disposed: - -```cs --project ./ExploreCsharpEight/ExploreCsharpEight.csproj --source-file ./ExploreCsharpEight/UsingDeclarationsRefStruct.cs --region Using_Block -``` - -In the preceding example, each object is disposed when the closing brace for its `using` statement is reached. The new `using` declaration generates code that automatically disposes an object at the end of the enclosing block. That results in cleaner code that is easier to understand: - -```cs --project ./ExploreCsharpEight/ExploreCsharpEight.csproj --source-file ./ExploreCsharpEight/UsingDeclarationsRefStruct.cs --region Using_Declaration -``` - -In the preceding example, the resources are disposed at the end of the block. Run it to see the results, which should model the previous sample. - -In both cases, the compiler generates the call to `Dispose()`. The compiler generates an error if the expression in the using statement is not disposable. - -# Disposable ref structs - -A `struct` declared with the `ref` modifier may not implement any interfaces and so cannot implement `System.IDisposable`. Therefore, to enable a `ref struct` to be disposed, it must have an accessible `void Dispose()` method. This also applies to `readonly ref struct` declarations. These types can now release resources in `using` declarations or `using` blocks. - -#### Next: [nullable reference types »](./nullable-reference-types.md) Previous: [Static local functions «](./static-local-functions.md) Home: [Home](index.md) diff --git a/TryDotNet.sln b/TryDotNet.sln new file mode 100644 index 000000000..6b382c9e9 --- /dev/null +++ b/TryDotNet.sln @@ -0,0 +1,69 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.1.32228.430 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{77B0B387-FEA7-4FBC-AC04-76CB4A16F758}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{AC4DCFB8-D55F-4B1C-8B74-5517831CB65E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.TryDotNet", "src\Microsoft.TryDotNet\Microsoft.TryDotNet.csproj", "{FDB0E498-AF5C-44B5-93DD-CA77BB26D195}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.TryDotNet.Tests", "src\Microsoft.TryDotNet.Tests\Microsoft.TryDotNet.Tests.csproj", "{37A560A7-8A96-400C-A12E-98248EDD1C29}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.TryDotNet.WasmRunner", "src\Microsoft.TryDotNet.WasmRunner\Microsoft.TryDotNet.WasmRunner.csproj", "{4D0D85BE-2427-4D8A-86CD-C4C0991794EF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.TryDotNet.SimulatorGenerator", "src\Microsoft.TryDotNet.SimulatorGenerator\Microsoft.TryDotNet.SimulatorGenerator.csproj", "{8630032F-C2A1-4A76-928A-2C828804765B}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.TryDotNet.IntegrationTests", "src\Microsoft.TryDotNet.IntegrationTests\Microsoft.TryDotNet.IntegrationTests.csproj", "{C8F85960-8E0B-404D-8E73-6C7EEBF727BB}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{8D0F8011-2504-432D-BA70-3D92656747D3}" + ProjectSection(SolutionItems) = preProject + azure-pipelines-CI.yml = azure-pipelines-CI.yml + azure-pipelines.yml = azure-pipelines.yml + Directory.Packages.props = Directory.Packages.props + Dockerfile = Dockerfile + global.json = global.json + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {FDB0E498-AF5C-44B5-93DD-CA77BB26D195}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FDB0E498-AF5C-44B5-93DD-CA77BB26D195}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FDB0E498-AF5C-44B5-93DD-CA77BB26D195}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FDB0E498-AF5C-44B5-93DD-CA77BB26D195}.Release|Any CPU.Build.0 = Release|Any CPU + {37A560A7-8A96-400C-A12E-98248EDD1C29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {37A560A7-8A96-400C-A12E-98248EDD1C29}.Debug|Any CPU.Build.0 = Debug|Any CPU + {37A560A7-8A96-400C-A12E-98248EDD1C29}.Release|Any CPU.ActiveCfg = Release|Any CPU + {37A560A7-8A96-400C-A12E-98248EDD1C29}.Release|Any CPU.Build.0 = Release|Any CPU + {4D0D85BE-2427-4D8A-86CD-C4C0991794EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4D0D85BE-2427-4D8A-86CD-C4C0991794EF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4D0D85BE-2427-4D8A-86CD-C4C0991794EF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4D0D85BE-2427-4D8A-86CD-C4C0991794EF}.Release|Any CPU.Build.0 = Release|Any CPU + {8630032F-C2A1-4A76-928A-2C828804765B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8630032F-C2A1-4A76-928A-2C828804765B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8630032F-C2A1-4A76-928A-2C828804765B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8630032F-C2A1-4A76-928A-2C828804765B}.Release|Any CPU.Build.0 = Release|Any CPU + {C8F85960-8E0B-404D-8E73-6C7EEBF727BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C8F85960-8E0B-404D-8E73-6C7EEBF727BB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C8F85960-8E0B-404D-8E73-6C7EEBF727BB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C8F85960-8E0B-404D-8E73-6C7EEBF727BB}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {FDB0E498-AF5C-44B5-93DD-CA77BB26D195} = {77B0B387-FEA7-4FBC-AC04-76CB4A16F758} + {37A560A7-8A96-400C-A12E-98248EDD1C29} = {AC4DCFB8-D55F-4B1C-8B74-5517831CB65E} + {4D0D85BE-2427-4D8A-86CD-C4C0991794EF} = {77B0B387-FEA7-4FBC-AC04-76CB4A16F758} + {8630032F-C2A1-4A76-928A-2C828804765B} = {77B0B387-FEA7-4FBC-AC04-76CB4A16F758} + {C8F85960-8E0B-404D-8E73-6C7EEBF727BB} = {AC4DCFB8-D55F-4B1C-8B74-5517831CB65E} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {1D7DA1F1-417C-4A1F-9D78-05D3BF24D31C} + EndGlobalSection +EndGlobal diff --git a/TryDotNet.v3.ncrunchsolution b/TryDotNet.v3.ncrunchsolution new file mode 100644 index 000000000..13107d394 --- /dev/null +++ b/TryDotNet.v3.ncrunchsolution @@ -0,0 +1,8 @@ + + + True + True + True + True + + \ No newline at end of file diff --git a/WasmCodeRunner.Tests/CodeRunnerTests.cs b/WasmCodeRunner.Tests/CodeRunnerTests.cs deleted file mode 100644 index 5930f1d68..000000000 --- a/WasmCodeRunner.Tests/CodeRunnerTests.cs +++ /dev/null @@ -1,371 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.IO; -using System.Linq; -using FluentAssertions; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; -using Newtonsoft.Json.Linq; -using MLS.WasmCodeRunner; -using Xunit; - -namespace MLS.WasmCodeRunner.Tests -{ - public class CodeRunnerTests - { - [Fact] - public void It_can_run_code_and_return_result_with_correct_sequence_number() - { - using (var consoleState = new PreserveConsoleState()) - { - var assembly = @"TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAABQRQAATAECAPwuRL8AAAAAAAAAAOAAIgALATAAAA4AAAACAAAAAAAAfiwAAAAgAAAAQAAAAABAAAAgAAAAAgAABAAAAAAAAAAEAAAAAAAAAABgAAAAAgAAAAAAAAMAQIUAABAAABAAAAAAEAAAEAAAAAAAABAAAAAAAAAAAAAAACwsAABPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAwAAAAQLAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAACAAAAAAAAAAAAAAACCAAAEgAAAAAAAAAAAAAAC50ZXh0AAAAhAwAAAAgAAAADgAAAAIAAAAAAAAAAAAAAAAAACAAAGAucmVsb2MAAAwAAAAAQAAAAAIAAAAQAAAAAAAAAAAAAAAAAABAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgLAAAAAAAAEgAAAACAAUAsCEAAGAKAAABAAAAAQAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABswAgA8AAAAAQAAEQAAKAIAAAYfFCgBAAArbxEAAAoKKxAGbw4AAAoLAAcoFQAACgAABm8NAAAKLejeCwYsBwZvDAAACgDcKgEQAAACABQAHDAACwAAAAAiH/5zBAAABioiAigWAAAKACpqAigWAAAKAAIDfQEAAAQCKBcAAAp9AwAABCoGKgATMAUAbgAAAAIAABECewEAAAQKBiwIKwAGFy4EKwQrBCswFioCFX0BAAAEAAIXfQQAAAQCF30FAAAEKzoAAgJ7BAAABH0CAAAEAhd9AQAABBcqAhV9AQAABAICewQAAAQCAnsFAAAEJQt9BAAABAdYfQUAAAQAFwwrwh4CewIAAAQqGnMYAAAKejICewIAAASMGQAAASoAABMwAgArAAAAAwAAEQJ7AQAABB/+MxgCewMAAAQoFwAACjMLAhZ9AQAABAIKKwcWcwQAAAYKBioeAigKAAAGKgBCU0pCAQABAAAAAAAMAAAAdjQuMC4zMDMxOQAAAAAFAGwAAADQAwAAI34AADwEAADsBAAAI1N0cmluZ3MAAAAAKAkAAAQAAAAjVVMALAkAABAAAAAjR1VJRAAAADwJAAAkAQAAI0Jsb2IAAAAAAAAAAgAAAVcXogsJCgAAAPoBMwAWAAABAAAAGQAAAAMAAAAFAAAACwAAAAEAAAAFAAAAGAAAABIAAAADAAAAAQAAAAIAAAACAAAABwAAAAIAAAABAAAABQAAAAEAAAABAAAAAACJAgEAAAAAAAYA9gFyAwYASAJyAwYAMwFfAw8AkgMAAAYALwKpAgYA1wGpAgYAlAGpAgYAsQGpAgYAFgKpAgYARwGpAgYAzgOdAgYALQBVAAYA7QCdAgYAXgFyAwYAHwBVAAYAGAFyAwYAsQCdAgYA3QK7AwYApQC7AwoAfAFfAw4ApgDRAhIAxACdAhYA+gOdAgYAuwKdAgYAOwCdAgAAAABMAAAAAAABAAEAAQAQAJUCAAAtAAEAAQADARAADwAAAC0AAQAEAAEADQF9AAEA1gR9AAEAiwB9AAEAAQB9AAEAQQB9AFAgAAAAAJYApAKAAAEAqCAAAAAAkQB/AoQAAQCxIAAAAACGGFkDBgABALogAAAAAIYYWQMBAAEA1SAAAAAA4QHyAAYAAgDYIAAAAADhAeMEGwACAFIhAAAAAOEJagSMAAIAWiEAAAAA4QHVAwYAAgBhIQAAAADhCasEKgACAHAhAAAAAOEB6QKQAAIApyEAAAAA4QEsAz0AAgAAAAEADQEDAAoAAwBNAAMABgADAEkAAwBFAAkAWQMBABEAWQMGABkAWQMKACkAWQMQADEAWQMQADkAWQMQAEEAWQMQAEkAWQMQAFEAWQMQAHEAWQMVAIEAWQMGAIkABQEGAJEA4wQbAAwAygQlAJEA9AMGAJEAygQqABQASwM0AJkASwM9AKEAWQMGAKkAoABLALEA4wBgAFkAWQMGALkAcABlAMEAWQMGAC4ACwCgAC4AEwCpAC4AGwDIAC4AIwDRAC4AKwDeAC4AMwDpAC4AOwD2AC4AQwDRAC4ASwDRAEAAUwABAWMAWwAeAYAAmwAeAaAAmwAeAeAAmwAeAQABmwAeASABmwAeAUABmwAeAWABmwAeAUIAaQBvAAMAAQAAAAYEmAAAAEMEnAACAAcAAwACAAkABQADAAoAGQADAAwAGwADAA4AHQADABAAHwADABIAIQADABQAIwADABYAJQAfAC4ABIAAAAEAAAAAAAAAAAAAAAAAzAAAAAQAAgABAAAAAAAAAHQA1AAAAAAABAABAAEAAAAAAAAAdABmAgAAAAAEAAIAAQAAAAAAAAB0ANECAAAAAAQAAQABAAAAAAAAAHQAvQAAAAAABAACAAEAAAAAAAAAdAChAwAAAAADAAIAKQBcAAAAADxjdXJyZW50PjVfXzEAPEZpYm9uYWNjaT5kX18xAElFbnVtZXJhYmxlYDEASUVudW1lcmF0b3JgMQBJbnQzMgA8bmV4dD41X18yADxNb2R1bGU+AFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljAGdldF9DdXJyZW50TWFuYWdlZFRocmVhZElkADw+bF9faW5pdGlhbFRocmVhZElkAFRha2UASUVudW1lcmFibGUASURpc3Bvc2FibGUAU3lzdGVtLkNvbnNvbGUAY29uc29sZQBTeXN0ZW0uUnVudGltZQBXcml0ZUxpbmUAVHlwZQBTeXN0ZW0uSURpc3Bvc2FibGUuRGlzcG9zZQA8PjFfX3N0YXRlAENvbXBpbGVyR2VuZXJhdGVkQXR0cmlidXRlAERlYnVnZ2FibGVBdHRyaWJ1dGUAQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZQBJdGVyYXRvclN0YXRlTWFjaGluZUF0dHJpYnV0ZQBEZWJ1Z2dlckhpZGRlbkF0dHJpYnV0ZQBBc3NlbWJseUZpbGVWZXJzaW9uQXR0cmlidXRlAEFzc2VtYmx5SW5mb3JtYXRpb25hbFZlcnNpb25BdHRyaWJ1dGUAQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlAENvbXBpbGF0aW9uUmVsYXhhdGlvbnNBdHRyaWJ1dGUAQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlAEFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZQBSdW50aW1lQ29tcGF0aWJpbGl0eUF0dHJpYnV0ZQBTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWcARmlib25hY2NpAGNvbnNvbGUuZGxsAFByb2dyYW0AU3lzdGVtAE1haW4AU3lzdGVtLlJlZmxlY3Rpb24ATm90U3VwcG9ydGVkRXhjZXB0aW9uAFN5c3RlbS5MaW5xAElFbnVtZXJhdG9yAFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklFbnVtZXJhYmxlPFN5c3RlbS5JbnQzMj4uR2V0RW51bWVyYXRvcgBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUuR2V0RW51bWVyYXRvcgAuY3RvcgBTeXN0ZW0uRGlhZ25vc3RpY3MAU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlcwBEZWJ1Z2dpbmdNb2RlcwBTeXN0ZW0uUnVudGltZS5FeHRlbnNpb25zAFN5c3RlbS5Db2xsZWN0aW9ucwBPYmplY3QAU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhdG9yLlJlc2V0AEVudmlyb25tZW50AFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklFbnVtZXJhdG9yPFN5c3RlbS5JbnQzMj4uQ3VycmVudABTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmF0b3IuQ3VycmVudABTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JRW51bWVyYXRvcjxTeXN0ZW0uSW50MzI+LmdldF9DdXJyZW50AFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYXRvci5nZXRfQ3VycmVudAA8PjJfX2N1cnJlbnQATW92ZU5leHQAAAAAAPTh3kBkgaRGgtnPq+FiClEABCABAQgDIAABBSABARERBCABAQ4FIAEBEjUDIAACBRUSMQEIBCAAEwADIAAcBRUSPQEICCAAFRIxARMABCAAEkkIBwIVEjEBCAgQEAECFRI9AR4AFRI9AR4ACAMKAQgEAAEBCAMAAAgFBwMICAIEBwESDAiwP19/EdUKOgIGCAMAAAEHAAAVEj0BCAMgAAgHIAAVEjEBCAMoAAgDKAAcCAEACAAAAAAAHgEAAQBUAhZXcmFwTm9uRXhjZXB0aW9uVGhyb3dzAQgBAAcBAAAAAAwBAAdjb25zb2xlAAAKAQAFRGVidWcAAAwBAAcxLjAuMC4wAAAKAQAFMS4wLjAAABwBABdQcm9ncmFtKzxGaWJvbmFjY2k+ZF9fMQAABAEAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAFQsAAAAAAAAAAAAAG4sAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgLAAAAAAAAAAAAAAAAF9Db3JFeGVNYWluAG1zY29yZWUuZGxsAAAAAAD/JQAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAMAAAAgDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; - var runRequest = new WasmCodeRunnerRequest() - { - Base64Assembly = assembly, - Succeeded = true - }; - - var theThing = new InteropMessage(123, runRequest); - - var message = JObject.FromObject(theThing).ToString(); - - var result = new CodeRunner().ProcessRunRequest(message); - - result.Sequence.Should().Be(123); - result.Data.CodeRunnerVersion.Should().NotBeNullOrEmpty(); - result.Data.Output.Select(o => o.Replace("\r\n", "\n")).Should().BeEquivalentTo( - "1", "1", "2", "3", "5", "8", "13", "21", - "34", "55", "89", "144", "233", "377", "610", - "987", "1597", "2584", "4181", "6765", ""); - - consoleState.OutputIsRedirected.Should().BeFalse(); - } - } - - [Fact] - public void It_can_convert_diagnostics_into_output() - { - using (var consoleState = new PreserveConsoleState()) - { - var diagnostic = new SerializableDiagnostic(0, 1, "message", 2, "stuff2"); - var runRequest = new WasmCodeRunnerRequest() - { - Diagnostics = new[] { diagnostic }, - Succeeded = false - - }; - - var theThing = new InteropMessage(123, runRequest); - var message = JObject.FromObject(theThing).ToString(); - - var result = new CodeRunner().ProcessRunRequest(message); - - result.Sequence.Should().Be(123); - result.Data.Output.Should().BeEquivalentTo("message"); - result.Data.Diagnostics.Should().BeNullOrEmpty(); - consoleState.OutputIsRedirected.Should().BeFalse(); - } - } - - [Fact] - public void It_can_run_a_Main_method_that_takes_string_array_forwarding_the_arg_to_running_code() - { - /* Compiled from - using System; - using System.Collections.Generic; - using System.Linq; - namespace myApp - { - class Program - { - static void Main(string[] args) - { - Console.WriteLine(string.Join(", and then ", args.Reverse())); - } - } - } - */ - using (var consoleState = new PreserveConsoleState()) - { - var assembly = @"TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAABQRQAATAECAHBfK8YAAAAAAAAAAOAAIiALATAAAAgAAAACAAAAAAAAGiYAAAAgAAAAQAAAAAAAEAAgAAAAAgAABAAAAAAAAAAEAAAAAAAAAABgAAAAAgAAAAAAAAMAQIUAABAAABAAAAAAEAAAEAAAAAAAABAAAAAAAAAAAAAAAMglAABPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAwAAACsJQAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAACAAAAAAAAAAAAAAACCAAAEgAAAAAAAAAAAAAAC50ZXh0AAAAIAYAAAAgAAAACAAAAAIAAAAAAAAAAAAAAAAAACAAAGAucmVsb2MAAAwAAAAAQAAAAAIAAAAKAAAAAAAAAAAAAAAAAABAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8JQAAAAAAAEgAAAACAAUAfCAAADAFAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGIAcgEAAHACKAEAACsoCwAACigMAAAKACoiAigNAAAKACoiAigNAAAKACoAQlNKQgEAAQAAAAAADAAAAHY0LjAuMzAzMTkAAAAABQBsAAAAtAEAACN+AAAgAgAANAIAACNTdHJpbmdzAAAAAFQEAAAcAAAAI1VTAHAEAAAQAAAAI0dVSUQAAACABAAAsAAAACNCbG9iAAAAAAAAAAIAAAFHFQAACQgAAAD6ATMAFgAAAQAAAA8AAAADAAAAAwAAAAEAAAANAAAACQAAAAEAAAABAAAAAQAAAAAAjQEBAAAAAAAGABYB9gEGAGgB9gEGAIkA4wEPABYCAAAGAE8BuQEGAPcAuQEGALQAuQEGANEAuQEGADYBuQEGAJ0AuQEGACoCqAEGAEYA0QEGAAEAHwAGAIYBqAEGAFEAqAEAAAAAFgAAAAAAAQABAAAAEACgAcsBLQABAAEAAQAQAA8AaAAtAAEAAwBQIAAAAACRAK8BQQABAGkgAAAAAIYY3QEGAAIAciAAAAAAhhjdAQYAAgAAAAEAJQIJAN0BAQARAN0BBgAZAN0BCgApAN0BEAAxAN0BEAA5AN0BEABBAN0BEABJAN0BEABRAN0BEABhAIEAFQBxALQBKQB5AHcAMwBZAN0BBgAuAAsARwAuABMAUAAuABsAbwAuACMAeAAuACsAjAAuADMAlwAuADsApAAuAEMAeAAuAEsAeAAEgAAAAQAAAAAAAAAAAAAAAABZAAAAAgAAAAAAAAAAAAAAOAA6AAAAAAAVACUAAAAAAABJRW51bWVyYWJsZWAxAENsYXNzMQA8TW9kdWxlPgBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYwBuZXRzdGFuZGFyZABFbnVtZXJhYmxlAENvbnNvbGUAYmxhem9yLWNvbnNvbGUAYmxhem9yX2NvbnNvbGUAV3JpdGVMaW5lAFJldmVyc2UARGVidWdnYWJsZUF0dHJpYnV0ZQBBc3NlbWJseVRpdGxlQXR0cmlidXRlAEFzc2VtYmx5RmlsZVZlcnNpb25BdHRyaWJ1dGUAQXNzZW1ibHlJbmZvcm1hdGlvbmFsVmVyc2lvbkF0dHJpYnV0ZQBBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGUAQ29tcGlsYXRpb25SZWxheGF0aW9uc0F0dHJpYnV0ZQBBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGUAQXNzZW1ibHlDb21wYW55QXR0cmlidXRlAFJ1bnRpbWVDb21wYXRpYmlsaXR5QXR0cmlidXRlAFN0cmluZwBibGF6b3ItY29uc29sZS5kbGwAUHJvZ3JhbQBTeXN0ZW0ATWFpbgBKb2luAFN5c3RlbS5SZWZsZWN0aW9uAG15QXBwAFN5c3RlbS5MaW5xAC5jdG9yAFN5c3RlbS5EaWFnbm9zdGljcwBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzAERlYnVnZ2luZ01vZGVzAGFyZ3MAT2JqZWN0AAAAAAAXLAAgAGEAbgBkACAAdABoAGUAbgAgAAAAAAACgsWqj4aEQ6y2ufPiuiO1AAQgAQEIAyAAAQUgAQEREQQgAQEODxABARUSNQEeABUSNQEeAAMKAQ4JAAIODhUSNQEOBAABAQ4IzHsT/80t3VEFAAEBHQ4IAQAIAAAAAAAeAQABAFQCFldyYXBOb25FeGNlcHRpb25UaHJvd3MBCAEABwEAAAAAEwEADmJsYXpvci1jb25zb2xlAAAKAQAFRGVidWcAAAwBAAcxLjAuMC4wAAAKAQAFMS4wLjAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAA8CUAAAAAAAAAAAAACiYAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwlAAAAAAAAAAAAAAAAX0NvckRsbE1haW4AbXNjb3JlZS5kbGwAAAAAAP8lACAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAMAAAAHDYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; - var runRequest = new WasmCodeRunnerRequest() - { - Base64Assembly = assembly, - Succeeded = true, - RunArgs = "first second \"third argument\"" - }; - - var theThing = new InteropMessage(123, runRequest); - var message = JObject.FromObject(theThing).ToString(); - - var result = new CodeRunner().ProcessRunRequest(message); - - result.Sequence.Should().Be(123); - result.Data.Output.Select(o => o.Trim()).Should().BeEquivalentTo("third argument, and then second, and then first", ""); - consoleState.OutputIsRedirected.Should().BeFalse(); - } - } - - [Fact] - public void It_can_run_a_Main_method_that_requires_argument_bindings() - { - /* Compiled from - using System; - using System.Collections.Generic; - using System.Linq; - namespace myApp - { - class Program - { - static void Main(string region, string session) - { - Console.WriteLine($"region {region} session {session}"); - } - } - } - */ - using (var consoleState = new PreserveConsoleState()) - { - var assembly = @"TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAABQRQAATAECAMGGOMkAAAAAAAAAAOAAIiALATAAAAYAAAACAAAAAAAAwiUAAAAgAAAAQAAAAAAAEAAgAAAAAgAABAAAAAAAAAAEAAAAAAAAAABgAAAAAgAAAAAAAAMAQIUAABAAABAAAAAAEAAAEAAAAAAAABAAAAAAAAAAAAAAAHAlAABPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAwAAABUJQAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAACAAAAAAAAAAAAAAACCAAAEgAAAAAAAAAAAAAAC50ZXh0AAAAyAUAAAAgAAAABgAAAAIAAAAAAAAAAAAAAAAAACAAAGAucmVsb2MAAAwAAAAAQAAAAAIAAAAIAAAAAAAAAAAAAAAAAABAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkJQAAAAAAAEgAAAACAAUAeCAAANwEAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFIAcgEAAHACAygKAAAKKAsAAAoAKiICKAwAAAoAKiICKAwAAAoAKgBCU0pCAQABAAAAAAAMAAAAdjQuMC4zMDMxOQAAAAAFAGwAAACgAQAAI34AAAwCAAD4AQAAI1N0cmluZ3MAAAAABAQAADAAAAAjVVMANAQAABAAAAAjR1VJRAAAAEQEAACYAAAAI0Jsb2IAAAAAAAAAAgAAAUcVAAAJAAAAAPoBMwAWAAABAAAADQAAAAMAAAADAAAAAgAAAAwAAAAJAAAAAQAAAAEAAAAAAFEBAQAAAAAABgDaALgBBgAsAbgBBgBNAKUBDwDYAQAABgATAYcBBgC7AIcBBgB4AIcBBgCVAIcBBgD6AIcBBgBhAIcBBgDuAWwBBgBKAWwBBgAdAGwBAAAAAAgAAAAAAAEAAQAAABAAZAGZAS0AAQABAAEAEAABADQALQABAAMAUCAAAAAAkQBzASoAAQBlIAAAAACGGJ8BBgADAG4gAAAAAIYYnwEGAAMAAAABAHgBAAACAH8BCQCfAQEAEQCfAQYAGQCfAQoAKQCfARAAMQCfARAAOQCfARAAQQCfARAASQCfARAAUQCfARAAYQDnARUAaQBDABwAWQCfAQYALgALADAALgATADkALgAbAFgALgAjAGEALgArAHUALgAzAIAALgA7AI0ALgBDAGEALgBLAGEABIAAAAEAAAAAAAAAAAAAAAAAJQAAAAIAAAAAAAAAAAAAACEAEQAAAAAAAAAAAABDbGFzczEAPE1vZHVsZT4AbmV0c3RhbmRhcmQAQ29uc29sZQBibGF6b3ItY29uc29sZQBibGF6b3JfY29uc29sZQBXcml0ZUxpbmUARGVidWdnYWJsZUF0dHJpYnV0ZQBBc3NlbWJseVRpdGxlQXR0cmlidXRlAEFzc2VtYmx5RmlsZVZlcnNpb25BdHRyaWJ1dGUAQXNzZW1ibHlJbmZvcm1hdGlvbmFsVmVyc2lvbkF0dHJpYnV0ZQBBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGUAQ29tcGlsYXRpb25SZWxheGF0aW9uc0F0dHJpYnV0ZQBBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGUAQXNzZW1ibHlDb21wYW55QXR0cmlidXRlAFJ1bnRpbWVDb21wYXRpYmlsaXR5QXR0cmlidXRlAFN0cmluZwBibGF6b3ItY29uc29sZS5kbGwAUHJvZ3JhbQBTeXN0ZW0ATWFpbgByZWdpb24Ac2Vzc2lvbgBTeXN0ZW0uUmVmbGVjdGlvbgBteUFwcAAuY3RvcgBTeXN0ZW0uRGlhZ25vc3RpY3MAU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlcwBEZWJ1Z2dpbmdNb2RlcwBGb3JtYXQAT2JqZWN0AAAAAAAtcgBlAGcAaQBvAG4AIAB7ADAAfQAgAHMAZQBzAHMAaQBvAG4AIAB7ADEAfQAAAMkIVlAJa05LsS5GWGEy65QABCABAQgDIAABBSABARERBCABAQ4GAAMODhwcBAABAQ4IzHsT/80t3VEFAAIBDg4IAQAIAAAAAAAeAQABAFQCFldyYXBOb25FeGNlcHRpb25UaHJvd3MBCAEABwEAAAAAEwEADmJsYXpvci1jb25zb2xlAAAKAQAFRGVidWcAAAwBAAcxLjAuMC4wAAAKAQAFMS4wLjAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAACYJQAAAAAAAAAAAACyJQAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApCUAAAAAAAAAAAAAAABfQ29yRGxsTWFpbgBtc2NvcmVlLmRsbAAAAAAA/yUAIAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAADAAAAMQ1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="; - var runRequest = new WasmCodeRunnerRequest() - { - Base64Assembly = assembly, - Succeeded = true, - RunArgs = "--region region1 --session sessionOne" - }; - - var theThing = new InteropMessage(123, runRequest); - var message = JObject.FromObject(theThing).ToString(); - - var result = new CodeRunner().ProcessRunRequest(message); - - result.Sequence.Should().Be(123); - result.Data.Output.Select(o => o.Trim()).Should().BeEquivalentTo("region region1 session sessionOne", ""); - consoleState.OutputIsRedirected.Should().BeFalse(); - } - } - - [Fact] - public void It_can_run_a_Main_method_with_missing_arguments() - { - /* Compiled form - using System; - using System.Collections.Generic; - using System.Linq; - namespace myApp - { - class Program - { - static void Main(string region) - { - Console.WriteLine($"region {region}"); - } - } - } - */ - using (var consoleState = new PreserveConsoleState()) - { - var assembly = "TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAABQRQAATAECAKUKHa4AAAAAAAAAAOAAIiALATAAAAYAAAACAAAAAAAAliUAAAAgAAAAQAAAAAAAEAAgAAAAAgAABAAAAAAAAAAEAAAAAAAAAABgAAAAAgAAAAAAAAMAQIUAABAAABAAAAAAEAAAEAAAAAAAABAAAAAAAAAAAAAAAEQlAABPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAwAAAAoJQAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAACAAAAAAAAAAAAAAACCAAAEgAAAAAAAAAAAAAAC50ZXh0AAAAnAUAAAAgAAAABgAAAAIAAAAAAAAAAAAAAAAAACAAAGAucmVsb2MAAAwAAAAAQAAAAAIAAAAIAAAAAAAAAAAAAAAAAABAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4JQAAAAAAAEgAAAACAAUAeCAAALAEAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE4AcgEAAHACKAoAAAooCwAACgAqIgIoDAAACgAqIgIoDAAACgAqAABCU0pCAQABAAAAAAAMAAAAdjQuMC4zMDMxOQAAAAAFAGwAAACYAQAAI34AAAQCAADwAQAAI1N0cmluZ3MAAAAA9AMAABgAAAAjVVMADAQAABAAAAAjR1VJRAAAABwEAACUAAAAI0Jsb2IAAAAAAAAAAgAAAUcVAAAJAAAAAPoBMwAWAAABAAAADQAAAAMAAAADAAAAAQAAAAwAAAAJAAAAAQAAAAEAAAAAAFEBAQAAAAAABgDaALABBgAsAbABBgBNAJ0BDwDQAQAABgATAX8BBgC7AH8BBgB4AH8BBgCVAH8BBgD6AH8BBgBhAH8BBgDmAWwBBgBKAWwBBgAdAGwBAAAAAAgAAAAAAAEAAQAAABAAZAGRAS0AAQABAAEAEAABADQALQABAAMAUCAAAAAAkQBzARsAAQBkIAAAAACGGJcBBgACAG0gAAAAAIYYlwEGAAIAAAABAHgBCQCXAQEAEQCXAQYAGQCXAQoAKQCXARAAMQCXARAAOQCXARAAQQCXARAASQCXARAAUQCXARAAYQDfARUAaQBDABsAWQCXAQYALgALACkALgATADIALgAbAFEALgAjAFoALgArAG4ALgAzAHkALgA7AIYALgBDAFoALgBLAFoABIAAAAEAAAAAAAAAAAAAAAAAJQAAAAIAAAAAAAAAAAAAACAAEQAAAAAAAAAAQ2xhc3MxADxNb2R1bGU+AG5ldHN0YW5kYXJkAENvbnNvbGUAYmxhem9yLWNvbnNvbGUAYmxhem9yX2NvbnNvbGUAV3JpdGVMaW5lAERlYnVnZ2FibGVBdHRyaWJ1dGUAQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZQBBc3NlbWJseUZpbGVWZXJzaW9uQXR0cmlidXRlAEFzc2VtYmx5SW5mb3JtYXRpb25hbFZlcnNpb25BdHRyaWJ1dGUAQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlAENvbXBpbGF0aW9uUmVsYXhhdGlvbnNBdHRyaWJ1dGUAQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlAEFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZQBSdW50aW1lQ29tcGF0aWJpbGl0eUF0dHJpYnV0ZQBTdHJpbmcAYmxhem9yLWNvbnNvbGUuZGxsAFByb2dyYW0AU3lzdGVtAE1haW4AcmVnaW9uAFN5c3RlbS5SZWZsZWN0aW9uAG15QXBwAC5jdG9yAFN5c3RlbS5EaWFnbm9zdGljcwBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzAERlYnVnZ2luZ01vZGVzAEZvcm1hdABPYmplY3QAAAAAABVyAGUAZwBpAG8AbgAgAHsAMAB9AAAApmTY9+J6lUu2xoh6A4AHkgAEIAEBCAMgAAEFIAEBEREEIAEBDgUAAg4OHAQAAQEOCMx7E//NLd1RCAEACAAAAAAAHgEAAQBUAhZXcmFwTm9uRXhjZXB0aW9uVGhyb3dzAQgBAAcBAAAAABMBAA5ibGF6b3ItY29uc29sZQAACgEABURlYnVnAAAMAQAHMS4wLjAuMAAACgEABTEuMC4wAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAbCUAAAAAAAAAAAAAhiUAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHglAAAAAAAAAAAAAAAAX0NvckRsbE1haW4AbXNjb3JlZS5kbGwAAAAAAP8lACAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAADAAAAJg1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="; - var runRequest = new WasmCodeRunnerRequest() - { - Base64Assembly = assembly, - Succeeded = true, - RunArgs = "--region region1 --session sessionOne" - }; - - var theThing = new InteropMessage(123, runRequest); - var message = JObject.FromObject(theThing).ToString(); - - var result = new CodeRunner().ProcessRunRequest(message); - - result.Sequence.Should().Be(123); - result.Data.Output.Select(o => o.Trim()).Should().BeEquivalentTo("region region1", ""); - consoleState.OutputIsRedirected.Should().BeFalse(); - } - } - - [Fact] - public void It_can_run_a_Main_method_that_takes_string_array_with_dashdash_arguments() - { - /* Compiled from - * - using System; - using System.Collections.Generic; - using System.Linq; - namespace myApp - { - class Program - { - static void Main(string[] args) - { - Console.WriteLine(string.Join("" "", args.Reverse())); - } - } - } - */ - using (var consoleState = new PreserveConsoleState()) - { - var assembly = "TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAABQRQAATAECALX0yL0AAAAAAAAAAOAAIiALATAAAAgAAAACAAAAAAAABiYAAAAgAAAAQAAAAAAAEAAgAAAAAgAABAAAAAAAAAAEAAAAAAAAAABgAAAAAgAAAAAAAAMAQIUAABAAABAAAAAAEAAAEAAAAAAAABAAAAAAAAAAAAAAALQlAABPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAwAAACYJQAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAACAAAAAAAAAAAAAAACCAAAEgAAAAAAAAAAAAAAC50ZXh0AAAADAYAAAAgAAAACAAAAAIAAAAAAAAAAAAAAAAAACAAAGAucmVsb2MAAAwAAAAAQAAAAAIAAAAKAAAAAAAAAAAAAAAAAABAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADoJQAAAAAAAEgAAAACAAUAfCAAABwFAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGIAcgEAAHACKAEAACsoCwAACigMAAAKACoiAigNAAAKACoiAigNAAAKACoAQlNKQgEAAQAAAAAADAAAAHY0LjAuMzAzMTkAAAAABQBsAAAAtAEAACN+AAAgAgAANAIAACNTdHJpbmdzAAAAAFQEAAAIAAAAI1VTAFwEAAAQAAAAI0dVSUQAAABsBAAAsAAAACNCbG9iAAAAAAAAAAIAAAFHFQAACQgAAAD6ATMAFgAAAQAAAA8AAAADAAAAAwAAAAEAAAANAAAACQAAAAEAAAABAAAAAQAAAAAAjQEBAAAAAAAGABYB9gEGAGgB9gEGAIkA4wEPABYCAAAGAE8BuQEGAPcAuQEGALQAuQEGANEAuQEGADYBuQEGAJ0AuQEGACoCqAEGAEYA0QEGAAEAHwAGAIYBqAEGAFEAqAEAAAAAFgAAAAAAAQABAAAAEACgAcsBLQABAAEAAQAQAA8AaAAtAAEAAwBQIAAAAACRAK8BQQABAGkgAAAAAIYY3QEGAAIAciAAAAAAhhjdAQYAAgAAAAEAJQIJAN0BAQARAN0BBgAZAN0BCgApAN0BEAAxAN0BEAA5AN0BEABBAN0BEABJAN0BEABRAN0BEABhAIEAFQBxALQBKQB5AHcAMwBZAN0BBgAuAAsARwAuABMAUAAuABsAbwAuACMAeAAuACsAjAAuADMAlwAuADsApAAuAEMAeAAuAEsAeAAEgAAAAQAAAAAAAAAAAAAAAABZAAAAAgAAAAAAAAAAAAAAOAA6AAAAAAAVACUAAAAAAABJRW51bWVyYWJsZWAxAENsYXNzMQA8TW9kdWxlPgBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYwBuZXRzdGFuZGFyZABFbnVtZXJhYmxlAENvbnNvbGUAYmxhem9yLWNvbnNvbGUAYmxhem9yX2NvbnNvbGUAV3JpdGVMaW5lAFJldmVyc2UARGVidWdnYWJsZUF0dHJpYnV0ZQBBc3NlbWJseVRpdGxlQXR0cmlidXRlAEFzc2VtYmx5RmlsZVZlcnNpb25BdHRyaWJ1dGUAQXNzZW1ibHlJbmZvcm1hdGlvbmFsVmVyc2lvbkF0dHJpYnV0ZQBBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGUAQ29tcGlsYXRpb25SZWxheGF0aW9uc0F0dHJpYnV0ZQBBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGUAQXNzZW1ibHlDb21wYW55QXR0cmlidXRlAFJ1bnRpbWVDb21wYXRpYmlsaXR5QXR0cmlidXRlAFN0cmluZwBibGF6b3ItY29uc29sZS5kbGwAUHJvZ3JhbQBTeXN0ZW0ATWFpbgBKb2luAFN5c3RlbS5SZWZsZWN0aW9uAG15QXBwAFN5c3RlbS5MaW5xAC5jdG9yAFN5c3RlbS5EaWFnbm9zdGljcwBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzAERlYnVnZ2luZ01vZGVzAGFyZ3MAT2JqZWN0AAAAAAADIAAAAAAAOtumbg3G9kKRlPub5ADIcgAEIAEBCAMgAAEFIAEBEREEIAEBDg8QAQEVEjUBHgAVEjUBHgADCgEOCQACDg4VEjUBDgQAAQEOCMx7E//NLd1RBQABAR0OCAEACAAAAAAAHgEAAQBUAhZXcmFwTm9uRXhjZXB0aW9uVGhyb3dzAQgBAAcBAAAAABMBAA5ibGF6b3ItY29uc29sZQAACgEABURlYnVnAAAMAQAHMS4wLjAuMAAACgEABTEuMC4wAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAANwlAAAAAAAAAAAAAPYlAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAADoJQAAAAAAAAAAAAAAAF9Db3JEbGxNYWluAG1zY29yZWUuZGxsAAAAAAD/JQAgABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAMAAAACDYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; - var runRequest = new WasmCodeRunnerRequest() - { - Base64Assembly = assembly, - Succeeded = true, - RunArgs = "--region region1 --session sessionOne" - }; - - var theThing = new InteropMessage(123, runRequest); - var message = JObject.FromObject(theThing).ToString(); - - var result = new CodeRunner().ProcessRunRequest(message); - - result.Sequence.Should().Be(123); - result.Data.Output.Select(o => o.Trim()).Should().BeEquivalentTo("sessionOne --session region1 --region", ""); - consoleState.OutputIsRedirected.Should().BeFalse(); - } - } - - [Fact] - public void It_can_run_a_private_main_method() - { - /* Compiled from -using System; -namespace myApp -{ - class Program - { - static void Main() - { - Console.WriteLine("Hello World!"); - } - } -} -*/ - using (var consoleState = new PreserveConsoleState()) - { - var assembly = @"TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAABQRQAATAECAG+WAqcAAAAAAAAAAOAAIiALATAAAAYAAAACAAAAAAAAYiUAAAAgAAAAQAAAAAAAEAAgAAAAAgAABAAAAAAAAAAEAAAAAAAAAABgAAAAAgAAAAAAAAMAQIUAABAAABAAAAAAEAAAEAAAAAAAABAAAAAAAAAAAAAAABAlAABPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAwAAAD0JAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAACAAAAAAAAAAAAAAACCAAAEgAAAAAAAAAAAAAAC50ZXh0AAAAaAUAAAAgAAAABgAAAAIAAAAAAAAAAAAAAAAAACAAAGAucmVsb2MAAAwAAAAAQAAAAAIAAAAIAAAAAAAAAAAAAAAAAABAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEJQAAAAAAAEgAAAACAAUAcCAAAIQEAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYAcgEAAHAoCgAACgAqIgIoCwAACgAqIgIoCwAACgAqQlNKQgEAAQAAAAAADAAAAHY0LjAuMzAzMTkAAAAABQBsAAAAhAEAACN+AADwAQAA2AEAACNTdHJpbmdzAAAAAMgDAAAcAAAAI1VTAOQDAAAQAAAAI0dVSUQAAAD0AwAAkAAAACNCbG9iAAAAAAAAAAIAAAFHFAAACQAAAAD6ATMAFgAAAQAAAAwAAAADAAAAAwAAAAsAAAAJAAAAAQAAAAEAAAAAAEoBAQAAAAAABgDaAKIBBgAsAaIBBgBNAI8BDwDCAQAABgATAXEBBgC7AHEBBgB4AHEBBgCVAHEBBgD6AHEBBgBhAHEBBgDRAWUBBgAdAGUBAAAAAAgAAAAAAAEAAQAAABAAXQGDAS0AAQABAAEAEAABADQALQABAAMAUCAAAAAAkQBsASMAAQBeIAAAAACGGIkBBgABAGcgAAAAAIYYiQEGAAEACQCJAQEAEQCJAQYAGQCJAQoAKQCJARAAMQCJARAAOQCJARAAQQCJARAASQCJARAAUQCJARAAYQBDABUAWQCJAQYALgALACcALgATADAALgAbAE8ALgAjAFgALgArAGwALgAzAHcALgA7AIQALgBDAFgALgBLAFgABIAAAAEAAAAAAAAAAAAAAAAAJQAAAAIAAAAAAAAAAAAAABoAEQAAAAAAAAAAAABDbGFzczEAPE1vZHVsZT4AbmV0c3RhbmRhcmQAQ29uc29sZQBibGF6b3ItY29uc29sZQBibGF6b3JfY29uc29sZQBXcml0ZUxpbmUARGVidWdnYWJsZUF0dHJpYnV0ZQBBc3NlbWJseVRpdGxlQXR0cmlidXRlAEFzc2VtYmx5RmlsZVZlcnNpb25BdHRyaWJ1dGUAQXNzZW1ibHlJbmZvcm1hdGlvbmFsVmVyc2lvbkF0dHJpYnV0ZQBBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGUAQ29tcGlsYXRpb25SZWxheGF0aW9uc0F0dHJpYnV0ZQBBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGUAQXNzZW1ibHlDb21wYW55QXR0cmlidXRlAFJ1bnRpbWVDb21wYXRpYmlsaXR5QXR0cmlidXRlAGJsYXpvci1jb25zb2xlLmRsbABQcm9ncmFtAFN5c3RlbQBNYWluAFN5c3RlbS5SZWZsZWN0aW9uAG15QXBwAC5jdG9yAFN5c3RlbS5EaWFnbm9zdGljcwBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzAERlYnVnZ2luZ01vZGVzAE9iamVjdAAAGUgAZQBsAGwAbwAgAFcAbwByAGwAZAAhAAAAXQ9GanmtTEuzgc0NDhYR8wAEIAEBCAMgAAEFIAEBEREEIAEBDgQAAQEOCMx7E//NLd1RAwAAAQgBAAgAAAAAAB4BAAEAVAIWV3JhcE5vbkV4Y2VwdGlvblRocm93cwEIAQAHAQAAAAATAQAOYmxhem9yLWNvbnNvbGUAAAoBAAVEZWJ1ZwAADAEABzEuMC4wLjAAAAoBAAUxLjAuMAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAA4JQAAAAAAAAAAAABSJQAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARCUAAAAAAAAAAAAAAABfQ29yRGxsTWFpbgBtc2NvcmVlLmRsbAAAAAAA/yUAIAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAADAAAAGQ1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="; - var runRequest = new WasmCodeRunnerRequest() - { - Base64Assembly = assembly, - Succeeded = true - }; - - var theThing = new InteropMessage(123, runRequest); - var message = JObject.FromObject(theThing).ToString(); - - var result = new CodeRunner().ProcessRunRequest(message); - - result.Sequence.Should().Be(123); - result.Data.Output.Select(o => o.Trim()).Should().BeEquivalentTo("Hello World!", ""); - consoleState.OutputIsRedirected.Should().BeFalse(); - } - } - - [Fact] - public void It_provides_errors_for_missing_type() - { - using (var consoleState = new PreserveConsoleState()) - { - var referencedCompilation = Compile(@" -public class C -{ -}"); - - var text = @" -class D -{ - public static void Main() - { - C c= new C(); - } -}"; - var other = Compile(text, referencedCompilation.ToMetadataReference()); - - - using (var stream = new MemoryStream()) - { - other.Emit(peStream: stream); - var encodedAssembly = System.Convert.ToBase64String(stream.ToArray()); - - var runRequest = new WasmCodeRunnerRequest() - { - Succeeded = true, - Base64Assembly = encodedAssembly - }; - - var response = new CodeRunner().ExecuteRunRequest(runRequest, 1); - - response.Data.RunnerException.Should().Match("*Missing type `C`*"); - consoleState.OutputIsRedirected.Should().BeFalse(); - } - } - } - - [Fact] - public void It_returns_null_if_there_is_no_assembly_or_diagnostics() - { - using (var consoleState = new PreserveConsoleState()) - { - var runRequest = new WasmCodeRunnerRequest(); - var interopMessage = new InteropMessage(0, runRequest); - var text = JObject.FromObject(interopMessage).ToString(); - new CodeRunner().ProcessRunRequest(text).Should().Be(null); - consoleState.OutputIsRedirected.Should().BeFalse(); - } - } - - - [Fact] - public void It_returns_an_error_if_there_is_no_entry_point() - { - using (var consoleState = new PreserveConsoleState()) - { - var compilation = Compile("class C {}"); - - using (var stream = new MemoryStream()) - { - compilation.Emit(peStream: stream); - var encodedAssembly = Convert.ToBase64String(stream.ToArray()); - - var runRequest = new WasmCodeRunnerRequest() - { - Succeeded = true, - Base64Assembly = encodedAssembly - }; - - var output = new CodeRunner().ExecuteRunRequest(runRequest, 1).Data.Output; - output.Single().Should().Be("error CS5001: Program does not contain a static 'Main' method suitable for an entry point"); - consoleState.OutputIsRedirected.Should().BeFalse(); - } - } - } - - private static string CompileAndEncode(string text, params MetadataReference[] additionalReferences) - { - var compilation = Compile(text); - - using (var stream = new MemoryStream()) - { - compilation.Emit(peStream: stream); - var encodedAssembly = Convert.ToBase64String(stream.ToArray()); - - return encodedAssembly; - } - } - - private static Compilation Compile(string text, params MetadataReference[] additionalReferences) - { - var refs = new[] - { - MetadataReference.CreateFromFile(typeof(object).Assembly.Location), - MetadataReference.CreateFromFile(typeof(decimal).Assembly.Location), - MetadataReference.CreateFromFile(typeof(System.Console).Assembly.Location), - MetadataReference.CreateFromFile(typeof(System.Linq.Enumerable).Assembly.Location), - }.Concat(additionalReferences); - - return CSharpCompilation.Create("assembly.dll", new[] { CSharpSyntaxTree.ParseText(text) }, refs, - new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); - } - } -} diff --git a/WasmCodeRunner.Tests/MLS.WasmCodeRunner.Tests.csproj b/WasmCodeRunner.Tests/MLS.WasmCodeRunner.Tests.csproj deleted file mode 100644 index 206b5e2b8..000000000 --- a/WasmCodeRunner.Tests/MLS.WasmCodeRunner.Tests.csproj +++ /dev/null @@ -1,35 +0,0 @@ - - - - net6.0 - - false - - - - - - - - - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - diff --git a/WasmCodeRunner/CodeRunner.cs b/WasmCodeRunner/CodeRunner.cs deleted file mode 100644 index 85a67c088..000000000 --- a/WasmCodeRunner/CodeRunner.cs +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -using System; -using System.Collections.Generic; -using System.CommandLine; -using System.CommandLine.Builder; -using System.CommandLine.Invocation; -using System.CommandLine.Parsing; -using System.IO; -using System.Linq; -using System.Reflection; -using Newtonsoft.Json; - -namespace MLS.WasmCodeRunner -{ - public class CodeRunner - { - int sequence = -1; - - public InteropMessage ProcessRunRequest(string message) - { - var messageObject = JsonConvert.DeserializeObject>(message); - if (messageObject.Sequence > this.sequence) - { - this.sequence = messageObject.Sequence; - } - else - { - return null; - } - - if (messageObject.Data.Base64Assembly == null && messageObject.Data.Diagnostics == null) - { - // Something was posted that wasn't meant for us - return null; - } - - var sequence = messageObject.Sequence; - var runRequest = messageObject.Data; - - if (runRequest.Succeeded) - { - return ExecuteRunRequest(runRequest, sequence); - } - - var diagnostics = runRequest.Diagnostics.Select(d => d.Message); - return new InteropMessage(sequence, new WasmCodeRunnerResponse(false, null, diagnostics.ToArray(), null, null)); - } - - - public InteropMessage ExecuteRunRequest(WasmCodeRunnerRequest runRequest, int sequence) - { - var output = new List(); - string runnerException = null; - var bytes = Convert.FromBase64String(runRequest.Base64Assembly); - - var stdOut = new StringWriter(); - var stdError = new StringWriter(); - - using (var consoleState = new PreserveConsoleState()) - { - MethodInfo main; - try - { - var assembly = Assembly.Load(bytes); - - Console.SetOut(stdOut); - Console.SetError(stdError); - - main = EntryPointDiscoverer.FindStaticEntryMethod(assembly); - - } - catch (InvalidProgramException) - { - var result = new WasmCodeRunnerResponse(succeeded: false, exception: null, - output: new[] { "error CS5001: Program does not contain a static 'Main' method suitable for an entry point" }, - diagnostics: Array.Empty(), - runnerException: null); - - return new InteropMessage(sequence, result); - } - - try - { - var args = runRequest.RunArgs; - - var builder = new CommandLineBuilder() - .ConfigureRootCommandFromMethod(main); - - var parser = builder.Build(); - parser.InvokeAsync(args).GetAwaiter().GetResult(); - } - catch (Exception e) - { - if ((e.InnerException ?? e) is TypeLoadException t) - { - runnerException = $"Missing type `{t.TypeName}`"; - } - if ((e.InnerException ?? e) is MissingMethodException m) - { - runnerException = $"Missing method `{m.Message}`"; - } - if ((e.InnerException ?? e) is FileNotFoundException f) - { - runnerException = $"Missing file: `{f.FileName}`"; - } - - output.AddRange(SplitOnNewlines(e.ToString())); - } - - var errors = stdError.ToString(); - if (!string.IsNullOrWhiteSpace(errors)) - { - runnerException = errors; - output.AddRange(SplitOnNewlines(errors)); - } - - output.AddRange(SplitOnNewlines(stdOut.ToString())); - - var rb = new WasmCodeRunnerResponse( - succeeded: true, - exception: null, - output: output.ToArray(), - diagnostics: null, - runnerException: runnerException); - - return new InteropMessage(sequence, rb); - } - } - - private IEnumerable SplitOnNewlines(string str) - { - str = str.Replace("\r\n", "\n"); - return str.Split('\n'); - } - } -} diff --git a/WasmCodeRunner/CommandLineBuilderExtensions.cs b/WasmCodeRunner/CommandLineBuilderExtensions.cs deleted file mode 100644 index 976bb61dc..000000000 --- a/WasmCodeRunner/CommandLineBuilderExtensions.cs +++ /dev/null @@ -1,142 +0,0 @@ -// code adapted from https://github.com/dotnet/command-line-api/blob/166610c56ff732093f0145a2911d4f6c40b786da/src/System.CommandLine.DragonFruit/CommandLine.cs - -using System; -using System.Collections.Generic; -using System.CommandLine; -using System.CommandLine.Binding; -using System.CommandLine.Builder; -using System.CommandLine.Invocation; -using System.CommandLine.Parsing; -using System.Linq; -using System.Reflection; -using System.Threading; - -namespace MLS.WasmCodeRunner -{ - internal static class CommandLineBuilderExtensions - { - public static CommandLineBuilder ConfigureRootCommandFromMethod( - this CommandLineBuilder builder, - MethodInfo method) - { - if (builder == null) - { - throw new ArgumentNullException(nameof(builder)); - } - - if (method == null) - { - throw new ArgumentNullException(nameof(method)); - } - - builder.Command.ConfigureFromMethod(method); - - return builder; - } - - private static readonly string[] _argumentParameterNames = - { - "arguments", - "argument", - "args" - }; - - public static void ConfigureFromMethod( - this Command command, - MethodInfo method) - { - if (command == null) - { - throw new ArgumentNullException(nameof(command)); - } - - if (method == null) - { - throw new ArgumentNullException(nameof(method)); - } - - foreach (var option in method.BuildOptions()) - { - command.AddOption(option); - } - - if (method.GetParameters() - .FirstOrDefault(p => _argumentParameterNames.Contains(p.Name)) is ParameterInfo argsParam) - { - command.AddArgument(new Argument - { - ArgumentType = argsParam.ParameterType, - Name = argsParam.Name - }); - } - - command.Handler = CommandHandler.Create(method); - } - - public static IEnumerable