From fed92a836df56ab8a235fae5a08655008a140360 Mon Sep 17 00:00:00 2001 From: Willem-J-an <51120533+Willem-J-an@users.noreply.github.com> Date: Wed, 27 Mar 2024 18:59:44 +0100 Subject: [PATCH 01/88] Update clients that support debugging (#2151) --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bb672b7f9..614f81096 100644 --- a/README.md +++ b/README.md @@ -126,7 +126,10 @@ If you want to take advantage of debugging, your client must support the [Debug Adapter Protocol](https://microsoft.github.io/debug-adapter-protocol/). Your client should use the path to the debug named pipe found in the `session.json` file talked about above. -Currently, only the Visual Studio Code extension supports debugging. +The debugging functionality in PowerShell Editor Services is available in the following editor extensions: + +- [PowerShell for Visual Studio Code](https://github.com/PowerShell/vscode-powershell) +- [nvim-dap-powershell for Neovim](https://github.com/Willem-J-an/nvim-dap-powershell) ## API Usage From db3d83329045875120f17986a385caa439c33615 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Wed, 27 Mar 2024 11:55:03 -0700 Subject: [PATCH 02/88] Fix Dependabot --- .github/dependabot.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index e3a2fb57f..d4c49ec2d 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,7 +1,15 @@ version: 2 +registries: + nuget-azure: + type: nuget-feed + url: https://pkgs.dev.azure.com/mscodehub/PowerShellCore/_packaging/PowerShellCore_PublicPackages/nuget/v3/index.json + username: powershell + password: ${{ secrets.AZURE_NUGET_TOKEN }} updates: - package-ecosystem: nuget directory: "/" + registries: + - nuget-azure labels: [ ] schedule: interval: weekly From 20f90a9d28bb181acc3137e4eeba8625399f4500 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Mon, 1 Apr 2024 15:39:16 -0700 Subject: [PATCH 03/88] Support 'preview' in version and always publish (a draft) Removed the manual validation step because it is unnecesary (and annoying) to gate this pipeline since it opens an unpublished, draft release. The downstream triggered pipeline will gate the release to the VS Code marketplace. --- .github/release.yml | 2 +- .../PowerShellEditorServices-Official.yml | 50 +++++++------------ tools/updateVersion.ps1 | 26 +++++----- 3 files changed, 32 insertions(+), 46 deletions(-) diff --git a/.github/release.yml b/.github/release.yml index bb7a942a4..cc5a1aa80 100644 --- a/.github/release.yml +++ b/.github/release.yml @@ -3,7 +3,7 @@ changelog: labels: - Ignore authors: - - dependabot[bot] + - dependabot categories: - title: Enhancements & Features ✨ labels: diff --git a/.pipelines/PowerShellEditorServices-Official.yml b/.pipelines/PowerShellEditorServices-Official.yml index f1d47c08c..e22560e72 100644 --- a/.pipelines/PowerShellEditorServices-Official.yml +++ b/.pipelines/PowerShellEditorServices-Official.yml @@ -52,7 +52,10 @@ extends: - pwsh: | [xml]$xml = Get-Content PowerShellEditorServices.Common.props $version = $xml.Project.PropertyGroup.VersionPrefix + $prerelease = $xml.Project.PropertyGroup.VersionSuffix + if ($prerelease) { $version += "-$prerelease" } Write-Output "##vso[task.setvariable variable=version;isOutput=true]$version" + Write-Output "##vso[task.setvariable variable=prerelease;isOutput=true]$(-not [string]::IsNullOrEmpty($prerelease))" name: package displayName: Get version from project properties - task: onebranch.pipeline.version@1 @@ -61,17 +64,17 @@ extends: system: Custom customVersion: $(package.version) - task: UseDotNet@2 - displayName: Install .NET 8.x SDK + displayName: Use .NET 8.x SDK inputs: packageType: sdk version: 8.x - task: UseDotNet@2 - displayName: Install .NET 7.x runtime + displayName: Use .NET 7.x runtime (for tests) inputs: packageType: runtime version: 7.x - task: UseDotNet@2 - displayName: Install .NET 6.x runtime + displayName: Use .NET 6.x runtime (for tests) inputs: packageType: runtime version: 6.x @@ -80,29 +83,22 @@ extends: inputs: pwsh: true filePath: tools/installPSResources.ps1 - - task: PowerShell@2 + - pwsh: Invoke-Build TestFull -Configuration $(BuildConfiguration) displayName: Build and test - inputs: - targetType: inline - pwsh: true - script: Invoke-Build TestFull -Configuration $(BuildConfiguration) - task: PublishTestResults@2 displayName: Publish test results inputs: testRunner: VSTest testResultsFiles: '**/*.trx' failTaskOnFailedTests: true - - task: PowerShell@2 + - pwsh: | + $assembly = [Reflection.Assembly]::LoadFile("$(Build.SourcesDirectory)/module/PowerShellEditorServices/bin/Core/Microsoft.PowerShell.EditorServices.Hosting.dll") + if ($assembly.GetCustomAttributes([System.Diagnostics.DebuggableAttribute], $true).IsJITOptimizerDisabled) { + Write-Host "##vso[task.LogIssue type=error;]Was not built in release configuration!" + exit 1 + } displayName: Assert release configuration - inputs: - targetType: inline - pwsh: true - script: | - $assembly = [Reflection.Assembly]::LoadFile("$(Build.SourcesDirectory)/module/PowerShellEditorServices/bin/Core/Microsoft.PowerShell.EditorServices.Hosting.dll") - if ($assembly.GetCustomAttributes([System.Diagnostics.DebuggableAttribute], $true).IsJITOptimizerDisabled) { - Write-Host "##vso[task.LogIssue type=error;]Was not built in release configuration!" - exit 1 - } + continueOnError: true - task: onebranch.pipeline.signing@1 displayName: Sign 1st-party files inputs: @@ -136,22 +132,10 @@ extends: dependsOn: build variables: version: $[ stageDependencies.build.main.outputs['package.version'] ] + prerelease: $[ stageDependencies.build.main.outputs['package.prerelease'] ] drop: $(Pipeline.Workspace)/drop_build_main jobs: - - job: validation - displayName: Manual validation - pool: - type: agentless - timeoutInMinutes: 1440 - steps: - - task: ManualValidation@0 - displayName: Wait 24 hours for validation - inputs: - notifyUsers: $(Build.RequestedForEmail) - instructions: Please validate the release - timeoutInMinutes: 1440 - job: github - dependsOn: validation displayName: Publish draft to GitHub pool: type: windows @@ -176,7 +160,7 @@ extends: tagSource: userSpecifiedTag tag: v$(version) isDraft: true + isPreRelease: $(prerelease) addChangeLog: false releaseNotesSource: inline - releaseNotesInline: | - # TODO: Generate release notes on GitHub! + releaseNotesInline: "" diff --git a/tools/updateVersion.ps1 b/tools/updateVersion.ps1 index e5b94280c..85e75dfcb 100644 --- a/tools/updateVersion.ps1 +++ b/tools/updateVersion.ps1 @@ -16,30 +16,32 @@ if ($LASTEXITCODE -ne 0) { $v = "$($Version.Major).$($Version.Minor).$($Version.Patch)" -$path = "PowerShellEditorServices.Common.props" -$f = Get-Content -Path $path +$Path = "PowerShellEditorServices.Common.props" +$f = Get-Content -Path $Path $f = $f -replace '^(?\s+)(.+)(?)$', "`${prefix}${v}`${suffix}" $f = $f -replace '^(?\s+)(.*)(?)$', "`${prefix}$($Version.PreReleaseLabel)`${suffix}" -$f | Set-Content -Path $path -git add $path +$f | Set-Content -Path $Path +git add $Path -$path = "module/PowerShellEditorServices/PowerShellEditorServices.psd1" -$f = Get-Content -Path $path +$Path = "module/PowerShellEditorServices/PowerShellEditorServices.psd1" +$f = Get-Content -Path $Path $f = $f -replace "^(?ModuleVersion = ')(.+)(?')`$", "`${prefix}${v}`${suffix}" -$f | Set-Content -Path $path -git add $path +$f | Set-Content -Path $Path +git add $Path -$path = "CHANGELOG.md" -$Changelog = Get-Content -Path $path +$Path = "CHANGELOG.md" +$Changelog = Get-Content -Path $Path @( $Changelog[0..1] "## v$Version" "### $([datetime]::Now.ToString('dddd, MMMM dd, yyyy'))" "" + "See more details at the GitHub Release for [v$Version](https://github.com/PowerShell/PowerShellEditorServices/releases/tag/v$Version)." + "" $Changes "" $Changelog[2..$Changelog.Length] -) | Set-Content -Encoding utf8NoBOM -Path $path -git add $path +) | Set-Content -Encoding utf8NoBOM -Path $Path +git add $Path git commit --edit --message "v$($Version): $Changes" From 5b30599e52623cf401a9aa21f54bf7ab70fd96e1 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Tue, 2 Apr 2024 13:09:26 -0700 Subject: [PATCH 04/88] Use a provided shell integration script directly Instead of having to maintain an edited copy (which was really annoying) I stubbed out `PSConsoleHostReadLine` to do what's expected. So now we can just use the existing shell integration script directly! Since we can't reliably find the script using `code --locate-shell-integration-path pwsh` we now rely on it being sent by the client on initialization. Its presence implies the feature is on. This is pretty VS Code specific, but not necessarily so. Apply suggestions from code review Thanks Patrick! Co-authored-by: Patrick Meinecke --- .../Server/PsesLanguageServer.cs | 5 +- .../PowerShell/Host/HostStartOptions.cs | 2 +- .../PowerShell/Host/PsesInternalHost.cs | 256 +++--------------- 3 files changed, 49 insertions(+), 214 deletions(-) diff --git a/src/PowerShellEditorServices/Server/PsesLanguageServer.cs b/src/PowerShellEditorServices/Server/PsesLanguageServer.cs index 74319e828..c2e25f64b 100644 --- a/src/PowerShellEditorServices/Server/PsesLanguageServer.cs +++ b/src/PowerShellEditorServices/Server/PsesLanguageServer.cs @@ -153,8 +153,9 @@ public async Task StartAsync() InitialWorkingDirectory = initializationOptions?.GetValue("initialWorkingDirectory")?.Value() ?? workspaceService.WorkspaceFolders.FirstOrDefault()?.Uri.GetFileSystemPath() ?? Directory.GetCurrentDirectory(), - ShellIntegrationEnabled = initializationOptions?.GetValue("shellIntegrationEnabled")?.Value() - ?? false + // If a shell integration script path is provided, that implies the feature is enabled. + ShellIntegrationScript = initializationOptions?.GetValue("shellIntegrationScript")?.Value() + ?? "", }; workspaceService.InitialWorkingDirectory = hostStartOptions.InitialWorkingDirectory; diff --git a/src/PowerShellEditorServices/Services/PowerShell/Host/HostStartOptions.cs b/src/PowerShellEditorServices/Services/PowerShell/Host/HostStartOptions.cs index f483b76b4..7de16fddf 100644 --- a/src/PowerShellEditorServices/Services/PowerShell/Host/HostStartOptions.cs +++ b/src/PowerShellEditorServices/Services/PowerShell/Host/HostStartOptions.cs @@ -9,6 +9,6 @@ internal struct HostStartOptions public string InitialWorkingDirectory { get; set; } - public bool ShellIntegrationEnabled { get; set; } + public string ShellIntegrationScript { get; set; } } } diff --git a/src/PowerShellEditorServices/Services/PowerShell/Host/PsesInternalHost.cs b/src/PowerShellEditorServices/Services/PowerShell/Host/PsesInternalHost.cs index c921de81b..6c77daa82 100644 --- a/src/PowerShellEditorServices/Services/PowerShell/Host/PsesInternalHost.cs +++ b/src/PowerShellEditorServices/Services/PowerShell/Host/PsesInternalHost.cs @@ -315,16 +315,28 @@ public async Task TryStartAsync(HostStartOptions startOptions, Cancellatio _logger.LogDebug("Profiles loaded!"); } - if (startOptions.ShellIntegrationEnabled) + if (!string.IsNullOrEmpty(startOptions.ShellIntegrationScript)) { - _logger.LogDebug("Enabling shell integration..."); + _logger.LogDebug("Enabling Terminal Shell Integration..."); _shellIntegrationEnabled = true; - await EnableShellIntegrationAsync(cancellationToken).ConfigureAwait(false); + // TODO: Make the __psEditorServices prefix shared (it's used elsewhere too). + string setupShellIntegration = $$""" + # Setup Terminal Shell Integration. + + # Define a fake PSConsoleHostReadLine so the integration script's wrapper + # can execute it to get the user's input. + $global:__psEditorServices_userInput = ""; + function global:PSConsoleHostReadLine { $global:__psEditorServices_userInput } + + # Execute the provided shell integration script. + try { . '{{startOptions.ShellIntegrationScript}}' } catch {} + """; + await EnableShellIntegrationAsync(setupShellIntegration, cancellationToken).ConfigureAwait(false); _logger.LogDebug("Shell integration enabled!"); } else { - _logger.LogDebug("Shell integration not enabled!"); + _logger.LogDebug("Terminal Shell Integration not enabled!"); } await _started.Task.ConfigureAwait(false); @@ -495,6 +507,7 @@ public Task ExecuteDelegateAsync( new SynchronousDelegateTask(_logger, representation, executionOptions, action, cancellationToken)); } + // TODO: One day fix these so the cancellation token is last. public Task> ExecutePSCommandAsync( PSCommand psCommand, CancellationToken cancellationToken, @@ -581,209 +594,12 @@ internal Task LoadHostProfilesAsync(CancellationToken cancellationToken) cancellationToken); } - private Task EnableShellIntegrationAsync(CancellationToken cancellationToken) + private Task EnableShellIntegrationAsync(string shellIntegrationScript, CancellationToken cancellationToken) { - // Imported on 01/03/24 from - // https://github.com/microsoft/vscode/blob/main/src/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1 - // with quotes escaped, `__VSCodeOriginalPSConsoleHostReadLine` removed (as it's done - // in our own ReadLine function), and `[Console]::Write` replaced with `Write-Host`. - const string shellIntegrationScript = @" -# Prevent installing more than once per session -if (Test-Path variable:global:__VSCodeOriginalPrompt) { - return; -} - -# Disable shell integration when the language mode is restricted -if ($ExecutionContext.SessionState.LanguageMode -ne ""FullLanguage"") { - return; -} - -$Global:__VSCodeOriginalPrompt = $function:Prompt - -$Global:__LastHistoryId = -1 - -# Store the nonce in script scope and unset the global -$Nonce = $env:VSCODE_NONCE -$env:VSCODE_NONCE = $null - -if ($env:VSCODE_ENV_REPLACE) { - $Split = $env:VSCODE_ENV_REPLACE.Split("":"") - foreach ($Item in $Split) { - $Inner = $Item.Split('=') - [Environment]::SetEnvironmentVariable($Inner[0], $Inner[1].Replace('\x3a', ':')) - } - $env:VSCODE_ENV_REPLACE = $null -} -if ($env:VSCODE_ENV_PREPEND) { - $Split = $env:VSCODE_ENV_PREPEND.Split("":"") - foreach ($Item in $Split) { - $Inner = $Item.Split('=') - [Environment]::SetEnvironmentVariable($Inner[0], $Inner[1].Replace('\x3a', ':') + [Environment]::GetEnvironmentVariable($Inner[0])) - } - $env:VSCODE_ENV_PREPEND = $null -} -if ($env:VSCODE_ENV_APPEND) { - $Split = $env:VSCODE_ENV_APPEND.Split("":"") - foreach ($Item in $Split) { - $Inner = $Item.Split('=') - [Environment]::SetEnvironmentVariable($Inner[0], [Environment]::GetEnvironmentVariable($Inner[0]) + $Inner[1].Replace('\x3a', ':')) - } - $env:VSCODE_ENV_APPEND = $null -} - -function Global:__VSCode-Escape-Value([string]$value) { - # NOTE: In PowerShell v6.1+, this can be written `$value -replace '…', { … }` instead of `[regex]::Replace`. - # Replace any non-alphanumeric characters. - [regex]::Replace($value, '[\\\n;]', { param($match) - # Encode the (ascii) matches as `\x` - -Join ( - [System.Text.Encoding]::UTF8.GetBytes($match.Value) | ForEach-Object { '\x{0:x2}' -f $_ } - ) - }) -} - -function Global:Prompt() { - $FakeCode = [int]!$global:? - # NOTE: We disable strict mode for the scope of this function because it unhelpfully throws an - # error when $LastHistoryEntry is null, and is not otherwise useful. - Set-StrictMode -Off - $LastHistoryEntry = Get-History -Count 1 - # Skip finishing the command if the first command has not yet started - if ($Global:__LastHistoryId -ne -1) { - if ($LastHistoryEntry.Id -eq $Global:__LastHistoryId) { - # Don't provide a command line or exit code if there was no history entry (eg. ctrl+c, enter on no command) - $Result = ""$([char]0x1b)]633;E`a"" - $Result += ""$([char]0x1b)]633;D`a"" - } - else { - # Command finished command line - # OSC 633 ; E ; ; ST - $Result = ""$([char]0x1b)]633;E;"" - # Sanitize the command line to ensure it can get transferred to the terminal and can be parsed - # correctly. This isn't entirely safe but good for most cases, it's important for the Pt parameter - # to only be composed of _printable_ characters as per the spec. - if ($LastHistoryEntry.CommandLine) { - $CommandLine = $LastHistoryEntry.CommandLine - } - else { - $CommandLine = """" - } - $Result += $(__VSCode-Escape-Value $CommandLine) - $Result += "";$Nonce"" - $Result += ""`a"" - # Command finished exit code - # OSC 633 ; D [; ] ST - $Result += ""$([char]0x1b)]633;D;$FakeCode`a"" - } - } - # Prompt started - # OSC 633 ; A ST - $Result += ""$([char]0x1b)]633;A`a"" - # Current working directory - # OSC 633 ; = ST - $Result += if ($pwd.Provider.Name -eq 'FileSystem') { ""$([char]0x1b)]633;P;Cwd=$(__VSCode-Escape-Value $pwd.ProviderPath)`a"" } - # Before running the original prompt, put $? back to what it was: - if ($FakeCode -ne 0) { - Write-Error ""failure"" -ea ignore - } - # Run the original prompt - $Result += $Global:__VSCodeOriginalPrompt.Invoke() - # Write command started - $Result += ""$([char]0x1b)]633;B`a"" - $Global:__LastHistoryId = $LastHistoryEntry.Id - return $Result -} - -# Set IsWindows property -if ($PSVersionTable.PSVersion -lt ""6.0"") { - # Windows PowerShell is only available on Windows - Write-Host -NoNewLine ""$([char]0x1b)]633;P;IsWindows=$true`a"" -} -else { - Write-Host -NoNewLine ""$([char]0x1b)]633;P;IsWindows=$IsWindows`a"" -} - -# Set always on key handlers which map to default VS Code keybindings -function Set-MappedKeyHandler { - param ([string[]] $Chord, [string[]]$Sequence) - try { - $Handler = Get-PSReadLineKeyHandler -Chord $Chord | Select-Object -First 1 - } - catch [System.Management.Automation.ParameterBindingException] { - # PowerShell 5.1 ships with PSReadLine 2.0.0 which does not have -Chord, - # so we check what's bound and filter it. - $Handler = Get-PSReadLineKeyHandler -Bound | Where-Object -FilterScript { $_.Key -eq $Chord } | Select-Object -First 1 - } - if ($Handler) { - Set-PSReadLineKeyHandler -Chord $Sequence -Function $Handler.Function - } -} - -$Global:__VSCodeHaltCompletions = $false -function Set-MappedKeyHandlers { - Set-MappedKeyHandler -Chord Ctrl+Spacebar -Sequence 'F12,a' - Set-MappedKeyHandler -Chord Alt+Spacebar -Sequence 'F12,b' - Set-MappedKeyHandler -Chord Shift+Enter -Sequence 'F12,c' - Set-MappedKeyHandler -Chord Shift+End -Sequence 'F12,d' - - # Conditionally enable suggestions - if ($env:VSCODE_SUGGEST -eq '1') { - Remove-Item Env:VSCODE_SUGGEST - - # VS Code send completions request (may override Ctrl+Spacebar) - Set-PSReadLineKeyHandler -Chord 'F12,e' -ScriptBlock { - Send-Completions - } - - # Suggest trigger characters - Set-PSReadLineKeyHandler -Chord ""-"" -ScriptBlock { - [Microsoft.PowerShell.PSConsoleReadLine]::Insert(""-"") - if (!$Global:__VSCodeHaltCompletions) { - Send-Completions - } - } - - Set-PSReadLineKeyHandler -Chord 'F12,y' -ScriptBlock { - $Global:__VSCodeHaltCompletions = $true - } - - Set-PSReadLineKeyHandler -Chord 'F12,z' -ScriptBlock { - $Global:__VSCodeHaltCompletions = $false - } - } -} - -function Send-Completions { - $commandLine = """" - $cursorIndex = 0 - # TODO: Since fuzzy matching exists, should completions be provided only for character after the - # last space and then filter on the client side? That would let you trigger ctrl+space - # anywhere on a word and have full completions available - [Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState([ref]$commandLine, [ref]$cursorIndex) - $completionPrefix = $commandLine - - # Get completions - $result = ""`e]633;Completions"" - if ($completionPrefix.Length -gt 0) { - # Get and send completions - $completions = TabExpansion2 -inputScript $completionPrefix -cursorColumn $cursorIndex - if ($null -ne $completions.CompletionMatches) { - $result += "";$($completions.ReplacementIndex);$($completions.ReplacementLength);$($cursorIndex);"" - $result += $completions.CompletionMatches | ConvertTo-Json -Compress - } - } - $result += ""`a"" - - Write-Host -NoNewLine $result -} - -# Register key handlers if PSReadLine is available -if (Get-Module -Name PSReadLine) { - Set-MappedKeyHandlers -} - "; - - return ExecutePSCommandAsync(new PSCommand().AddScript(shellIntegrationScript), cancellationToken); + return ExecutePSCommandAsync( + new PSCommand().AddScript(shellIntegrationScript), + cancellationToken, + new PowerShellExecutionOptions { AddToHistory = false, ThrowOnError = false }); } public Task SetInitialWorkingDirectoryAsync(string path, CancellationToken cancellationToken) @@ -1262,16 +1078,34 @@ private void InvokeInput(string input, CancellationToken cancellationToken) try { - // For VS Code's shell integration feature, this replaces their - // PSConsoleHostReadLine function wrapper, as that global function is not available - // to users of PSES, since we already wrap ReadLine ourselves. + // For the terminal shell integration feature, we call PSConsoleHostReadLine specially as it's been wrapped. + // Normally it would not be available (since we wrap ReadLine ourselves), + // but in this case we've made the original just emit the user's input so that the wrapper works as intended. if (_shellIntegrationEnabled) { - System.Console.Write("\x1b]633;C\a"); + // Save the user's input to our special global variable so PSConsoleHostReadLine can read it. + InvokePSCommand( + new PSCommand().AddScript("$global:__psEditorServices_userInput = $args[0]").AddArgument(input), + new PowerShellExecutionOptions { ThrowOnError = false, WriteOutputToHost = false }, + cancellationToken); + + // Invoke the PSConsoleHostReadLine wrapper. We don't write the output because it + // returns the command line (user input) which would then be duplicate noise. Fortunately + // it writes the shell integration sequences directly using [Console]::Write. + InvokePSCommand( + new PSCommand().AddScript("PSConsoleHostReadLine"), + new PowerShellExecutionOptions { ThrowOnError = false, WriteOutputToHost = false }, + cancellationToken); + + // Reset our global variable. + InvokePSCommand( + new PSCommand().AddScript("$global:__psEditorServices_userInput = \"\""), + new PowerShellExecutionOptions { ThrowOnError = false, WriteOutputToHost = false }, + cancellationToken); } InvokePSCommand( - new PSCommand().AddScript(input, useLocalScope: false), + new PSCommand().AddScript(input), new PowerShellExecutionOptions { AddToHistory = true, From e21c8c1d7e5ac833a9eed05be9b795bc61777399 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Wed, 3 Apr 2024 13:59:37 -0700 Subject: [PATCH 05/88] v3.19.0: Overhauled Terminal Shell Integration! --- CHANGELOG.md | 7 +++++++ PowerShellEditorServices.Common.props | 2 +- .../PowerShellEditorServices/PowerShellEditorServices.psd1 | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 10c90056d..bf5c3f4ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # PowerShell Editor Services Release History +## v3.19.0 +### Wednesday, April 03, 2024 + +See more details at the GitHub Release for [v3.19.0](https://github.com/PowerShell/PowerShellEditorServices/releases/tag/v3.19.0). + +Overhauled Terminal Shell Integration! + ## v3.18.1 ### Tuesday, March 19, 2024 diff --git a/PowerShellEditorServices.Common.props b/PowerShellEditorServices.Common.props index 80d45b7ba..6681ee99a 100644 --- a/PowerShellEditorServices.Common.props +++ b/PowerShellEditorServices.Common.props @@ -1,6 +1,6 @@ - 3.18.1 + 3.19.0 Microsoft © Microsoft Corporation. diff --git a/module/PowerShellEditorServices/PowerShellEditorServices.psd1 b/module/PowerShellEditorServices/PowerShellEditorServices.psd1 index ebeba42f9..0dbfcdae0 100644 --- a/module/PowerShellEditorServices/PowerShellEditorServices.psd1 +++ b/module/PowerShellEditorServices/PowerShellEditorServices.psd1 @@ -19,7 +19,7 @@ RootModule = if ($PSEdition -eq 'Core') } # Version number of this module. -ModuleVersion = '3.18.1' +ModuleVersion = '3.19.0' # ID used to uniquely identify this module GUID = '9ca15887-53a2-479a-9cda-48d26bcb6c47' From 8c61728009c946c99326148fb52215d6c6d1d3f4 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Thu, 4 Apr 2024 10:43:13 -0700 Subject: [PATCH 06/88] Update tests' dependency on PowerShell SDK --- .../PowerShellEditorServices.Test.csproj | 6 +- .../packages.lock.json | 336 +++++++++--------- 2 files changed, 173 insertions(+), 169 deletions(-) diff --git a/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj b/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj index 5c2534509..f77593613 100644 --- a/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj +++ b/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj @@ -18,17 +18,17 @@ - + - + - + diff --git a/test/PowerShellEditorServices.Test/packages.lock.json b/test/PowerShellEditorServices.Test/packages.lock.json index 10c7dcbe2..708461b71 100644 --- a/test/PowerShellEditorServices.Test/packages.lock.json +++ b/test/PowerShellEditorServices.Test/packages.lock.json @@ -550,7 +550,7 @@ "Microsoft.PowerShell.EditorServices.Test.Shared": { "type": "Project", "dependencies": { - "Microsoft.PowerShell.EditorServices": "[3.17.0, )" + "Microsoft.PowerShell.EditorServices": "[3.19.0, )" } } }, @@ -567,23 +567,23 @@ }, "Microsoft.PowerShell.SDK": { "type": "Direct", - "requested": "[7.2.17, )", - "resolved": "7.2.17", - "contentHash": "ZzW3f5zCWA+aPmpovTVz1bMdmrq+yjkHdH3xd3KZlE0Rfb9lSuIBvXt9ktu2/sAaGPoLL4c0Rn2OPhGrRIm81A==", + "requested": "[7.2.18, )", + "resolved": "7.2.18", + "contentHash": "0rFp8M289yx/ArclYFgu0Hiu5545KeFGKj+u1wVe7x/UNnCjZKYJzZz30GB0+mdQ1JsMjRITNgkvOCjnRCS5Kw==", "dependencies": { "Microsoft.Extensions.ObjectPool": "5.0.17", - "Microsoft.Management.Infrastructure.CimCmdlets": "7.2.17", + "Microsoft.Management.Infrastructure.CimCmdlets": "7.2.18", "Microsoft.NETCore.Windows.ApiSets": "1.0.1", - "Microsoft.PowerShell.Commands.Diagnostics": "7.2.17", - "Microsoft.PowerShell.Commands.Management": "7.2.17", - "Microsoft.PowerShell.Commands.Utility": "7.2.17", - "Microsoft.PowerShell.ConsoleHost": "7.2.17", - "Microsoft.PowerShell.Security": "7.2.17", - "Microsoft.WSMan.Management": "7.2.17", + "Microsoft.PowerShell.Commands.Diagnostics": "7.2.18", + "Microsoft.PowerShell.Commands.Management": "7.2.18", + "Microsoft.PowerShell.Commands.Utility": "7.2.18", + "Microsoft.PowerShell.ConsoleHost": "7.2.18", + "Microsoft.PowerShell.Security": "7.2.18", + "Microsoft.WSMan.Management": "7.2.18", "Microsoft.Windows.Compatibility": "6.0.7", - "System.Data.SqlClient": "4.8.5", + "System.Data.SqlClient": "4.8.6", "System.IO.Packaging": "6.0.0", - "System.Management.Automation": "7.2.17", + "System.Management.Automation": "7.2.18", "System.Net.Http.WinHttpHandler": "6.0.1", "System.Private.ServiceModel": "4.9.0", "System.ServiceModel.Duplex": "4.9.0", @@ -787,10 +787,10 @@ }, "Microsoft.Management.Infrastructure.CimCmdlets": { "type": "Transitive", - "resolved": "7.2.17", - "contentHash": "Kbx9i64RgLvL8DUEADveHNpuY3MdX7VtPxMoAsxKjPvLVUIbUAEino3NCHKz7OGkduzDwyDH/rM4OSEoiyK5+A==", + "resolved": "7.2.18", + "contentHash": "nx2CXZTGtRP3tC+WCqr+A6hgq0UddHd6yjAbkh457yjNYQS5N0EP23rVoF2NfFeVgFy3Gdut3MB6LLeCTEW+EA==", "dependencies": { - "System.Management.Automation": "7.2.17" + "System.Management.Automation": "7.2.18" } }, "Microsoft.Management.Infrastructure.Runtime.Unix": { @@ -820,25 +820,25 @@ }, "Microsoft.PowerShell.Commands.Diagnostics": { "type": "Transitive", - "resolved": "7.2.17", - "contentHash": "bY18hRl+fyAm8GZE/q5HG5X3aQqizuTfqfudcBK/+X3i+cO6iK7CSQbuxPjfFXWD6MSe/ljxVRAKdbIXDE/BuQ==", + "resolved": "7.2.18", + "contentHash": "3dYKtjevF/6gdm6yitIwGbqBPBPQ0/Rixtibb/4fab1UdmZjYjOFJDDdbLoG2hL+LLE8PmLIN5rCRKY6Yepriw==", "dependencies": { - "System.Management.Automation": "7.2.17" + "System.Management.Automation": "7.2.18" } }, "Microsoft.PowerShell.Commands.Management": { "type": "Transitive", - "resolved": "7.2.17", - "contentHash": "5p9eoKORNcVyjWgxnTVU/3niZgdzuXz13U8qLCljHIceOjLuzI2mYKvJaB9isTxbSEuXDKuncqBNy8XjTTmR7g==", + "resolved": "7.2.18", + "contentHash": "+x3qjcQ9DvwKVbTDVIOVYal7FxuOdqqecbz/ngTqs/uJUcCPOv2p9YgE1NkoAAO9UT56ukxvbaLbMaLihOnI0Q==", "dependencies": { - "Microsoft.PowerShell.Security": "7.2.17", + "Microsoft.PowerShell.Security": "7.2.18", "System.ServiceProcess.ServiceController": "6.0.1" } }, "Microsoft.PowerShell.Commands.Utility": { "type": "Transitive", - "resolved": "7.2.17", - "contentHash": "i1kmPVMvQuZx8XNNYeHNz140v/J0EcAet/PswFzWpnK5SlxzWL9j9ozC5XFNAhGsWJwN1lpute1baf0ZKOoaqA==", + "resolved": "7.2.18", + "contentHash": "Qut0tzMArwa5CEb4NDr8Pt/ZKeI18QdfFXIKgJYO4NN6E/15He4lWyoDxw0BDI9vORMGVgeP9uLz+L/i/w+ftA==", "dependencies": { "Markdig.Signed": "0.31.0", "Microsoft.CodeAnalysis.CSharp": "4.0.1", @@ -847,22 +847,22 @@ "NJsonSchema": "10.5.2", "Namotion.Reflection": "2.0.10", "System.Drawing.Common": "6.0.0", - "System.Management.Automation": "7.2.17", + "System.Management.Automation": "7.2.18", "System.Threading.AccessControl": "6.0.0" } }, "Microsoft.PowerShell.ConsoleHost": { "type": "Transitive", - "resolved": "7.2.17", - "contentHash": "0ccO91QqNYCtXfRGVx6ajfKGyH0AAEDqWsyOUQHcrEtd3O8HyFsri0uspXcMfn5pn5zViNGVf852jECeAIQ/fA==", + "resolved": "7.2.18", + "contentHash": "xra5nMBncp0JPzoeCjpGqARAJkimxGBFpDY29+/0BIkeFHrlSVttI7ZSMrDamo6OCRUzpPn5gNZIP1LprWOgVw==", "dependencies": { - "System.Management.Automation": "7.2.17" + "System.Management.Automation": "7.2.18" } }, "Microsoft.PowerShell.CoreCLR.Eventing": { "type": "Transitive", - "resolved": "7.2.17", - "contentHash": "MBUnwBfUzLDDtgPSb9vd2Irj83fC8nXBEBgbE04tgtIN8ofezWLuuRhopIPAi8tJpFfsTefYu8Vi7oEo7Wgj5w==", + "resolved": "7.2.18", + "contentHash": "n3zlvCVXT0vbs5NUZCGgP7bl6xdoB/rddiSnrvIqpW8eNrh8auImj8KKgVNW3iOmL2OzMPIrSCeaP2ZyOSTh3A==", "dependencies": { "System.Diagnostics.EventLog": "6.0.0" } @@ -882,10 +882,10 @@ }, "Microsoft.PowerShell.Security": { "type": "Transitive", - "resolved": "7.2.17", - "contentHash": "HaMmLZtFPb/HuHm89j3g7d8MR0AaEMMFuvJnF4yxCukANkFiIFe3Tuyt1C+p4PJmooGDm3zkDX5UiCfDB4i4kg==", + "resolved": "7.2.18", + "contentHash": "nbp5NIsAoWC1jFIIG+PSXtfoEFN4Em90JIrDEro6gahQBMVh3QH60vFRqim5WthUbO4Q5IAyzlViGs8AZNSzZw==", "dependencies": { - "System.Management.Automation": "7.2.17" + "System.Management.Automation": "7.2.18" } }, "Microsoft.TestPlatform.ObjectModel": { @@ -994,18 +994,18 @@ }, "Microsoft.WSMan.Management": { "type": "Transitive", - "resolved": "7.2.17", - "contentHash": "4WvKb8xQgs+EpDkWBCx2MMg8jdnf7yncuOOf/S2qMA6ISOCGIwla46/Faixp+d67pZhAMXkvNVx3C/ym5MkyXw==", + "resolved": "7.2.18", + "contentHash": "w2Wnb9M1uSG+JGbwG5bSbW1tCNh3XgA3hdA+/4320YR+jx63yEmySeG6wGxG0Z1sND7uhb6/8usw8bH0do2ZSg==", "dependencies": { - "Microsoft.WSMan.Runtime": "7.2.17", - "System.Management.Automation": "7.2.17", + "Microsoft.WSMan.Runtime": "7.2.18", + "System.Management.Automation": "7.2.18", "System.ServiceProcess.ServiceController": "6.0.1" } }, "Microsoft.WSMan.Runtime": { "type": "Transitive", - "resolved": "7.2.17", - "contentHash": "Q/e/EwioaaufbinB2nFrIT+AkCiSJ3pRAV1zHCwWKjx4X26YYsNdamd+9EFWqAccQHZuBs9pOAWsLvMXwNzR0w==" + "resolved": "7.2.18", + "contentHash": "ye/1J/2VsrSBd67B/D68NYxRpAUdtx9aHdDeVGXaDzktf7/P+OgUXPlYmvHCEC5dDvsPli/KFtNWkMhoIwEKOw==" }, "Namotion.Reflection": { "type": "Transitive", @@ -1269,8 +1269,8 @@ }, "System.Data.SqlClient": { "type": "Transitive", - "resolved": "4.8.5", - "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "resolved": "4.8.6", + "contentHash": "2Ij/LCaTQRyAi5lAv7UUTV9R2FobC8xN9mE0fXBZohum/xLl8IZVmE98Rq5ugQHjCgTBRKqpXRb4ORulRdA6Ig==", "dependencies": { "Microsoft.Win32.Registry": "4.7.0", "System.Security.Principal.Windows": "4.7.0", @@ -1370,13 +1370,13 @@ }, "System.Management.Automation": { "type": "Transitive", - "resolved": "7.2.17", - "contentHash": "PY6LHEH3mjHzzHgtSdPp8uTiUcL4+lLwj3T6ZASNgZVw+BXdHQeMBSteIVV72DAQzk0DblS2xkVasoSem0ggIw==", + "resolved": "7.2.18", + "contentHash": "SEIWaTtkkajmCGEjOkWHubbQ0ndtrxOPLqG19ogmodjYo+U7jw7MmimOU4fUH2A3wpB1lwXCVqI79x/vvcIPtQ==", "dependencies": { "Microsoft.ApplicationInsights": "2.21.0", "Microsoft.CSharp": "4.7.0", "Microsoft.Management.Infrastructure": "2.0.0", - "Microsoft.PowerShell.CoreCLR.Eventing": "7.2.17", + "Microsoft.PowerShell.CoreCLR.Eventing": "7.2.18", "Microsoft.PowerShell.Native": "7.2.1", "Microsoft.Win32.Registry.AccessControl": "6.0.0", "Newtonsoft.Json": "13.0.3", @@ -1685,7 +1685,7 @@ "Microsoft.PowerShell.EditorServices.Test.Shared": { "type": "Project", "dependencies": { - "Microsoft.PowerShell.EditorServices": "[3.17.0, )" + "Microsoft.PowerShell.EditorServices": "[3.19.0, )" } } }, @@ -1702,24 +1702,24 @@ }, "Microsoft.PowerShell.SDK": { "type": "Direct", - "requested": "[7.3.10, )", - "resolved": "7.3.10", - "contentHash": "3sxhHjdfcbMvg2kpjmXkZp2J7Tox61YOIXlpn0PUypSy6uI52Rvg2q3PHz9RqKVmZ0VvaETFQsyajltEdQjRXg==", + "requested": "[7.3.11, )", + "resolved": "7.3.11", + "contentHash": "QKeE4siV3o8CwIlIqxj2AV1GAm7yy+XEOtke1vdUT/IBs7QIPnzFqEFHN9+NJAJ3iiSQFFGq7Mryy3RExS6eJg==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "Microsoft.Extensions.ObjectPool": "7.0.14", - "Microsoft.Management.Infrastructure.CimCmdlets": "7.3.10", - "Microsoft.PowerShell.Commands.Diagnostics": "7.3.10", - "Microsoft.PowerShell.Commands.Management": "7.3.10", - "Microsoft.PowerShell.Commands.Utility": "7.3.10", - "Microsoft.PowerShell.ConsoleHost": "7.3.10", - "Microsoft.PowerShell.Security": "7.3.10", - "Microsoft.WSMan.Management": "7.3.10", + "Microsoft.Extensions.ObjectPool": "7.0.15", + "Microsoft.Management.Infrastructure.CimCmdlets": "7.3.11", + "Microsoft.PowerShell.Commands.Diagnostics": "7.3.11", + "Microsoft.PowerShell.Commands.Management": "7.3.11", + "Microsoft.PowerShell.Commands.Utility": "7.3.11", + "Microsoft.PowerShell.ConsoleHost": "7.3.11", + "Microsoft.PowerShell.Security": "7.3.11", + "Microsoft.WSMan.Management": "7.3.11", "Microsoft.Win32.Registry": "5.0.0", "Microsoft.Windows.Compatibility": "7.0.5", - "System.Data.SqlClient": "4.8.5", + "System.Data.SqlClient": "4.8.6", "System.IO.Packaging": "7.0.0", - "System.Management.Automation": "7.3.10", + "System.Management.Automation": "7.3.11", "System.Net.Http.WinHttpHandler": "7.0.0", "System.Private.ServiceModel": "4.10.3", "System.Security.Cryptography.ProtectedData": "7.0.1", @@ -1883,8 +1883,8 @@ }, "Microsoft.Extensions.ObjectPool": { "type": "Transitive", - "resolved": "7.0.14", - "contentHash": "C2N75sDAj4xY1hex2Tzv6l8s5Wcuvh6v6kjkLwyahJb7l2V7mrWtlKbSP19Q0AxqGyvTkd7Is/M2DBTwCbKBSQ==" + "resolved": "7.0.15", + "contentHash": "eP9AS3epm6pOeviGKt2GT+sW1LtLA6lHiY2oQFthoGisGRxDKgxerwXgrsXvWv6YJ9w4Pz/ih3vI1njeSbYPBw==" }, "Microsoft.Extensions.Options": { "type": "Transitive", @@ -1923,10 +1923,10 @@ }, "Microsoft.Management.Infrastructure.CimCmdlets": { "type": "Transitive", - "resolved": "7.3.10", - "contentHash": "RM1yPzl67HjotHMuaw2dBdlKLUBR3pmYQ+JGcw9z6Osls6WmKoQZcJKiItPAMZX38AaTB21VEutyBTI5LhpJ7Q==", + "resolved": "7.3.11", + "contentHash": "n4rOiTl9SUly/qPXXHtJygaaEt002W7dXN24CoZJllbtyY/dAuIIOTkqN397BGiluff9c1BrmhsjGx7sHoavjg==", "dependencies": { - "System.Management.Automation": "7.3.10" + "System.Management.Automation": "7.3.11" } }, "Microsoft.Management.Infrastructure.Runtime.Unix": { @@ -1951,25 +1951,25 @@ }, "Microsoft.PowerShell.Commands.Diagnostics": { "type": "Transitive", - "resolved": "7.3.10", - "contentHash": "aopcVFcevPACu9il0zeIuGv0NU/cR7H9zHNAN5Ug4h7Q07eJM14mWGr4BcYwk7xRBK2Lk7AZmNWxC5CHvfKTAA==", + "resolved": "7.3.11", + "contentHash": "FS2k1cOEs7mL1qHg1xOshK6h083mCM+F9vPRQz9twPQG0mZU3nhs0+Fh9U4jJ74zdpBzebZbNgUQYwa0nRCo7g==", "dependencies": { - "System.Management.Automation": "7.3.10" + "System.Management.Automation": "7.3.11" } }, "Microsoft.PowerShell.Commands.Management": { "type": "Transitive", - "resolved": "7.3.10", - "contentHash": "YN1NT9h/x/EiL4XnNtC4/1CsDAvmJwW/2RqaHMqMzCXRwq38+hAH1zeVy+N4BbLhAjMSvCAVHI+vh+KRgBylfw==", + "resolved": "7.3.11", + "contentHash": "/5h9m1knoXmQIbL9kSv65JarwdvZR49QjpQ7xPzDCQnUciTpRBSC1hrY5kgqWeI444xw+s4mEQhkMvyAyvTi8g==", "dependencies": { - "Microsoft.PowerShell.Security": "7.3.10", + "Microsoft.PowerShell.Security": "7.3.11", "System.ServiceProcess.ServiceController": "7.0.1" } }, "Microsoft.PowerShell.Commands.Utility": { "type": "Transitive", - "resolved": "7.3.10", - "contentHash": "ayzddFHB7+o7UI33EziTiqitOUGCMhpenxrbjhD3neeqPHJj2SDQEh1SmCb4dHY2Gso/JIOR10qbjhQfWpKItQ==", + "resolved": "7.3.11", + "contentHash": "RA87scdTlsiVc6HEz9TjB5KunCWVyFTvz0VZKAET8xdhMeaTbiQKMj2zK3qBKI+fLw2O7xhqYsUJqyX9VrWjfg==", "dependencies": { "Markdig.Signed": "0.31.0", "Microsoft.CodeAnalysis.CSharp": "4.4.0", @@ -1977,22 +1977,22 @@ "NJsonSchema": "10.8.0", "Namotion.Reflection": "2.1.2", "System.Drawing.Common": "7.0.0", - "System.Management.Automation": "7.3.10", + "System.Management.Automation": "7.3.11", "System.Threading.AccessControl": "7.0.1" } }, "Microsoft.PowerShell.ConsoleHost": { "type": "Transitive", - "resolved": "7.3.10", - "contentHash": "HxP8ZtGRIZYxLgWMIxCfY4FJimpVilcG7Gca0PPX91vua624OBt+IxpPtVz678uH/14YeJIbpSGzOAwh6xvQhg==", + "resolved": "7.3.11", + "contentHash": "2UdF1+vXCPo9nb6PTxNHJ4w+Gv5oMAhWV/4uG8kGIrR47dcDg1GNngdxi0LkZw1jFrTaYWJnG8LQ8Pl66KUAOw==", "dependencies": { - "System.Management.Automation": "7.3.10" + "System.Management.Automation": "7.3.11" } }, "Microsoft.PowerShell.CoreCLR.Eventing": { "type": "Transitive", - "resolved": "7.3.10", - "contentHash": "/rU9EUbko0hftXg8Gor5xhpQipM0Y4CrxwanYR5/6ZLrZBkTroanOhhWTCjW0phI8d8a9sAQA2FECFzWO8kWKg==", + "resolved": "7.3.11", + "contentHash": "99s2ohi4HIsBE94yTr+ZFaktbhpnuJGHu+orrVb2lBTsM55mOMDcDodDy9t0Wi4bu1kJVr7cbr5guO22z++/VQ==", "dependencies": { "System.Diagnostics.EventLog": "7.0.0" } @@ -2012,10 +2012,10 @@ }, "Microsoft.PowerShell.Security": { "type": "Transitive", - "resolved": "7.3.10", - "contentHash": "I8zMNzrEN8cCUQUTpwRzYtGi+vXoO5DvSfHT8+x2I6yrgAhyjzZyYQkvGm+n/hZBIA8Ayc6o67L7Ev0cLpW1cw==", + "resolved": "7.3.11", + "contentHash": "enBmNAktfPJS1Wlg/MmfgJGsI11oBbEpmwI8pMSCYu7pqh3Wq25h1Sp+eyJAy0Q0MxllIZAbeVVu9LCeu8TphA==", "dependencies": { - "System.Management.Automation": "7.3.10" + "System.Management.Automation": "7.3.11" } }, "Microsoft.Security.Extensions": { @@ -2125,18 +2125,18 @@ }, "Microsoft.WSMan.Management": { "type": "Transitive", - "resolved": "7.3.10", - "contentHash": "uEfRWYS1FA2vipN16A/ZnT5hOA010AukAFJENxyTj7Xmb8m3IN0k915BkxO+n/abLMJ4PVRRi01vA0voodFVig==", + "resolved": "7.3.11", + "contentHash": "A9pD4KCByhco7PnlaTVYAczNGMIbb9yUB2heSZCWLw6b6nC6JMJiawRTwptUeJaw0RfWrB2a/6W2jkecB9UlQg==", "dependencies": { - "Microsoft.WSMan.Runtime": "7.3.10", - "System.Management.Automation": "7.3.10", + "Microsoft.WSMan.Runtime": "7.3.11", + "System.Management.Automation": "7.3.11", "System.ServiceProcess.ServiceController": "7.0.1" } }, "Microsoft.WSMan.Runtime": { "type": "Transitive", - "resolved": "7.3.10", - "contentHash": "e2DHtDuYcDGj2s8q+UsqJM5u/dhxjfqxpO3ojSITz0zuMlrsaJytoiG9dn6R4eSKV9C1XuvrN1xAQCUWfVMl7Q==" + "resolved": "7.3.11", + "contentHash": "NUGKQ+OR9Ic0fBMn8kmh9f5YPTNDLIXJxHUDw4amJu6vGE6Zm7lvZZ5P9wQ3+QEU1D3ikpzDKoG+JCHrPsKKag==" }, "Namotion.Reflection": { "type": "Transitive", @@ -2404,8 +2404,8 @@ }, "System.Data.SqlClient": { "type": "Transitive", - "resolved": "4.8.5", - "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "resolved": "4.8.6", + "contentHash": "2Ij/LCaTQRyAi5lAv7UUTV9R2FobC8xN9mE0fXBZohum/xLl8IZVmE98Rq5ugQHjCgTBRKqpXRb4ORulRdA6Ig==", "dependencies": { "Microsoft.Win32.Registry": "4.7.0", "System.Security.Principal.Windows": "4.7.0", @@ -2503,13 +2503,13 @@ }, "System.Management.Automation": { "type": "Transitive", - "resolved": "7.3.10", - "contentHash": "EL9podZo6BKcC/B8WjpceDXDBrJEZzi+zelHkEo5opI8lOT/FSmm4Hg0WVGEHNWaQRShVxDVBYaftmy0J155Zw==", + "resolved": "7.3.11", + "contentHash": "PvAgBxHIyGN0rAtTLRmjGYo7qIRrdaLm/KFXoomTEHM4hjzLqzxDhT+jd0d7SyA0BYmhwUNVXxlTxTP+V6+swQ==", "dependencies": { "Microsoft.ApplicationInsights": "2.21.0", "Microsoft.CSharp": "4.7.0", "Microsoft.Management.Infrastructure": "2.0.0", - "Microsoft.PowerShell.CoreCLR.Eventing": "7.3.10", + "Microsoft.PowerShell.CoreCLR.Eventing": "7.3.11", "Microsoft.PowerShell.Native": "7.3.2", "Microsoft.Security.Extensions": "1.2.0", "Microsoft.Win32.Registry.AccessControl": "7.0.0", @@ -2808,7 +2808,7 @@ "Microsoft.PowerShell.EditorServices.Test.Shared": { "type": "Project", "dependencies": { - "Microsoft.PowerShell.EditorServices": "[3.17.0, )" + "Microsoft.PowerShell.EditorServices": "[3.19.0, )" } } }, @@ -2825,21 +2825,22 @@ }, "Microsoft.PowerShell.SDK": { "type": "Direct", - "requested": "[7.4.0, )", - "resolved": "7.4.0", - "contentHash": "Dfq8X2csb/Lpfyf9AEgxPOb8zO5cjErdsoU2TPjfU8lnv0JJQxRFeaXtlfoxtZ1EWSV4CE3+J/i5II9y68J0xg==", - "dependencies": { - "Microsoft.Management.Infrastructure.CimCmdlets": "7.4.0", - "Microsoft.PowerShell.Commands.Diagnostics": "7.4.0", - "Microsoft.PowerShell.Commands.Management": "7.4.0", - "Microsoft.PowerShell.Commands.Utility": "7.4.0", - "Microsoft.PowerShell.ConsoleHost": "7.4.0", - "Microsoft.PowerShell.Security": "7.4.0", - "Microsoft.WSMan.Management": "7.4.0", - "Microsoft.Windows.Compatibility": "8.0.0", - "System.Data.SqlClient": "4.8.5", + "requested": "[7.4.1, )", + "resolved": "7.4.1", + "contentHash": "1h0KixYhgGUuRQssGWdqvMCxyHYerw8VPK0XEu2OllUj704yGNTsLb2MjUPV5m35UR/R3JSJL6l9VDx1DdG0fw==", + "dependencies": { + "Microsoft.Extensions.ObjectPool": "5.0.17", + "Microsoft.Management.Infrastructure.CimCmdlets": "7.4.1", + "Microsoft.PowerShell.Commands.Diagnostics": "7.4.1", + "Microsoft.PowerShell.Commands.Management": "7.4.1", + "Microsoft.PowerShell.Commands.Utility": "7.4.1", + "Microsoft.PowerShell.ConsoleHost": "7.4.1", + "Microsoft.PowerShell.Security": "7.4.1", + "Microsoft.WSMan.Management": "7.4.1", + "Microsoft.Windows.Compatibility": "8.0.1", + "System.Data.SqlClient": "4.8.6", "System.IO.Packaging": "8.0.0", - "System.Management.Automation": "7.4.0", + "System.Management.Automation": "7.4.1", "System.Net.Http.WinHttpHandler": "8.0.0", "System.Private.ServiceModel": "4.10.3", "System.ServiceModel.Duplex": "4.10.3", @@ -2847,7 +2848,8 @@ "System.ServiceModel.NetTcp": "4.10.3", "System.ServiceModel.Primitives": "4.10.3", "System.ServiceModel.Security": "4.10.3", - "System.Text.Encodings.Web": "8.0.0" + "System.Text.Encodings.Web": "8.0.0", + "System.Web.Services.Description": "4.10.3" } }, "xunit": { @@ -2884,8 +2886,8 @@ }, "Json.More.Net": { "type": "Transitive", - "resolved": "1.9.0", - "contentHash": "MMjd2dOh32hLbcZg9YyA+7aEH9gu2cMTEAWrQY17in4+aEsPg2NtYTcwgWHJS9Tt2WUx+4iN1mNegR2uiEwsVQ==", + "resolved": "1.9.3", + "contentHash": "BKIsKHXR2Jq+LdLdxPo3L09Lv0ld9xs1fAMvSAe2cf2YOl3at9vw0RrMlhC2ookDi7VtrgHXzc2Et5mVBOAUdw==", "dependencies": { "System.Text.Json": "6.0.2" } @@ -2900,8 +2902,8 @@ }, "JsonSchema.Net": { "type": "Transitive", - "resolved": "5.2.6", - "contentHash": "Zu+Zh6v7GVcqUxA2Ur1SifMMUIvaJULYZijscqiofEg6H6XuGuItXLZanaLp6PU2wtUoLVu4mcSPvyZvCEp5Lg==", + "resolved": "5.2.7", + "contentHash": "8un7Xq2MoKiWNo0HQtf2sPr3764W9NjNELIx3l9d3fIKEjg3tYtrZmxN+CgXKtzku4g52CqYUZuI+o0ue226vw==", "dependencies": { "JetBrains.Annotations": "2021.2.0", "Json.More.Net": "1.9.0", @@ -2938,8 +2940,8 @@ }, "Microsoft.CodeAnalysis.Common": { "type": "Transitive", - "resolved": "4.8.0-2.final", - "contentHash": "sH+5d3H18D8W13Kgusib4usJRWnDcZoJ3nU7MiIlytg7uiLA8DlAQKWEk+x8h8SJOD7CSeqqL9/D6c6ShqidLg==", + "resolved": "4.8.0", + "contentHash": "/jR+e/9aT+BApoQJABlVCKnnggGQbvGh7BKq2/wI1LamxC+LbzhcLj4Vj7gXCofl1n4E521YfF9w0WcASGg/KA==", "dependencies": { "Microsoft.CodeAnalysis.Analyzers": "3.3.4", "System.Collections.Immutable": "7.0.0", @@ -2949,10 +2951,10 @@ }, "Microsoft.CodeAnalysis.CSharp": { "type": "Transitive", - "resolved": "4.8.0-2.final", - "contentHash": "2HS51hRSY7NbyiQAOW/0WQArfqkUhVWqmN+Z/KEeqnm+6fk46HmYesvN/BS5RKa1KswcjYYK92xdne+WdhebiQ==", + "resolved": "4.8.0", + "contentHash": "+3+qfdb/aaGD8PZRCrsdobbzGs1m9u119SkkJt8e/mk3xLJz/udLtS2T6nY27OTXxBBw10HzAbC8Z9w08VyP/g==", "dependencies": { - "Microsoft.CodeAnalysis.Common": "[4.8.0-2.final]" + "Microsoft.CodeAnalysis.Common": "[4.8.0]" } }, "Microsoft.CodeCoverage": { @@ -3028,8 +3030,8 @@ }, "Microsoft.Extensions.ObjectPool": { "type": "Transitive", - "resolved": "5.0.10", - "contentHash": "pp9tbGqIhdEXL6Q1yJl+zevAJSq4BsxqhS1GXzBvEsEz9DDNu9GLNzgUy2xyFc4YjB4m4Ff2YEWTnvQvVYdkvQ==" + "resolved": "5.0.17", + "contentHash": "EkIghF7cRBcogXKrfhopcCRjMs6b19THqSvACV5Oppp0nDA8oNyTLpAsfBQJ1hLgOjHfc5eNKFaFocKdg9nmnA==" }, "Microsoft.Extensions.Options": { "type": "Transitive", @@ -3068,10 +3070,10 @@ }, "Microsoft.Management.Infrastructure.CimCmdlets": { "type": "Transitive", - "resolved": "7.4.0", - "contentHash": "9L+s9tY/gAQPbbyhHUcnvyZMC19pcK3C1hIrCZ7tOGdhLu3VXeskpGb5juzIgMY5efAvRpNFhpM7o4CeuF6fEw==", + "resolved": "7.4.1", + "contentHash": "y8ssJEx6pd+8Nsebupt8dKyyc+kLutacaaZBIRLKfUc84BE0Pv88hs6v8TF1M3c7pk2xkZDmEXMdVDCpWdJ/YQ==", "dependencies": { - "System.Management.Automation": "7.4.0" + "System.Management.Automation": "7.4.1" } }, "Microsoft.Management.Infrastructure.Runtime.Unix": { @@ -3096,47 +3098,49 @@ }, "Microsoft.PowerShell.Commands.Diagnostics": { "type": "Transitive", - "resolved": "7.4.0", - "contentHash": "4YAdmd7PoATLjq/SbKfKYrrf63fXPytcUVS1pe/xOEs2Wfoj66lnXbn1pnlkWMnUwiv3M6EmuqG227meS4iARQ==", + "resolved": "7.4.1", + "contentHash": "TSNoWEO9xQPcQG5TYgi3puJgpwjVbMe5VesgzfZ4+lGWJurgI3y2vanXZSQoyRzlreqEtjBNggS/8TpHOO3nZA==", "dependencies": { - "System.Management.Automation": "7.4.0" + "System.Management.Automation": "7.4.1" } }, "Microsoft.PowerShell.Commands.Management": { "type": "Transitive", - "resolved": "7.4.0", - "contentHash": "couE0QnaJD8fbPrWid6CirSBFitCygvOJ0Hm68mzRp8wpgW6XS8zsJ8YOfggT/2+NEGdRzqdbD2YmFnICe06nA==", + "resolved": "7.4.1", + "contentHash": "LtyD1q6dHsiYeVsWLEbBajP1AKy83uXYNwyvRxU6uxO3q4N3+Ntt0wHQsZmSBoS3jvEvHDJklMxmW/SHoNgSKw==", "dependencies": { - "Microsoft.PowerShell.Security": "7.4.0", + "Microsoft.PowerShell.Security": "7.4.1", "System.ServiceProcess.ServiceController": "8.0.0" } }, "Microsoft.PowerShell.Commands.Utility": { "type": "Transitive", - "resolved": "7.4.0", - "contentHash": "wJIRRORIYhKw7JSfaFoUg1NaT8nsqLAA3ZLcnD6TJUPcOAixZbZyEIVGVMoTTP7IzInx4znyaAV8A4aXtVdfGQ==", + "resolved": "7.4.1", + "contentHash": "P2Fynn9+ooRiAKP5zB2e/fo0hhp/Ss81fqASAHH3mevYZPmnAPNxZMAkvMiayA8Pe6o6GVswXj3vyf5JUtN+mg==", "dependencies": { - "JsonSchema.Net": "5.2.6", + "Json.More.Net": "1.9.3", + "JsonSchema.Net": "5.2.7", "Markdig.Signed": "0.33.0", - "Microsoft.CodeAnalysis.CSharp": "4.8.0-2.final", + "Microsoft.CodeAnalysis.CSharp": "4.8.0", "Microsoft.PowerShell.MarkdownRender": "7.2.1", - "System.Drawing.Common": "8.0.0", - "System.Management.Automation": "7.4.0", + "System.Drawing.Common": "8.0.1", + "System.Management.Automation": "7.4.1", + "System.Text.Json": "6.0.9", "System.Threading.AccessControl": "8.0.0" } }, "Microsoft.PowerShell.ConsoleHost": { "type": "Transitive", - "resolved": "7.4.0", - "contentHash": "dp8FYY7sZHMluy2g7T9Ky75yPnUBfsE0eJdkgy4/oCpTquGqEqInEbDJaMWiU82oRYsUW6gAKOc/lXgz6SVqww==", + "resolved": "7.4.1", + "contentHash": "IXyTckU0QE0+YdHyR7MvcUXPUQAGMQISX0M0594fV1gemkiIgRQ2Q7la3lEjE09GGwxAkDEfWFxE3Z/cDjV77w==", "dependencies": { - "System.Management.Automation": "7.4.0" + "System.Management.Automation": "7.4.1" } }, "Microsoft.PowerShell.CoreCLR.Eventing": { "type": "Transitive", - "resolved": "7.4.0", - "contentHash": "WHcqfVoaP2dZuf93GS7dk117+/CuLNCqiJN8JUhMthtJuA/lvIzblIzUf3yiEppm1QnINvF1wjy4sB1nXUuGqQ==", + "resolved": "7.4.1", + "contentHash": "uyByMNZ3XVUrJAxdHrXM/75vcKdfbs04J5iIZfDA8m9z8TJDViRMjyHNcp8K/ZXyzpT2Lua2d7g+dP47E9wAcg==", "dependencies": { "System.Diagnostics.EventLog": "8.0.0" } @@ -3156,10 +3160,10 @@ }, "Microsoft.PowerShell.Security": { "type": "Transitive", - "resolved": "7.4.0", - "contentHash": "rS0LAR62Qp0Idj7oIlRJEDKg4LjzMtMbcfG/Q7gSHYZ0FvqH8WHc3koWIeh7LQBZEtTuR5Ba8mDBE0CLa1fB7w==", + "resolved": "7.4.1", + "contentHash": "fEMvsyVqDdGFMSLjNpFHdEGo/OGO2WaQlpyqUCKgRknpnpO+MBaWZBGcLu81sidN3iDtTotClzQOQwVXMeNEVQ==", "dependencies": { - "System.Management.Automation": "7.4.0" + "System.Management.Automation": "7.4.1" } }, "Microsoft.Security.Extensions": { @@ -3227,8 +3231,8 @@ }, "Microsoft.Windows.Compatibility": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "4hIR9/0mJe1YWCPJ8ChPf6V+R0SjxF5Uj5RhviRoUk3gri0hQeRrdeGFGjJjAKQRu1OgpF2GnbHIwBTRvZGUuQ==", + "resolved": "8.0.1", + "contentHash": "Gr6QvHy9Y5PK5/ijl+cnCnfLr9HdCVByHtbPR5CxOAPeshURdJ/SNMi1t7qbUMBFCU9zsBlXSE1q/TsOUS0u8A==", "dependencies": { "Microsoft.Win32.Registry.AccessControl": "8.0.0", "Microsoft.Win32.SystemEvents": "8.0.0", @@ -3244,7 +3248,7 @@ "System.DirectoryServices": "8.0.0", "System.DirectoryServices.AccountManagement": "8.0.0", "System.DirectoryServices.Protocols": "8.0.0", - "System.Drawing.Common": "8.0.0", + "System.Drawing.Common": "8.0.1", "System.IO.Packaging": "8.0.0", "System.IO.Ports": "8.0.0", "System.Management": "8.0.0", @@ -3269,18 +3273,18 @@ }, "Microsoft.WSMan.Management": { "type": "Transitive", - "resolved": "7.4.0", - "contentHash": "PeqTiiHECoWxBJG/Gs9bjAmmTYznhD+97aU3NKU6N7pkah6soIFLV3UQZDDnMD6cZp7m8L9vjT3DWFmZly3HSg==", + "resolved": "7.4.1", + "contentHash": "fkngCgs8WB0yk4vB+2Q3r3GQWkWq5y1X6Cn3/Y/UFxmpeSm6UFG10Tl5gi0rD2ZNvQgBP9++VVfxoQgSGqqTNQ==", "dependencies": { - "Microsoft.WSMan.Runtime": "7.4.0", - "System.Management.Automation": "7.4.0", + "Microsoft.WSMan.Runtime": "7.4.1", + "System.Management.Automation": "7.4.1", "System.ServiceProcess.ServiceController": "8.0.0" } }, "Microsoft.WSMan.Runtime": { "type": "Transitive", - "resolved": "7.4.0", - "contentHash": "f4GCYLXzmL5WNBF829uMDLSg2D2r6ok8RhtX8INDUBstjprbsbH2ZwlAUNdkZQIvcTDVZXh7vq+aB8X+LCh+9g==" + "resolved": "7.4.1", + "contentHash": "m7NZmuQ7WHcosiU1Fpu82VV7bfI36p4bvMmhZOp2ECCgPYy3RvxVPf/SFKJQ5y721e3Ruindb5mVXxXQZ05TaA==" }, "Nerdbank.Streams": { "type": "Transitive", @@ -3527,8 +3531,8 @@ }, "System.Data.SqlClient": { "type": "Transitive", - "resolved": "4.8.5", - "contentHash": "fRqxut4lrndPHrXD+ht1XRmCL3obuKldm4XjCRYS9p5f7FSR7shBxAwTkDrpFMsHC9BhNgjjmUtiIjvehn5zkg==", + "resolved": "4.8.6", + "contentHash": "2Ij/LCaTQRyAi5lAv7UUTV9R2FobC8xN9mE0fXBZohum/xLl8IZVmE98Rq5ugQHjCgTBRKqpXRb4ORulRdA6Ig==", "dependencies": { "Microsoft.Win32.Registry": "4.7.0", "System.Security.Principal.Windows": "4.7.0", @@ -3575,8 +3579,8 @@ }, "System.Drawing.Common": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "JkbHJjtI/dWc5dfmEdJlbe3VwgZqCkZRtfuWFh5GOv0f+gGCfBtzMpIVkmdkj2AObO9y+oiOi81UGwH3aBYuqA==", + "resolved": "8.0.1", + "contentHash": "x0rAZECxIGx/YVjN28YRdpqka0+H7YMN9741FUDzipXPDzesd60gef/LI0ZCOcYSDsacTLTHvMAvxHG+TjbNNQ==", "dependencies": { "Microsoft.Win32.SystemEvents": "8.0.0" } @@ -3623,12 +3627,12 @@ }, "System.Management.Automation": { "type": "Transitive", - "resolved": "7.4.0", - "contentHash": "nWsPB750tBAA6+08kcRY9fiV2eiRK6JYmySL4/IllocnA+gCUP2+sHX1enzy4uQ5DHE4SgFNv9yW+7tKX7uqsw==", + "resolved": "7.4.1", + "contentHash": "EYUMyAoYAw4Zt+cxKRMjZxzoa6gI++O4sK+cSg8HUhC1HfrJoMhD1u1Fo5CvlGv1KX3OmoJSyukgkDmRHFLQiw==", "dependencies": { "Microsoft.ApplicationInsights": "2.21.0", "Microsoft.Management.Infrastructure": "3.0.0", - "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.0", + "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.1", "Microsoft.PowerShell.Native": "7.4.0", "Microsoft.Security.Extensions": "1.2.0", "Microsoft.Win32.Registry.AccessControl": "8.0.0", @@ -3637,7 +3641,7 @@ "System.Diagnostics.DiagnosticSource": "8.0.0", "System.DirectoryServices": "8.0.0", "System.Management": "8.0.0", - "System.Security.AccessControl": "6.0.2-mauipre.1.22102.15", + "System.Security.AccessControl": "6.0.0", "System.Security.Cryptography.Pkcs": "8.0.0", "System.Security.Permissions": "8.0.0", "System.Text.Encoding.CodePages": "8.0.0" @@ -3713,8 +3717,8 @@ }, "System.Security.AccessControl": { "type": "Transitive", - "resolved": "6.0.2-mauipre.1.22102.15", - "contentHash": "ny0SrGGm/O1Q889Zzx1tLP8X0UjkOHjDPN0omy3onMwU1qPrPq90kWvMY8gmh6eHtRkRAGzlJlEer64ii7GMrg==" + "resolved": "6.0.0", + "contentHash": "AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ==" }, "System.Security.Cryptography.Pkcs": { "type": "Transitive", @@ -3832,8 +3836,8 @@ }, "System.Text.Json": { "type": "Transitive", - "resolved": "6.0.2", - "contentHash": "0nE2gwXLn3PTBOPwORLqwuYvWB+Beomt9ZBX+6LmogMNKUvfD1SoDb/ycB1vBntT94rGaB/SvxEyeLu14H6aEg==", + "resolved": "6.0.9", + "contentHash": "2j16oUgtIzl7Xtk7demG0i/v5aU/ZvULcAnJvPb63U3ZhXJ494UYcxuEj5Fs49i3XDrk5kU/8I+6l9zRCw3cJw==", "dependencies": { "System.Runtime.CompilerServices.Unsafe": "6.0.0", "System.Text.Encodings.Web": "6.0.0" @@ -3856,8 +3860,8 @@ }, "System.Web.Services.Description": { "type": "Transitive", - "resolved": "4.10.0", - "contentHash": "Dwr64geRujAwnI+wPMJP1rf4pFaYRITrAS7EIGd0GVMwQ8OayM6ypwmnAPzQG4YTyN84w6KD5Rv8LJywYK+vUA==" + "resolved": "4.10.3", + "contentHash": "ORCkTkUo9f1o4ACG+H6SV+0XSxVZ461w3cHzYxEU41y6aKWp1CeNTMYbtdxMw1we6c6t4Hqq15PdcLVcdqno/g==" }, "System.Windows.Extensions": { "type": "Transitive", @@ -3930,9 +3934,9 @@ "Microsoft.PowerShell.EditorServices.Test.Shared": { "type": "Project", "dependencies": { - "Microsoft.PowerShell.EditorServices": "[3.17.0, )" + "Microsoft.PowerShell.EditorServices": "[3.19.0, )" } } } } -} \ No newline at end of file +} From 8fe194285c1914c74c76db3e5f2a4c7be33aa7da Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Apr 2024 20:38:19 +0000 Subject: [PATCH 07/88] Bump the xunit group with 1 update Bumps the xunit group with 1 update: [xunit](https://github.com/xunit/xunit). Updates `xunit` from 2.6.6 to 2.7.0 - [Commits](https://github.com/xunit/xunit/compare/2.6.6...2.7.0) --- updated-dependencies: - dependency-name: xunit dependency-type: direct:production update-type: version-update:semver-minor dependency-group: xunit ... Signed-off-by: dependabot[bot] --- .../PowerShellEditorServices.Test.E2E.csproj | 2 +- .../packages.lock.json | 38 ++--- .../PowerShellEditorServices.Test.csproj | 2 +- .../packages.lock.json | 154 +++++++++--------- 4 files changed, 98 insertions(+), 98 deletions(-) diff --git a/test/PowerShellEditorServices.Test.E2E/PowerShellEditorServices.Test.E2E.csproj b/test/PowerShellEditorServices.Test.E2E/PowerShellEditorServices.Test.E2E.csproj index 77eacbd87..ec30df02e 100644 --- a/test/PowerShellEditorServices.Test.E2E/PowerShellEditorServices.Test.E2E.csproj +++ b/test/PowerShellEditorServices.Test.E2E/PowerShellEditorServices.Test.E2E.csproj @@ -9,7 +9,7 @@ - + diff --git a/test/PowerShellEditorServices.Test.E2E/packages.lock.json b/test/PowerShellEditorServices.Test.E2E/packages.lock.json index 59dfb28f8..91fccbf9e 100644 --- a/test/PowerShellEditorServices.Test.E2E/packages.lock.json +++ b/test/PowerShellEditorServices.Test.E2E/packages.lock.json @@ -41,13 +41,13 @@ }, "xunit": { "type": "Direct", - "requested": "[2.6.6, )", - "resolved": "2.6.6", - "contentHash": "MAbOOMtZIKyn2lrAmMlvhX0BhDOX/smyrTB+8WTXnSKkrmTGBS2fm8g1PZtHBPj91Dc5DJA7fY+/81TJ/yUFZw==", + "requested": "[2.7.0, )", + "resolved": "2.7.0", + "contentHash": "KcCI5zxh8zbUfQTeErc4oT7YokViVND2V0p4vDJ2VD4lhF9V5qCYMMDNixme7FdwYy3SwPHF+2xC2Dq4Z9GSlA==", "dependencies": { - "xunit.analyzers": "1.10.0", - "xunit.assert": "2.6.6", - "xunit.core": "[2.6.6]" + "xunit.analyzers": "1.11.0", + "xunit.assert": "2.7.0", + "xunit.core": "[2.7.0]" } }, "xunit.runner.visualstudio": { @@ -444,37 +444,37 @@ }, "xunit.analyzers": { "type": "Transitive", - "resolved": "1.10.0", - "contentHash": "Lw8CiDy5NaAWcO6keqD7iZHYUTIuCOcoFrUHw5Sv84ITZ9gFeDybdkVdH0Y2maSlP9fUjtENyiykT44zwFQIHA==" + "resolved": "1.11.0", + "contentHash": "SCv+Ihxv+fCqotGeM8sVwLhw8nzAJ2aFRN5lcoKn9QtGdbVJ79JqDc+4u8/Ddnp2udxtmv+xYFWkHNlb/sk01w==" }, "xunit.assert": { "type": "Transitive", - "resolved": "2.6.6", - "contentHash": "74Cm9lAZOk5TKCz2MvCBCByKsS23yryOKDIMxH3XRDHXmfGM02jKZWzRA7g4mGB41GnBnv/pcWP3vUYkrCtEcg==" + "resolved": "2.7.0", + "contentHash": "CCTs3bUhmIS4tDwK6Cn/IiabG3RhYzdf65eIkO7u9/grKoN9MrN780LzVED3E8v+vwmmj7b5TW3/GFuZHPAzWA==" }, "xunit.core": { "type": "Transitive", - "resolved": "2.6.6", - "contentHash": "tqi7RfaNBqM7t8zx6QHryuBPzmotsZXKGaWnopQG2Ez5UV7JoWuyoNdT6gLpDIcKdGYey6YTXJdSr9IXDMKwjg==", + "resolved": "2.7.0", + "contentHash": "98tzqYAbtc/p/2Ba455XTNbD12Qoo8kPehjC4oDT46CAsLli5JOCU9hFF2MV3HHWMw/Y3yFUV2Vcukplbs6kuA==", "dependencies": { - "xunit.extensibility.core": "[2.6.6]", - "xunit.extensibility.execution": "[2.6.6]" + "xunit.extensibility.core": "[2.7.0]", + "xunit.extensibility.execution": "[2.7.0]" } }, "xunit.extensibility.core": { "type": "Transitive", - "resolved": "2.6.6", - "contentHash": "ty6VKByzbx4Toj4/VGJLEnlmOawqZiMv0in/tLju+ftA+lbWuAWDERM+E52Jfhj4ZYHrAYVa14KHK5T+dq0XxA==", + "resolved": "2.7.0", + "contentHash": "JLnx4PI0vn1Xr1Ust6ydrp2t/ktm2dyGPAVoDJV5gQuvBMSbd2K7WGzODa2ttiz030CeQ8nbsXl05+cvf7QNyA==", "dependencies": { "xunit.abstractions": "2.0.3" } }, "xunit.extensibility.execution": { "type": "Transitive", - "resolved": "2.6.6", - "contentHash": "UDjIVGj2TepVKN3n32/qXIdb3U6STwTb9L6YEwoQO2A8OxiJS5QAVv2l1aT6tDwwv/9WBmm8Khh/LyHALipcng==", + "resolved": "2.7.0", + "contentHash": "bjY+crT1jOyxKagFjCMdEVzoenO2v66ru8+CK/0UaXvyG4U9Q3UTieJkbQXbi7/1yZIK1sGh01l5/jh2CwLJtQ==", "dependencies": { - "xunit.extensibility.core": "[2.6.6]" + "xunit.extensibility.core": "[2.7.0]" } }, "Microsoft.PowerShell.EditorServices": { diff --git a/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj b/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj index f77593613..548f36c3e 100644 --- a/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj +++ b/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj @@ -38,7 +38,7 @@ - + diff --git a/test/PowerShellEditorServices.Test/packages.lock.json b/test/PowerShellEditorServices.Test/packages.lock.json index 708461b71..35e73f2b9 100644 --- a/test/PowerShellEditorServices.Test/packages.lock.json +++ b/test/PowerShellEditorServices.Test/packages.lock.json @@ -28,13 +28,13 @@ }, "xunit": { "type": "Direct", - "requested": "[2.6.6, )", - "resolved": "2.6.6", - "contentHash": "MAbOOMtZIKyn2lrAmMlvhX0BhDOX/smyrTB+8WTXnSKkrmTGBS2fm8g1PZtHBPj91Dc5DJA7fY+/81TJ/yUFZw==", + "requested": "[2.7.0, )", + "resolved": "2.7.0", + "contentHash": "KcCI5zxh8zbUfQTeErc4oT7YokViVND2V0p4vDJ2VD4lhF9V5qCYMMDNixme7FdwYy3SwPHF+2xC2Dq4Z9GSlA==", "dependencies": { - "xunit.analyzers": "1.10.0", - "xunit.assert": "2.6.6", - "xunit.core": "[2.6.6]" + "xunit.analyzers": "1.11.0", + "xunit.assert": "2.7.0", + "xunit.core": "[2.7.0]" } }, "xunit.runner.visualstudio": { @@ -496,37 +496,37 @@ }, "xunit.analyzers": { "type": "Transitive", - "resolved": "1.10.0", - "contentHash": "Lw8CiDy5NaAWcO6keqD7iZHYUTIuCOcoFrUHw5Sv84ITZ9gFeDybdkVdH0Y2maSlP9fUjtENyiykT44zwFQIHA==" + "resolved": "1.11.0", + "contentHash": "SCv+Ihxv+fCqotGeM8sVwLhw8nzAJ2aFRN5lcoKn9QtGdbVJ79JqDc+4u8/Ddnp2udxtmv+xYFWkHNlb/sk01w==" }, "xunit.assert": { "type": "Transitive", - "resolved": "2.6.6", - "contentHash": "74Cm9lAZOk5TKCz2MvCBCByKsS23yryOKDIMxH3XRDHXmfGM02jKZWzRA7g4mGB41GnBnv/pcWP3vUYkrCtEcg==" + "resolved": "2.7.0", + "contentHash": "CCTs3bUhmIS4tDwK6Cn/IiabG3RhYzdf65eIkO7u9/grKoN9MrN780LzVED3E8v+vwmmj7b5TW3/GFuZHPAzWA==" }, "xunit.core": { "type": "Transitive", - "resolved": "2.6.6", - "contentHash": "tqi7RfaNBqM7t8zx6QHryuBPzmotsZXKGaWnopQG2Ez5UV7JoWuyoNdT6gLpDIcKdGYey6YTXJdSr9IXDMKwjg==", + "resolved": "2.7.0", + "contentHash": "98tzqYAbtc/p/2Ba455XTNbD12Qoo8kPehjC4oDT46CAsLli5JOCU9hFF2MV3HHWMw/Y3yFUV2Vcukplbs6kuA==", "dependencies": { - "xunit.extensibility.core": "[2.6.6]", - "xunit.extensibility.execution": "[2.6.6]" + "xunit.extensibility.core": "[2.7.0]", + "xunit.extensibility.execution": "[2.7.0]" } }, "xunit.extensibility.core": { "type": "Transitive", - "resolved": "2.6.6", - "contentHash": "ty6VKByzbx4Toj4/VGJLEnlmOawqZiMv0in/tLju+ftA+lbWuAWDERM+E52Jfhj4ZYHrAYVa14KHK5T+dq0XxA==", + "resolved": "2.7.0", + "contentHash": "JLnx4PI0vn1Xr1Ust6ydrp2t/ktm2dyGPAVoDJV5gQuvBMSbd2K7WGzODa2ttiz030CeQ8nbsXl05+cvf7QNyA==", "dependencies": { "xunit.abstractions": "2.0.3" } }, "xunit.extensibility.execution": { "type": "Transitive", - "resolved": "2.6.6", - "contentHash": "UDjIVGj2TepVKN3n32/qXIdb3U6STwTb9L6YEwoQO2A8OxiJS5QAVv2l1aT6tDwwv/9WBmm8Khh/LyHALipcng==", + "resolved": "2.7.0", + "contentHash": "bjY+crT1jOyxKagFjCMdEVzoenO2v66ru8+CK/0UaXvyG4U9Q3UTieJkbQXbi7/1yZIK1sGh01l5/jh2CwLJtQ==", "dependencies": { - "xunit.extensibility.core": "[2.6.6]" + "xunit.extensibility.core": "[2.7.0]" } }, "Microsoft.PowerShell.EditorServices": { @@ -596,13 +596,13 @@ }, "xunit": { "type": "Direct", - "requested": "[2.6.6, )", - "resolved": "2.6.6", - "contentHash": "MAbOOMtZIKyn2lrAmMlvhX0BhDOX/smyrTB+8WTXnSKkrmTGBS2fm8g1PZtHBPj91Dc5DJA7fY+/81TJ/yUFZw==", + "requested": "[2.7.0, )", + "resolved": "2.7.0", + "contentHash": "KcCI5zxh8zbUfQTeErc4oT7YokViVND2V0p4vDJ2VD4lhF9V5qCYMMDNixme7FdwYy3SwPHF+2xC2Dq4Z9GSlA==", "dependencies": { - "xunit.analyzers": "1.10.0", - "xunit.assert": "2.6.6", - "xunit.core": "[2.6.6]" + "xunit.analyzers": "1.11.0", + "xunit.assert": "2.7.0", + "xunit.core": "[2.7.0]" } }, "xunit.runner.visualstudio": { @@ -1631,37 +1631,37 @@ }, "xunit.analyzers": { "type": "Transitive", - "resolved": "1.10.0", - "contentHash": "Lw8CiDy5NaAWcO6keqD7iZHYUTIuCOcoFrUHw5Sv84ITZ9gFeDybdkVdH0Y2maSlP9fUjtENyiykT44zwFQIHA==" + "resolved": "1.11.0", + "contentHash": "SCv+Ihxv+fCqotGeM8sVwLhw8nzAJ2aFRN5lcoKn9QtGdbVJ79JqDc+4u8/Ddnp2udxtmv+xYFWkHNlb/sk01w==" }, "xunit.assert": { "type": "Transitive", - "resolved": "2.6.6", - "contentHash": "74Cm9lAZOk5TKCz2MvCBCByKsS23yryOKDIMxH3XRDHXmfGM02jKZWzRA7g4mGB41GnBnv/pcWP3vUYkrCtEcg==" + "resolved": "2.7.0", + "contentHash": "CCTs3bUhmIS4tDwK6Cn/IiabG3RhYzdf65eIkO7u9/grKoN9MrN780LzVED3E8v+vwmmj7b5TW3/GFuZHPAzWA==" }, "xunit.core": { "type": "Transitive", - "resolved": "2.6.6", - "contentHash": "tqi7RfaNBqM7t8zx6QHryuBPzmotsZXKGaWnopQG2Ez5UV7JoWuyoNdT6gLpDIcKdGYey6YTXJdSr9IXDMKwjg==", + "resolved": "2.7.0", + "contentHash": "98tzqYAbtc/p/2Ba455XTNbD12Qoo8kPehjC4oDT46CAsLli5JOCU9hFF2MV3HHWMw/Y3yFUV2Vcukplbs6kuA==", "dependencies": { - "xunit.extensibility.core": "[2.6.6]", - "xunit.extensibility.execution": "[2.6.6]" + "xunit.extensibility.core": "[2.7.0]", + "xunit.extensibility.execution": "[2.7.0]" } }, "xunit.extensibility.core": { "type": "Transitive", - "resolved": "2.6.6", - "contentHash": "ty6VKByzbx4Toj4/VGJLEnlmOawqZiMv0in/tLju+ftA+lbWuAWDERM+E52Jfhj4ZYHrAYVa14KHK5T+dq0XxA==", + "resolved": "2.7.0", + "contentHash": "JLnx4PI0vn1Xr1Ust6ydrp2t/ktm2dyGPAVoDJV5gQuvBMSbd2K7WGzODa2ttiz030CeQ8nbsXl05+cvf7QNyA==", "dependencies": { "xunit.abstractions": "2.0.3" } }, "xunit.extensibility.execution": { "type": "Transitive", - "resolved": "2.6.6", - "contentHash": "UDjIVGj2TepVKN3n32/qXIdb3U6STwTb9L6YEwoQO2A8OxiJS5QAVv2l1aT6tDwwv/9WBmm8Khh/LyHALipcng==", + "resolved": "2.7.0", + "contentHash": "bjY+crT1jOyxKagFjCMdEVzoenO2v66ru8+CK/0UaXvyG4U9Q3UTieJkbQXbi7/1yZIK1sGh01l5/jh2CwLJtQ==", "dependencies": { - "xunit.extensibility.core": "[2.6.6]" + "xunit.extensibility.core": "[2.7.0]" } }, "Microsoft.PowerShell.EditorServices": { @@ -1735,13 +1735,13 @@ }, "xunit": { "type": "Direct", - "requested": "[2.6.6, )", - "resolved": "2.6.6", - "contentHash": "MAbOOMtZIKyn2lrAmMlvhX0BhDOX/smyrTB+8WTXnSKkrmTGBS2fm8g1PZtHBPj91Dc5DJA7fY+/81TJ/yUFZw==", + "requested": "[2.7.0, )", + "resolved": "2.7.0", + "contentHash": "KcCI5zxh8zbUfQTeErc4oT7YokViVND2V0p4vDJ2VD4lhF9V5qCYMMDNixme7FdwYy3SwPHF+2xC2Dq4Z9GSlA==", "dependencies": { - "xunit.analyzers": "1.10.0", - "xunit.assert": "2.6.6", - "xunit.core": "[2.6.6]" + "xunit.analyzers": "1.11.0", + "xunit.assert": "2.7.0", + "xunit.core": "[2.7.0]" } }, "xunit.runner.visualstudio": { @@ -2754,37 +2754,37 @@ }, "xunit.analyzers": { "type": "Transitive", - "resolved": "1.10.0", - "contentHash": "Lw8CiDy5NaAWcO6keqD7iZHYUTIuCOcoFrUHw5Sv84ITZ9gFeDybdkVdH0Y2maSlP9fUjtENyiykT44zwFQIHA==" + "resolved": "1.11.0", + "contentHash": "SCv+Ihxv+fCqotGeM8sVwLhw8nzAJ2aFRN5lcoKn9QtGdbVJ79JqDc+4u8/Ddnp2udxtmv+xYFWkHNlb/sk01w==" }, "xunit.assert": { "type": "Transitive", - "resolved": "2.6.6", - "contentHash": "74Cm9lAZOk5TKCz2MvCBCByKsS23yryOKDIMxH3XRDHXmfGM02jKZWzRA7g4mGB41GnBnv/pcWP3vUYkrCtEcg==" + "resolved": "2.7.0", + "contentHash": "CCTs3bUhmIS4tDwK6Cn/IiabG3RhYzdf65eIkO7u9/grKoN9MrN780LzVED3E8v+vwmmj7b5TW3/GFuZHPAzWA==" }, "xunit.core": { "type": "Transitive", - "resolved": "2.6.6", - "contentHash": "tqi7RfaNBqM7t8zx6QHryuBPzmotsZXKGaWnopQG2Ez5UV7JoWuyoNdT6gLpDIcKdGYey6YTXJdSr9IXDMKwjg==", + "resolved": "2.7.0", + "contentHash": "98tzqYAbtc/p/2Ba455XTNbD12Qoo8kPehjC4oDT46CAsLli5JOCU9hFF2MV3HHWMw/Y3yFUV2Vcukplbs6kuA==", "dependencies": { - "xunit.extensibility.core": "[2.6.6]", - "xunit.extensibility.execution": "[2.6.6]" + "xunit.extensibility.core": "[2.7.0]", + "xunit.extensibility.execution": "[2.7.0]" } }, "xunit.extensibility.core": { "type": "Transitive", - "resolved": "2.6.6", - "contentHash": "ty6VKByzbx4Toj4/VGJLEnlmOawqZiMv0in/tLju+ftA+lbWuAWDERM+E52Jfhj4ZYHrAYVa14KHK5T+dq0XxA==", + "resolved": "2.7.0", + "contentHash": "JLnx4PI0vn1Xr1Ust6ydrp2t/ktm2dyGPAVoDJV5gQuvBMSbd2K7WGzODa2ttiz030CeQ8nbsXl05+cvf7QNyA==", "dependencies": { "xunit.abstractions": "2.0.3" } }, "xunit.extensibility.execution": { "type": "Transitive", - "resolved": "2.6.6", - "contentHash": "UDjIVGj2TepVKN3n32/qXIdb3U6STwTb9L6YEwoQO2A8OxiJS5QAVv2l1aT6tDwwv/9WBmm8Khh/LyHALipcng==", + "resolved": "2.7.0", + "contentHash": "bjY+crT1jOyxKagFjCMdEVzoenO2v66ru8+CK/0UaXvyG4U9Q3UTieJkbQXbi7/1yZIK1sGh01l5/jh2CwLJtQ==", "dependencies": { - "xunit.extensibility.core": "[2.6.6]" + "xunit.extensibility.core": "[2.7.0]" } }, "Microsoft.PowerShell.EditorServices": { @@ -2854,13 +2854,13 @@ }, "xunit": { "type": "Direct", - "requested": "[2.6.6, )", - "resolved": "2.6.6", - "contentHash": "MAbOOMtZIKyn2lrAmMlvhX0BhDOX/smyrTB+8WTXnSKkrmTGBS2fm8g1PZtHBPj91Dc5DJA7fY+/81TJ/yUFZw==", + "requested": "[2.7.0, )", + "resolved": "2.7.0", + "contentHash": "KcCI5zxh8zbUfQTeErc4oT7YokViVND2V0p4vDJ2VD4lhF9V5qCYMMDNixme7FdwYy3SwPHF+2xC2Dq4Z9GSlA==", "dependencies": { - "xunit.analyzers": "1.10.0", - "xunit.assert": "2.6.6", - "xunit.core": "[2.6.6]" + "xunit.analyzers": "1.11.0", + "xunit.assert": "2.7.0", + "xunit.core": "[2.7.0]" } }, "xunit.runner.visualstudio": { @@ -3880,37 +3880,37 @@ }, "xunit.analyzers": { "type": "Transitive", - "resolved": "1.10.0", - "contentHash": "Lw8CiDy5NaAWcO6keqD7iZHYUTIuCOcoFrUHw5Sv84ITZ9gFeDybdkVdH0Y2maSlP9fUjtENyiykT44zwFQIHA==" + "resolved": "1.11.0", + "contentHash": "SCv+Ihxv+fCqotGeM8sVwLhw8nzAJ2aFRN5lcoKn9QtGdbVJ79JqDc+4u8/Ddnp2udxtmv+xYFWkHNlb/sk01w==" }, "xunit.assert": { "type": "Transitive", - "resolved": "2.6.6", - "contentHash": "74Cm9lAZOk5TKCz2MvCBCByKsS23yryOKDIMxH3XRDHXmfGM02jKZWzRA7g4mGB41GnBnv/pcWP3vUYkrCtEcg==" + "resolved": "2.7.0", + "contentHash": "CCTs3bUhmIS4tDwK6Cn/IiabG3RhYzdf65eIkO7u9/grKoN9MrN780LzVED3E8v+vwmmj7b5TW3/GFuZHPAzWA==" }, "xunit.core": { "type": "Transitive", - "resolved": "2.6.6", - "contentHash": "tqi7RfaNBqM7t8zx6QHryuBPzmotsZXKGaWnopQG2Ez5UV7JoWuyoNdT6gLpDIcKdGYey6YTXJdSr9IXDMKwjg==", + "resolved": "2.7.0", + "contentHash": "98tzqYAbtc/p/2Ba455XTNbD12Qoo8kPehjC4oDT46CAsLli5JOCU9hFF2MV3HHWMw/Y3yFUV2Vcukplbs6kuA==", "dependencies": { - "xunit.extensibility.core": "[2.6.6]", - "xunit.extensibility.execution": "[2.6.6]" + "xunit.extensibility.core": "[2.7.0]", + "xunit.extensibility.execution": "[2.7.0]" } }, "xunit.extensibility.core": { "type": "Transitive", - "resolved": "2.6.6", - "contentHash": "ty6VKByzbx4Toj4/VGJLEnlmOawqZiMv0in/tLju+ftA+lbWuAWDERM+E52Jfhj4ZYHrAYVa14KHK5T+dq0XxA==", + "resolved": "2.7.0", + "contentHash": "JLnx4PI0vn1Xr1Ust6ydrp2t/ktm2dyGPAVoDJV5gQuvBMSbd2K7WGzODa2ttiz030CeQ8nbsXl05+cvf7QNyA==", "dependencies": { "xunit.abstractions": "2.0.3" } }, "xunit.extensibility.execution": { "type": "Transitive", - "resolved": "2.6.6", - "contentHash": "UDjIVGj2TepVKN3n32/qXIdb3U6STwTb9L6YEwoQO2A8OxiJS5QAVv2l1aT6tDwwv/9WBmm8Khh/LyHALipcng==", + "resolved": "2.7.0", + "contentHash": "bjY+crT1jOyxKagFjCMdEVzoenO2v66ru8+CK/0UaXvyG4U9Q3UTieJkbQXbi7/1yZIK1sGh01l5/jh2CwLJtQ==", "dependencies": { - "xunit.extensibility.core": "[2.6.6]" + "xunit.extensibility.core": "[2.7.0]" } }, "Microsoft.PowerShell.EditorServices": { @@ -3939,4 +3939,4 @@ } } } -} +} \ No newline at end of file From 4aa6db61e5e34eb3da5e06e9e41e8050457e1b87 Mon Sep 17 00:00:00 2001 From: Brad Wilson Date: Tue, 9 Apr 2024 14:29:47 -0700 Subject: [PATCH 08/88] Fix deadlocks in tests when there's no sync context Patch provided in https://github.com/xunit/xunit/issues/2912 --- .../Debugging/DebugServiceTests.cs | 11 ++++----- .../Extensions/ExtensionCommandTests.cs | 20 +++++----------- .../Language/CompletionHandlerTests.cs | 13 ++++------ .../Language/SymbolsServiceTests.cs | 12 ++++------ .../Session/PsesInternalHostTests.cs | 24 +++++++------------ 5 files changed, 28 insertions(+), 52 deletions(-) diff --git a/test/PowerShellEditorServices.Test/Debugging/DebugServiceTests.cs b/test/PowerShellEditorServices.Test/Debugging/DebugServiceTests.cs index 30b020c30..e1311f1a3 100644 --- a/test/PowerShellEditorServices.Test/Debugging/DebugServiceTests.cs +++ b/test/PowerShellEditorServices.Test/Debugging/DebugServiceTests.cs @@ -33,7 +33,7 @@ internal class TestReadLine : IReadLine } [Trait("Category", "DebugService")] - public class DebugServiceTests : IDisposable + public class DebugServiceTests : IAsyncLifetime { private readonly PsesInternalHost psesHost; private readonly BreakpointService breakpointService; @@ -76,14 +76,13 @@ public DebugServiceTests() variableScriptFile = GetDebugScript("VariableTest.ps1"); } - public void Dispose() + public Task InitializeAsync() => Task.CompletedTask; + + public async Task DisposeAsync() { debugService.Abort(); debuggerStoppedQueue.Dispose(); -#pragma warning disable VSTHRD002 - psesHost.StopAsync().Wait(); -#pragma warning restore VSTHRD002 - GC.SuppressFinalize(this); + await Task.Run(psesHost.StopAsync); } /// diff --git a/test/PowerShellEditorServices.Test/Extensions/ExtensionCommandTests.cs b/test/PowerShellEditorServices.Test/Extensions/ExtensionCommandTests.cs index 190ee5aae..c4958ce8e 100644 --- a/test/PowerShellEditorServices.Test/Extensions/ExtensionCommandTests.cs +++ b/test/PowerShellEditorServices.Test/Extensions/ExtensionCommandTests.cs @@ -20,13 +20,13 @@ namespace PowerShellEditorServices.Test.Extensions { [Trait("Category", "Extensions")] - public class ExtensionCommandTests : IDisposable + public class ExtensionCommandTests : IAsyncLifetime { - private readonly PsesInternalHost psesHost; + private PsesInternalHost psesHost; - private readonly ExtensionCommandService extensionCommandService; + private ExtensionCommandService extensionCommandService; - public ExtensionCommandTests() + public async Task InitializeAsync() { psesHost = PsesHostFactory.Create(NullLoggerFactory.Instance); ExtensionService extensionService = new( @@ -34,19 +34,11 @@ public ExtensionCommandTests() serviceProvider: null, editorOperations: null, executionService: psesHost); -#pragma warning disable VSTHRD002 - extensionService.InitializeAsync().Wait(); -#pragma warning restore VSTHRD002 + await extensionService.InitializeAsync(); extensionCommandService = new(extensionService); } - public void Dispose() - { -#pragma warning disable VSTHRD002 - psesHost.StopAsync().Wait(); -#pragma warning restore VSTHRD002 - GC.SuppressFinalize(this); - } + public async Task DisposeAsync() => await psesHost.StopAsync(); [Fact] public async Task CanRegisterAndInvokeCommandWithCmdletName() diff --git a/test/PowerShellEditorServices.Test/Language/CompletionHandlerTests.cs b/test/PowerShellEditorServices.Test/Language/CompletionHandlerTests.cs index fae0f8104..3406cbb41 100644 --- a/test/PowerShellEditorServices.Test/Language/CompletionHandlerTests.cs +++ b/test/PowerShellEditorServices.Test/Language/CompletionHandlerTests.cs @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -using System; using System.Collections.Generic; using System.Linq; using System.Threading; @@ -21,7 +20,7 @@ namespace PowerShellEditorServices.Test.Language { [Trait("Category", "Completions")] - public class CompletionHandlerTests : IDisposable + public class CompletionHandlerTests : IAsyncLifetime { private readonly PsesInternalHost psesHost; private readonly WorkspaceService workspace; @@ -34,13 +33,9 @@ public CompletionHandlerTests() completionHandler = new PsesCompletionHandler(NullLoggerFactory.Instance, psesHost, psesHost, workspace); } - public void Dispose() - { -#pragma warning disable VSTHRD002 - psesHost.StopAsync().Wait(); -#pragma warning restore VSTHRD002 - GC.SuppressFinalize(this); - } + public Task InitializeAsync() => Task.CompletedTask; + + public async Task DisposeAsync() => await Task.Run(psesHost.StopAsync); private ScriptFile GetScriptFile(ScriptRegion scriptRegion) => workspace.GetFile(TestUtilities.GetSharedPath(scriptRegion.File)); diff --git a/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs b/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs index f078d8d42..52c217299 100644 --- a/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs +++ b/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. -using System; using System.Collections.Generic; using System.Linq; using System.Management.Automation; @@ -30,7 +29,7 @@ namespace PowerShellEditorServices.Test.Language { [Trait("Category", "Symbols")] - public class SymbolsServiceTests : IDisposable + public class SymbolsServiceTests : IAsyncLifetime { private readonly PsesInternalHost psesHost; private readonly WorkspaceService workspace; @@ -53,14 +52,13 @@ public SymbolsServiceTests() new ConfigurationService()); } - public void Dispose() + public Task InitializeAsync() => Task.CompletedTask; + + public async Task DisposeAsync() { -#pragma warning disable VSTHRD002 - psesHost.StopAsync().GetAwaiter().GetResult(); -#pragma warning restore VSTHRD002 + psesHost.StopAsync(); CommandHelpers.s_cmdletToAliasCache.Clear(); CommandHelpers.s_aliasToCmdletCache.Clear(); - GC.SuppressFinalize(this); } private static void AssertIsRegion( diff --git a/test/PowerShellEditorServices.Test/Session/PsesInternalHostTests.cs b/test/PowerShellEditorServices.Test/Session/PsesInternalHostTests.cs index d489704f4..eb316be89 100644 --- a/test/PowerShellEditorServices.Test/Session/PsesInternalHostTests.cs +++ b/test/PowerShellEditorServices.Test/Session/PsesInternalHostTests.cs @@ -20,19 +20,15 @@ namespace PowerShellEditorServices.Test.Session using System.Management.Automation.Runspaces; [Trait("Category", "PsesInternalHost")] - public class PsesInternalHostTests : IDisposable + public class PsesInternalHostTests : IAsyncLifetime { private readonly PsesInternalHost psesHost; public PsesInternalHostTests() => psesHost = PsesHostFactory.Create(NullLoggerFactory.Instance); - public void Dispose() - { -#pragma warning disable VSTHRD002 - psesHost.StopAsync().Wait(); -#pragma warning restore VSTHRD002 - GC.SuppressFinalize(this); - } + public Task InitializeAsync() => Task.CompletedTask; + + public async Task DisposeAsync() => await psesHost.StopAsync(); [Fact] public async Task CanExecutePSCommand() @@ -238,19 +234,15 @@ public async Task CanHandleBadInitialWorkingDirectory(string path) } [Trait("Category", "PsesInternalHost")] - public class PsesInternalHostWithProfileTests : IDisposable + public class PsesInternalHostWithProfileTests : IAsyncLifetime { private readonly PsesInternalHost psesHost; public PsesInternalHostWithProfileTests() => psesHost = PsesHostFactory.Create(NullLoggerFactory.Instance, loadProfiles: true); - public void Dispose() - { -#pragma warning disable VSTHRD002 - psesHost.StopAsync().Wait(); -#pragma warning restore VSTHRD002 - GC.SuppressFinalize(this); - } + public Task InitializeAsync() => Task.CompletedTask; + + public async Task DisposeAsync() => await psesHost.StopAsync(); [Fact] public async Task CanResolveAndLoadProfilesForHostId() From 6ef2d0b13fecb818618749213b1c9120022d4ebf Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Wed, 10 Apr 2024 11:11:59 -0700 Subject: [PATCH 09/88] Remove last instance of `GetAwaiter()` And so stop ignoring `VSTHRD002`. --- .../Debugging/DebugServiceTests.cs | 19 +++++++++---------- .../Extensions/ExtensionCommandTests.cs | 2 +- .../Language/CompletionHandlerTests.cs | 12 +++++------- .../Language/SymbolsServiceTests.cs | 12 +++++------- .../PsesHostFactory.cs | 7 +++---- .../Session/PsesInternalHostTests.cs | 19 +++++++------------ 6 files changed, 30 insertions(+), 41 deletions(-) diff --git a/test/PowerShellEditorServices.Test/Debugging/DebugServiceTests.cs b/test/PowerShellEditorServices.Test/Debugging/DebugServiceTests.cs index e1311f1a3..4b61fd327 100644 --- a/test/PowerShellEditorServices.Test/Debugging/DebugServiceTests.cs +++ b/test/PowerShellEditorServices.Test/Debugging/DebugServiceTests.cs @@ -35,19 +35,19 @@ internal class TestReadLine : IReadLine [Trait("Category", "DebugService")] public class DebugServiceTests : IAsyncLifetime { - private readonly PsesInternalHost psesHost; - private readonly BreakpointService breakpointService; - private readonly DebugService debugService; + private PsesInternalHost psesHost; + private BreakpointService breakpointService; + private DebugService debugService; private readonly BlockingCollection debuggerStoppedQueue = new(); - private readonly WorkspaceService workspace; - private readonly ScriptFile debugScriptFile; - private readonly ScriptFile oddPathScriptFile; - private readonly ScriptFile variableScriptFile; + private WorkspaceService workspace; + private ScriptFile debugScriptFile; + private ScriptFile oddPathScriptFile; + private ScriptFile variableScriptFile; private readonly TestReadLine testReadLine = new(); - public DebugServiceTests() + public async Task InitializeAsync() { - psesHost = PsesHostFactory.Create(NullLoggerFactory.Instance); + psesHost = await PsesHostFactory.Create(NullLoggerFactory.Instance); // This is required for remote debugging, but we call it here to end up in the same // state as the usual startup path. psesHost.DebugContext.EnableDebugMode(); @@ -76,7 +76,6 @@ public DebugServiceTests() variableScriptFile = GetDebugScript("VariableTest.ps1"); } - public Task InitializeAsync() => Task.CompletedTask; public async Task DisposeAsync() { diff --git a/test/PowerShellEditorServices.Test/Extensions/ExtensionCommandTests.cs b/test/PowerShellEditorServices.Test/Extensions/ExtensionCommandTests.cs index c4958ce8e..70e35d3dd 100644 --- a/test/PowerShellEditorServices.Test/Extensions/ExtensionCommandTests.cs +++ b/test/PowerShellEditorServices.Test/Extensions/ExtensionCommandTests.cs @@ -28,7 +28,7 @@ public class ExtensionCommandTests : IAsyncLifetime public async Task InitializeAsync() { - psesHost = PsesHostFactory.Create(NullLoggerFactory.Instance); + psesHost = await PsesHostFactory.Create(NullLoggerFactory.Instance); ExtensionService extensionService = new( languageServer: null, serviceProvider: null, diff --git a/test/PowerShellEditorServices.Test/Language/CompletionHandlerTests.cs b/test/PowerShellEditorServices.Test/Language/CompletionHandlerTests.cs index 3406cbb41..35546cefe 100644 --- a/test/PowerShellEditorServices.Test/Language/CompletionHandlerTests.cs +++ b/test/PowerShellEditorServices.Test/Language/CompletionHandlerTests.cs @@ -22,19 +22,17 @@ namespace PowerShellEditorServices.Test.Language [Trait("Category", "Completions")] public class CompletionHandlerTests : IAsyncLifetime { - private readonly PsesInternalHost psesHost; - private readonly WorkspaceService workspace; - private readonly PsesCompletionHandler completionHandler; + private PsesInternalHost psesHost; + private WorkspaceService workspace; + private PsesCompletionHandler completionHandler; - public CompletionHandlerTests() + public async Task InitializeAsync() { - psesHost = PsesHostFactory.Create(NullLoggerFactory.Instance); + psesHost = await PsesHostFactory.Create(NullLoggerFactory.Instance); workspace = new WorkspaceService(NullLoggerFactory.Instance); completionHandler = new PsesCompletionHandler(NullLoggerFactory.Instance, psesHost, psesHost, workspace); } - public Task InitializeAsync() => Task.CompletedTask; - public async Task DisposeAsync() => await Task.Run(psesHost.StopAsync); private ScriptFile GetScriptFile(ScriptRegion scriptRegion) => workspace.GetFile(TestUtilities.GetSharedPath(scriptRegion.File)); diff --git a/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs b/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs index 52c217299..630c8a018 100644 --- a/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs +++ b/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs @@ -31,14 +31,14 @@ namespace PowerShellEditorServices.Test.Language [Trait("Category", "Symbols")] public class SymbolsServiceTests : IAsyncLifetime { - private readonly PsesInternalHost psesHost; - private readonly WorkspaceService workspace; - private readonly SymbolsService symbolsService; + private PsesInternalHost psesHost; + private WorkspaceService workspace; + private SymbolsService symbolsService; private static readonly bool s_isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); - public SymbolsServiceTests() + public async Task InitializeAsync() { - psesHost = PsesHostFactory.Create(NullLoggerFactory.Instance); + psesHost = await PsesHostFactory.Create(NullLoggerFactory.Instance); workspace = new WorkspaceService(NullLoggerFactory.Instance); workspace.WorkspaceFolders.Add(new WorkspaceFolder { @@ -52,8 +52,6 @@ public SymbolsServiceTests() new ConfigurationService()); } - public Task InitializeAsync() => Task.CompletedTask; - public async Task DisposeAsync() { psesHost.StopAsync(); diff --git a/test/PowerShellEditorServices.Test/PsesHostFactory.cs b/test/PowerShellEditorServices.Test/PsesHostFactory.cs index 0e02b6389..9f63236d4 100644 --- a/test/PowerShellEditorServices.Test/PsesHostFactory.cs +++ b/test/PowerShellEditorServices.Test/PsesHostFactory.cs @@ -7,6 +7,7 @@ using System.Management.Automation.Host; using System.Management.Automation.Runspaces; using System.Threading; +using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.PowerShell.EditorServices.Hosting; using Microsoft.PowerShell.EditorServices.Services.PowerShell.Host; @@ -28,7 +29,7 @@ internal static class PsesHostFactory public static readonly string BundledModulePath = Path.GetFullPath(TestUtilities.NormalizePath("../../../../../module")); - public static PsesInternalHost Create(ILoggerFactory loggerFactory, bool loadProfiles = false) + public static async Task Create(ILoggerFactory loggerFactory, bool loadProfiles = false) { // We intentionally use `CreateDefault2()` as it loads `Microsoft.PowerShell.Core` only, // which is a more minimal and therefore safer state. @@ -62,9 +63,7 @@ public static PsesInternalHost Create(ILoggerFactory loggerFactory, bool loadPro PsesInternalHost psesHost = new(loggerFactory, null, testHostDetails); - #pragma warning disable VSTHRD002 // Because this is used by constructors it can't use await. - if (psesHost.TryStartAsync(new HostStartOptions { LoadProfiles = loadProfiles }, CancellationToken.None).GetAwaiter().GetResult()) - #pragma warning restore VSTHRD002 + if (await psesHost.TryStartAsync(new HostStartOptions { LoadProfiles = loadProfiles }, CancellationToken.None)) { return psesHost; } diff --git a/test/PowerShellEditorServices.Test/Session/PsesInternalHostTests.cs b/test/PowerShellEditorServices.Test/Session/PsesInternalHostTests.cs index eb316be89..617b610ed 100644 --- a/test/PowerShellEditorServices.Test/Session/PsesInternalHostTests.cs +++ b/test/PowerShellEditorServices.Test/Session/PsesInternalHostTests.cs @@ -22,11 +22,9 @@ namespace PowerShellEditorServices.Test.Session [Trait("Category", "PsesInternalHost")] public class PsesInternalHostTests : IAsyncLifetime { - private readonly PsesInternalHost psesHost; + private PsesInternalHost psesHost; - public PsesInternalHostTests() => psesHost = PsesHostFactory.Create(NullLoggerFactory.Instance); - - public Task InitializeAsync() => Task.CompletedTask; + public async Task InitializeAsync() => psesHost = await PsesHostFactory.Create(NullLoggerFactory.Instance); public async Task DisposeAsync() => await psesHost.StopAsync(); @@ -84,7 +82,7 @@ public async Task CanQueueParallelPSCommands() public async Task CanCancelExecutionWithToken() { using CancellationTokenSource cancellationSource = new(millisecondsDelay: 1000); - _ = await Assert.ThrowsAsync(() => + await Assert.ThrowsAsync(() => { return psesHost.ExecutePSCommandAsync( new PSCommand().AddScript("Start-Sleep 10"), @@ -100,9 +98,8 @@ public async Task CanCancelExecutionWithMethod() new PSCommand().AddScript("Start-Sleep 10"), CancellationToken.None); - // Wait until our task has started. - Thread.Sleep(2000); - psesHost.CancelCurrentTask(); + // Cancel the task after 1 second in another thread. + Task.Run(() => { Thread.Sleep(1000); psesHost.CancelCurrentTask(); }); await Assert.ThrowsAsync(() => executeTask); Assert.True(executeTask.IsCanceled); } @@ -236,11 +233,9 @@ public async Task CanHandleBadInitialWorkingDirectory(string path) [Trait("Category", "PsesInternalHost")] public class PsesInternalHostWithProfileTests : IAsyncLifetime { - private readonly PsesInternalHost psesHost; - - public PsesInternalHostWithProfileTests() => psesHost = PsesHostFactory.Create(NullLoggerFactory.Instance, loadProfiles: true); + private PsesInternalHost psesHost; - public Task InitializeAsync() => Task.CompletedTask; + public async Task InitializeAsync() => psesHost = await PsesHostFactory.Create(NullLoggerFactory.Instance, loadProfiles: true); public async Task DisposeAsync() => await psesHost.StopAsync(); From a7a289da3d13e674db4ce1f26b6004019cfb0a8b Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Wed, 10 Apr 2024 11:57:11 -0700 Subject: [PATCH 10/88] Fix `DebugServiceTests` By ensuring that our event queue is only accessed from the threadpool, not the pipeline thread. We now do this in the event handler and the assertions, instead of around calls to the `debugService`. --- .../Debugging/DebugServiceTests.cs | 104 +++++++++--------- 1 file changed, 51 insertions(+), 53 deletions(-) diff --git a/test/PowerShellEditorServices.Test/Debugging/DebugServiceTests.cs b/test/PowerShellEditorServices.Test/Debugging/DebugServiceTests.cs index 4b61fd327..05386d43a 100644 --- a/test/PowerShellEditorServices.Test/Debugging/DebugServiceTests.cs +++ b/test/PowerShellEditorServices.Test/Debugging/DebugServiceTests.cs @@ -80,20 +80,20 @@ public async Task InitializeAsync() public async Task DisposeAsync() { debugService.Abort(); - debuggerStoppedQueue.Dispose(); await Task.Run(psesHost.StopAsync); + debuggerStoppedQueue.Dispose(); } /// - /// This event handler lets us test that the debugger stopped or paused as expected. It will - /// deadlock if called in the PSES Pipeline Thread, which can easily happen in this test - /// code when methods on are called. Hence we treat this test - /// code like UI code and use 'ConfigureAwait(true)' or 'Task.Run(...)' to ensure we stay - /// OFF the pipeline thread. + /// This event handler lets us test that the debugger stopped or paused + /// as expected. It will deadlock if called in the PSES Pipeline Thread. + /// Hence we use 'Task.Run(...)' when accessing the queue to ensure we + /// stay OFF the pipeline thread. /// /// /// - private void OnDebuggerStopped(object sender, DebuggerStoppedEventArgs e) => debuggerStoppedQueue.Add(e); + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD110:Observe result of async calls", Justification = "This intentionally fires and forgets on another thread.")] + private void OnDebuggerStopped(object sender, DebuggerStoppedEventArgs e) => Task.Run(() => debuggerStoppedQueue.Add(e)); private ScriptFile GetDebugScript(string fileName) => workspace.GetFile(TestUtilities.GetSharedPath(Path.Combine("Debugging", fileName))); @@ -116,20 +116,20 @@ private Task ExecuteScriptFileAsync(string scriptFilePath, params string[] args) private Task ExecuteVariableScriptFileAsync() => ExecuteScriptFileAsync(variableScriptFile.FilePath); - private void AssertDebuggerPaused() + private async Task AssertDebuggerPaused() { using CancellationTokenSource cts = new(60000); - DebuggerStoppedEventArgs eventArgs = debuggerStoppedQueue.Take(cts.Token); + DebuggerStoppedEventArgs eventArgs = await Task.Run(() => debuggerStoppedQueue.Take(cts.Token)); Assert.Empty(eventArgs.OriginalEvent.Breakpoints); } - private void AssertDebuggerStopped( + private async Task AssertDebuggerStopped( string scriptPath = "", int lineNumber = -1, CommandBreakpointDetails commandBreakpointDetails = default) { - using CancellationTokenSource cts = new(60000); - DebuggerStoppedEventArgs eventArgs = debuggerStoppedQueue.Take(cts.Token); + using CancellationTokenSource cts = new(30000); + DebuggerStoppedEventArgs eventArgs = await Task.Run(() => debuggerStoppedQueue.Take(cts.Token)); Assert.True(psesHost.DebugContext.IsStopped); @@ -174,8 +174,8 @@ await debugService.SetCommandBreakpointsAsync( Task> executeTask = psesHost.ExecutePSCommandAsync( new PSCommand().AddScript("Get-Random -SetSeed 42 -Maximum 100"), CancellationToken.None); - AssertDebuggerStopped("", 1); - await Task.Run(debugService.Continue); + await AssertDebuggerStopped("", 1); + debugService.Continue(); Assert.Equal(17, (await executeTask)[0]); StackFrameDetails[] stackFrames = await debugService.GetStackFramesAsync(); @@ -216,7 +216,7 @@ public async Task DebuggerAcceptsScriptArgs(string[] args) Task _ = ExecuteScriptFileAsync(oddPathScriptFile.FilePath, args); - AssertDebuggerStopped(oddPathScriptFile.FilePath, 3); + await AssertDebuggerStopped(oddPathScriptFile.FilePath, 3); VariableDetailsBase[] variables = await GetVariables(VariableContainerDetails.LocalScopeName); @@ -283,7 +283,7 @@ public async Task DebuggerStopsOnFunctionBreakpoints() new[] { CommandBreakpointDetails.Create("Write-Host") }); Task _ = ExecuteDebugFileAsync(); - AssertDebuggerStopped(debugScriptFile.FilePath, 6); + await AssertDebuggerStopped(debugScriptFile.FilePath, 6); VariableDetailsBase[] variables = await GetVariables(VariableContainerDetails.LocalScopeName); @@ -294,8 +294,8 @@ public async Task DebuggerStopsOnFunctionBreakpoints() Assert.Equal("1", i.ValueString); // The function breakpoint should fire the next time through the loop. - await Task.Run(debugService.Continue); - AssertDebuggerStopped(debugScriptFile.FilePath, 6); + debugService.Continue(); + await AssertDebuggerStopped(debugScriptFile.FilePath, 6); variables = await GetVariables(VariableContainerDetails.LocalScopeName); @@ -350,9 +350,9 @@ await debugService.SetLineBreakpointsAsync( }); Task _ = ExecuteDebugFileAsync(); - AssertDebuggerStopped(debugScriptFile.FilePath, 5); - await Task.Run(debugService.Continue); - AssertDebuggerStopped(debugScriptFile.FilePath, 7); + await AssertDebuggerStopped(debugScriptFile.FilePath, 5); + debugService.Continue(); + await AssertDebuggerStopped(debugScriptFile.FilePath, 7); } [Fact] @@ -368,7 +368,7 @@ await debugService.SetLineBreakpointsAsync( }); Task _ = ExecuteDebugFileAsync(); - AssertDebuggerStopped(debugScriptFile.FilePath, 7); + await AssertDebuggerStopped(debugScriptFile.FilePath, 7); VariableDetailsBase[] variables = await GetVariables(VariableContainerDetails.LocalScopeName); @@ -380,8 +380,8 @@ await debugService.SetLineBreakpointsAsync( // The conditional breakpoint should not fire again, until the value of // i reaches breakpointValue2. - await Task.Run(debugService.Continue); - AssertDebuggerStopped(debugScriptFile.FilePath, 7); + debugService.Continue(); + await AssertDebuggerStopped(debugScriptFile.FilePath, 7); variables = await GetVariables(VariableContainerDetails.LocalScopeName); @@ -404,7 +404,7 @@ await debugService.SetLineBreakpointsAsync( }); Task _ = ExecuteDebugFileAsync(); - AssertDebuggerStopped(debugScriptFile.FilePath, 6); + await AssertDebuggerStopped(debugScriptFile.FilePath, 6); VariableDetailsBase[] variables = await GetVariables(VariableContainerDetails.LocalScopeName); @@ -425,7 +425,7 @@ await debugService.SetLineBreakpointsAsync( new[] { BreakpointDetails.Create(debugScriptFile.FilePath, 6, null, "$i % 2 -eq 0", $"{hitCount}") }); Task _ = ExecuteDebugFileAsync(); - AssertDebuggerStopped(debugScriptFile.FilePath, 6); + await AssertDebuggerStopped(debugScriptFile.FilePath, 6); VariableDetailsBase[] variables = await GetVariables(VariableContainerDetails.LocalScopeName); @@ -493,18 +493,16 @@ public async Task DebuggerBreaksWhenRequested() IReadOnlyList confirmedBreakpoints = await GetConfirmedBreakpoints(debugScriptFile); Assert.Empty(confirmedBreakpoints); Task _ = ExecuteDebugFileAsync(); - // NOTE: This must be run on a separate thread so the async event handlers can fire. - await Task.Run(debugService.Break); - AssertDebuggerPaused(); + debugService.Break(); + await AssertDebuggerPaused(); } [Fact] public async Task DebuggerRunsCommandsWhileStopped() { Task _ = ExecuteDebugFileAsync(); - // NOTE: This must be run on a separate thread so the async event handlers can fire. - await Task.Run(debugService.Break); - AssertDebuggerPaused(); + debugService.Break(); + await AssertDebuggerPaused(); // Try running a command from outside the pipeline thread Task> executeTask = psesHost.ExecutePSCommandAsync( @@ -524,7 +522,7 @@ await debugService.SetCommandBreakpointsAsync( ScriptFile testScript = GetDebugScript("PSDebugContextTest.ps1"); Task _ = ExecuteScriptFileAsync(testScript.FilePath); - AssertDebuggerStopped(testScript.FilePath, 11); + await AssertDebuggerStopped(testScript.FilePath, 11); VariableDetails prompt = await debugService.EvaluateExpressionAsync("prompt", false, CancellationToken.None); Assert.Equal("True > ", prompt.ValueString); @@ -549,7 +547,7 @@ await debugService.SetCommandBreakpointsAsync( NullLoggerFactory.Instance, null, debugService, null, null, psesHost, workspace, null, psesHost); Task _ = configurationDoneHandler.LaunchScriptAsync(scriptPath); - AssertDebuggerStopped(scriptPath, 1); + await AssertDebuggerStopped(scriptPath, 1); VariableDetailsBase[] variables = await GetVariables(VariableContainerDetails.CommandVariablesName); VariableDetailsBase myInvocation = Array.Find(variables, v => v.Name == "$MyInvocation"); @@ -627,7 +625,7 @@ await debugService.SetLineBreakpointsAsync( new[] { BreakpointDetails.Create(variableScriptFile.FilePath, 8) }); Task _ = ExecuteVariableScriptFileAsync(); - AssertDebuggerStopped(variableScriptFile.FilePath); + await AssertDebuggerStopped(variableScriptFile.FilePath); VariableDetailsBase[] variables = await GetVariables(VariableContainerDetails.LocalScopeName); @@ -645,7 +643,7 @@ await debugService.SetLineBreakpointsAsync( new[] { BreakpointDetails.Create(variableScriptFile.FilePath, 21) }); Task _ = ExecuteVariableScriptFileAsync(); - AssertDebuggerStopped(variableScriptFile.FilePath); + await AssertDebuggerStopped(variableScriptFile.FilePath); VariableDetailsBase[] variables = await GetVariables(VariableContainerDetails.LocalScopeName); @@ -695,7 +693,7 @@ await debugService.SetLineBreakpointsAsync( new[] { BreakpointDetails.Create(variableScriptFile.FilePath, 14) }); Task _ = ExecuteVariableScriptFileAsync(); - AssertDebuggerStopped(variableScriptFile.FilePath); + await AssertDebuggerStopped(variableScriptFile.FilePath); VariableScope[] scopes = debugService.GetVariableScopes(0); VariableDetailsBase[] variables = await GetVariables(VariableContainerDetails.LocalScopeName); @@ -721,8 +719,8 @@ await debugService.SetLineBreakpointsAsync( // The above just tests that the debug service returns the correct new value string. // Let's step the debugger and make sure the values got set to the new values. - await Task.Run(debugService.StepOver); - AssertDebuggerStopped(variableScriptFile.FilePath); + debugService.StepOver(); + await AssertDebuggerStopped(variableScriptFile.FilePath); // Test set of a local string variable (not strongly typed) variables = await GetVariables(VariableContainerDetails.LocalScopeName); @@ -749,7 +747,7 @@ await debugService.SetLineBreakpointsAsync( // Execute the script and wait for the breakpoint to be hit Task _ = ExecuteVariableScriptFileAsync(); - AssertDebuggerStopped(variableScriptFile.FilePath); + await AssertDebuggerStopped(variableScriptFile.FilePath); VariableScope[] scopes = debugService.GetVariableScopes(0); VariableDetailsBase[] variables = await GetVariables(VariableContainerDetails.LocalScopeName); @@ -777,8 +775,8 @@ await debugService.SetLineBreakpointsAsync( // The above just tests that the debug service returns the correct new value string. // Let's step the debugger and make sure the values got set to the new values. - await Task.Run(debugService.StepOver); - AssertDebuggerStopped(variableScriptFile.FilePath); + debugService.StepOver(); + await AssertDebuggerStopped(variableScriptFile.FilePath); // Test set of a local string variable (not strongly typed but force conversion) variables = await GetVariables(VariableContainerDetails.LocalScopeName); @@ -805,7 +803,7 @@ await debugService.SetLineBreakpointsAsync( // Execute the script and wait for the breakpoint to be hit Task _ = ExecuteVariableScriptFileAsync(); - AssertDebuggerStopped(variableScriptFile.FilePath); + await AssertDebuggerStopped(variableScriptFile.FilePath); StackFrameDetails[] stackFrames = await debugService.GetStackFramesAsync(); VariableDetailsBase[] variables = await debugService.GetVariables(stackFrames[0].AutoVariables.Id, CancellationToken.None); @@ -825,7 +823,7 @@ await debugService.SetLineBreakpointsAsync( // Execute the script and wait for the breakpoint to be hit Task _ = ExecuteVariableScriptFileAsync(); - AssertDebuggerStopped(variableScriptFile.FilePath); + await AssertDebuggerStopped(variableScriptFile.FilePath); StackFrameDetails[] stackFrames = await debugService.GetStackFramesAsync(); VariableDetailsBase[] variables = await debugService.GetVariables(stackFrames[0].AutoVariables.Id, CancellationToken.None); @@ -858,7 +856,7 @@ await debugService.SetLineBreakpointsAsync( // Execute the script and wait for the breakpoint to be hit Task _ = ExecuteVariableScriptFileAsync(); - AssertDebuggerStopped(variableScriptFile.FilePath); + await AssertDebuggerStopped(variableScriptFile.FilePath); StackFrameDetails[] stackFrames = await debugService.GetStackFramesAsync(); VariableDetailsBase[] variables = await debugService.GetVariables(stackFrames[0].AutoVariables.Id, CancellationToken.None); @@ -878,7 +876,7 @@ await debugService.SetLineBreakpointsAsync( // Execute the script and wait for the breakpoint to be hit Task _ = ExecuteVariableScriptFileAsync(); - AssertDebuggerStopped(variableScriptFile.FilePath); + await AssertDebuggerStopped(variableScriptFile.FilePath); StackFrameDetails[] stackFrames = await debugService.GetStackFramesAsync(); VariableDetailsBase[] variables = await debugService.GetVariables(stackFrames[0].AutoVariables.Id, CancellationToken.None); @@ -905,7 +903,7 @@ public async Task DebuggerEnumerableShowsRawView() // Execute the script and wait for the breakpoint to be hit Task _ = ExecuteVariableScriptFileAsync(); - AssertDebuggerStopped(commandBreakpointDetails: breakpoint); + await AssertDebuggerStopped(commandBreakpointDetails: breakpoint); VariableDetailsBase simpleArrayVar = Array.Find( await GetVariables(VariableContainerDetails.ScriptScopeName), @@ -962,7 +960,7 @@ public async Task DebuggerDictionaryShowsRawView() // Execute the script and wait for the breakpoint to be hit Task _ = ExecuteVariableScriptFileAsync(); - AssertDebuggerStopped(commandBreakpointDetails: breakpoint); + await AssertDebuggerStopped(commandBreakpointDetails: breakpoint); VariableDetailsBase simpleDictionaryVar = Array.Find( await GetVariables(VariableContainerDetails.ScriptScopeName), @@ -1025,7 +1023,7 @@ public async Task DebuggerDerivedDictionaryPropertyInRawView() // Execute the script and wait for the breakpoint to be hit Task _ = ExecuteVariableScriptFileAsync(); - AssertDebuggerStopped(commandBreakpointDetails: breakpoint); + await AssertDebuggerStopped(commandBreakpointDetails: breakpoint); VariableDetailsBase sortedDictionaryVar = Array.Find( await GetVariables(VariableContainerDetails.ScriptScopeName), @@ -1074,7 +1072,7 @@ await debugService.SetLineBreakpointsAsync( // Execute the script and wait for the breakpoint to be hit Task _ = ExecuteVariableScriptFileAsync(); - AssertDebuggerStopped(variableScriptFile.FilePath); + await AssertDebuggerStopped(variableScriptFile.FilePath); StackFrameDetails[] stackFrames = await debugService.GetStackFramesAsync(); VariableDetailsBase[] variables = await debugService.GetVariables(stackFrames[0].AutoVariables.Id, CancellationToken.None); @@ -1103,7 +1101,7 @@ await debugService.SetLineBreakpointsAsync( // Execute the script and wait for the breakpoint to be hit Task _ = ExecuteVariableScriptFileAsync(); - AssertDebuggerStopped(variableScriptFile.FilePath); + await AssertDebuggerStopped(variableScriptFile.FilePath); StackFrameDetails[] stackFrames = await debugService.GetStackFramesAsync(); VariableDetailsBase[] variables = await debugService.GetVariables(stackFrames[0].AutoVariables.Id, CancellationToken.None); @@ -1132,7 +1130,7 @@ await debugService.SetCommandBreakpointsAsync( ScriptFile testScript = GetDebugScript("GetChildItemTest.ps1"); Task _ = ExecuteScriptFileAsync(testScript.FilePath); - AssertDebuggerStopped(testScript.FilePath, 2); + await AssertDebuggerStopped(testScript.FilePath, 2); VariableDetailsBase[] variables = await GetVariables(VariableContainerDetails.LocalScopeName); VariableDetailsBase var = Array.Find(variables, v => v.Name == "$file"); @@ -1152,7 +1150,7 @@ public async Task DebuggerToStringShouldMarshallToPipeline() // Execute the script and wait for the breakpoint to be hit Task _ = ExecuteVariableScriptFileAsync(); - AssertDebuggerStopped(commandBreakpointDetails: breakpoint); + await AssertDebuggerStopped(commandBreakpointDetails: breakpoint); VariableDetailsBase[] vars = await GetVariables(VariableContainerDetails.ScriptScopeName); VariableDetailsBase customToStrings = Array.Find(vars, i => i.Name is "$CustomToStrings"); From a4725bc4488ebeb75c8ac946db10493eff3c0eed Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Wed, 10 Apr 2024 13:08:01 -0700 Subject: [PATCH 11/88] Be consistent with error suppression Avoiding pragmas wherever possible. --- .editorconfig | 18 +++++++++--------- .../Commands/StartEditorServicesCommand.cs | 4 +--- .../EditorServicesLoader.cs | 5 ++--- .../Internal/EditorServicesRunner.cs | 2 ++ .../Extensions/EditorContext.cs | 3 +-- .../Extensions/EditorObject.cs | 5 ++--- .../Extensions/EditorWindow.cs | 5 +++++ .../Extensions/EditorWorkspace.cs | 7 +++++++ .../Extensions/FileContext.cs | 7 +++---- .../GlobalSuppressions.cs | 9 --------- src/PowerShellEditorServices/IsExternalInit.cs | 4 +++- .../Server/PsesLanguageServer.cs | 2 -- .../Server/PsesServiceCollectionExtensions.cs | 3 +-- .../Services/DebugAdapter/DebugService.cs | 1 + .../Handlers/LaunchAndAttachHandler.cs | 1 + .../PowerShell/Console/LegacyReadLine.cs | 3 +-- .../PowerShell/Host/PsesInternalHost.cs | 2 -- .../Handlers/DidChangeWatchedFilesHandler.cs | 2 ++ .../Services/TextDocument/TokenOperations.cs | 2 -- .../Workspace/RemoteFileManagerService.cs | 5 ++++- .../Utility/AsyncUtils.cs | 1 + .../Processes/StdioServerProcess.cs | 3 +-- 22 files changed, 47 insertions(+), 47 deletions(-) delete mode 100644 src/PowerShellEditorServices/GlobalSuppressions.cs diff --git a/.editorconfig b/.editorconfig index b1bfe93a1..0786fbe27 100644 --- a/.editorconfig +++ b/.editorconfig @@ -54,11 +54,11 @@ dotnet_diagnostic.CA1068.severity = error # CA1501: Avoid excessive inheritance dotnet_diagnostic.CA1501.severity = error # CA1502: Avoid excessive complexity -dotnet_diagnostic.CA1502.severity = warning +dotnet_diagnostic.CA1502.severity = silent # CA1505: Avoid unmaintainable code dotnet_diagnostic.CA1505.severity = error # CA1506: Avoid excessive class coupling -dotnet_diagnostic.CA1506.severity = warning +dotnet_diagnostic.CA1506.severity = silent # CA1507: Use nameof in place of string dotnet_diagnostic.CA1507.severity = error # CA1508: Avoid dead conditional code @@ -95,22 +95,22 @@ dotnet_diagnostic.RCS1210.severity = error # RCS1036: Remove unnecessary blank line dotnet_diagnostic.RCS1036.severity = error # RCS1075: Avoid empty catch clause that catches System.Exception -dotnet_diagnostic.RCS1075.severity = suggestion +dotnet_diagnostic.RCS1075.severity = error # RCS1170: Use read-only auto-implemented property dotnet_diagnostic.RCS1170.severity = error # VSTHRD002: Avoid problematic synchronous waits -dotnet_diagnostic.VSTHRD002.severity = suggestion +dotnet_diagnostic.VSTHRD002.severity = error # VSTHRD003: Avoid awaiting foreign Tasks -dotnet_diagnostic.VSTHRD003.severity = suggestion +dotnet_diagnostic.VSTHRD003.severity = error # VSTHRD105: Avoid method overloads that assume TaskScheduler.Current -dotnet_diagnostic.VSTHRD105.severity = suggestion +dotnet_diagnostic.VSTHRD105.severity = error # VSTHRD100: Avoid async void methods -dotnet_diagnostic.VSTHRD100.severity = suggestion +dotnet_diagnostic.VSTHRD100.severity = error # VSTHRD103: Call async methods when in an async method -dotnet_diagnostic.VSTHRD103.severity = suggestion +dotnet_diagnostic.VSTHRD103.severity = error # VSTHRD110: Observe result of async calls -dotnet_diagnostic.VSTHRD110.severity = suggestion +dotnet_diagnostic.VSTHRD110.severity = error # VSTHRD114: Avoid returning a null Task dotnet_diagnostic.VSTHRD114.severity = error # VSTHRD200: Use "Async" suffix for awaitable methods diff --git a/src/PowerShellEditorServices.Hosting/Commands/StartEditorServicesCommand.cs b/src/PowerShellEditorServices.Hosting/Commands/StartEditorServicesCommand.cs index 0eddc622b..69aa7b97f 100644 --- a/src/PowerShellEditorServices.Hosting/Commands/StartEditorServicesCommand.cs +++ b/src/PowerShellEditorServices.Hosting/Commands/StartEditorServicesCommand.cs @@ -215,7 +215,7 @@ protected override void BeginProcessing() } #pragma warning restore IDE0022 - [System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1031:Do not catch general exception types", Justification = "Uses ThrowTerminatingError() instead")] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD002:Avoid problematic synchronous waits", Justification = "We have to wait here, it's the whole program.")] protected override void EndProcessing() { _logger.Log(PsesLogLevel.Diagnostic, "Beginning EndProcessing block"); @@ -232,9 +232,7 @@ protected override void EndProcessing() using EditorServicesLoader psesLoader = EditorServicesLoader.Create(_logger, editorServicesConfig, SessionDetailsPath, _loggerUnsubscribers); _logger.Log(PsesLogLevel.Verbose, "Loading EditorServices"); // Synchronously start editor services and wait here until it shuts down. -#pragma warning disable VSTHRD002 psesLoader.LoadAndRunEditorServicesAsync().GetAwaiter().GetResult(); -#pragma warning restore VSTHRD002 } catch (Exception e) { diff --git a/src/PowerShellEditorServices.Hosting/EditorServicesLoader.cs b/src/PowerShellEditorServices.Hosting/EditorServicesLoader.cs index f2da0eb4e..cf5c45c75 100644 --- a/src/PowerShellEditorServices.Hosting/EditorServicesLoader.cs +++ b/src/PowerShellEditorServices.Hosting/EditorServicesLoader.cs @@ -382,6 +382,7 @@ private void ValidateConfiguration() } } + [System.Diagnostics.CodeAnalysis.SuppressMessage("Performance", "CA1825:Avoid zero-length array allocations", Justification = "Cannot use Array.Empty, since it must work in net452")] private static Version GetPSVersion() { // In order to read the $PSVersionTable variable, @@ -389,12 +390,10 @@ private static Version GetPSVersion() // which is expensive. // Rather than do that, we instead go straight to the source, // which is a static property, internal in WinPS and public in PS 6+ -#pragma warning disable CA1825 return typeof(PSObject).Assembly .GetType("System.Management.Automation.PSVersionInfo") .GetMethod("get_PSVersion", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) - .Invoke(null, new object[0] /* Cannot use Array.Empty, since it must work in net452 */) as Version; -#pragma warning restore CA1825 + .Invoke(null, new object[0]) as Version; } } } diff --git a/src/PowerShellEditorServices.Hosting/Internal/EditorServicesRunner.cs b/src/PowerShellEditorServices.Hosting/Internal/EditorServicesRunner.cs index 8f868d393..0f47bdad8 100644 --- a/src/PowerShellEditorServices.Hosting/Internal/EditorServicesRunner.cs +++ b/src/PowerShellEditorServices.Hosting/Internal/EditorServicesRunner.cs @@ -201,6 +201,7 @@ private async Task RunTempDebugSessionAsync(HostStartupInfo hostDetails) await debugServer.WaitForShutdown().ConfigureAwait(false); } + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD003:Avoid awaiting foreign Tasks", Justification = "It's a wrapper.")] private async Task StartDebugServer(Task debugServerCreation) { PsesDebugServer debugServer = await debugServerCreation.ConfigureAwait(false); @@ -304,6 +305,7 @@ private void WriteStartupBanner() _config.PSHost.UI.WriteLine(_config.StartupBanner); } + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD110:Observe result of async calls", Justification = "Intentionally fire and forget.")] private void DebugServer_OnSessionEnded(object sender, EventArgs args) { _logger.Log(PsesLogLevel.Verbose, "Debug session ended, restarting debug service..."); diff --git a/src/PowerShellEditorServices/Extensions/EditorContext.cs b/src/PowerShellEditorServices/Extensions/EditorContext.cs index f2ab42e8c..e79eb8c3b 100644 --- a/src/PowerShellEditorServices/Extensions/EditorContext.cs +++ b/src/PowerShellEditorServices/Extensions/EditorContext.cs @@ -92,9 +92,8 @@ public void SetSelection( /// Sets a selection in the host editor's active buffer. /// /// The range of the selection. - #pragma warning disable VSTHRD002 + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD002:Avoid problematic synchronous waits", Justification = "Supporting synchronous API.")] public void SetSelection(FileRange selectionRange) => editorOperations.SetSelectionAsync(selectionRange.ToBufferRange()).Wait(); - #pragma warning restore VSTHRD002 #endregion } diff --git a/src/PowerShellEditorServices/Extensions/EditorObject.cs b/src/PowerShellEditorServices/Extensions/EditorObject.cs index 17006baf2..a43ab2995 100644 --- a/src/PowerShellEditorServices/Extensions/EditorObject.cs +++ b/src/PowerShellEditorServices/Extensions/EditorObject.cs @@ -115,13 +115,12 @@ internal EditorObject( /// at the time this method is invoked. /// /// A instance of the EditorContext class. - #pragma warning disable VSTHRD002, VSTHRD104 + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD002:Avoid problematic synchronous waits", Justification = "Supporting synchronous API.")] public EditorContext GetEditorContext() => _editorOperations.GetEditorContextAsync().Result; - #pragma warning restore VSTHRD002, VSTHRD104 internal void SetAsStaticInstance() { - EditorObject.Instance = this; + Instance = this; s_editorObjectReady.TrySetResult(true); } } diff --git a/src/PowerShellEditorServices/Extensions/EditorWindow.cs b/src/PowerShellEditorServices/Extensions/EditorWindow.cs index 8c9048c3c..6d9d4c3ff 100644 --- a/src/PowerShellEditorServices/Extensions/EditorWindow.cs +++ b/src/PowerShellEditorServices/Extensions/EditorWindow.cs @@ -43,24 +43,28 @@ internal EditorWindow(IEditorOperations editorOperations) /// Shows an informational message to the user. /// /// The message to be shown. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD002:Avoid problematic synchronous waits", Justification = "Supporting synchronous API.")] public void ShowInformationMessage(string message) => editorOperations.ShowInformationMessageAsync(message).Wait(); /// /// Shows an error message to the user. /// /// The message to be shown. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD002:Avoid problematic synchronous waits", Justification = "Supporting synchronous API.")] public void ShowErrorMessage(string message) => editorOperations.ShowErrorMessageAsync(message).Wait(); /// /// Shows a warning message to the user. /// /// The message to be shown. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD002:Avoid problematic synchronous waits", Justification = "Supporting synchronous API.")] public void ShowWarningMessage(string message) => editorOperations.ShowWarningMessageAsync(message).Wait(); /// /// Sets the status bar message in the editor UI (if applicable). /// /// The message to be shown. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD002:Avoid problematic synchronous waits", Justification = "Supporting synchronous API.")] public void SetStatusBarMessage(string message) => editorOperations.SetStatusBarMessageAsync(message, null).Wait(); /// @@ -68,6 +72,7 @@ internal EditorWindow(IEditorOperations editorOperations) /// /// The message to be shown. /// A timeout in milliseconds for how long the message should remain visible. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD002:Avoid problematic synchronous waits", Justification = "Supporting synchronous API.")] public void SetStatusBarMessage(string message, int timeout) => editorOperations.SetStatusBarMessageAsync(message, timeout).Wait(); #endregion diff --git a/src/PowerShellEditorServices/Extensions/EditorWorkspace.cs b/src/PowerShellEditorServices/Extensions/EditorWorkspace.cs index b01c6eca7..e1e0824cb 100644 --- a/src/PowerShellEditorServices/Extensions/EditorWorkspace.cs +++ b/src/PowerShellEditorServices/Extensions/EditorWorkspace.cs @@ -42,12 +42,14 @@ public sealed class EditorWorkspace /// /// Creates a new file in the editor. /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD002:Avoid problematic synchronous waits", Justification = "Supporting synchronous API.")] public void NewFile() => editorOperations.NewFileAsync(string.Empty).Wait(); /// /// Creates a new file in the editor. /// /// The content to place in the new file. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD002:Avoid problematic synchronous waits", Justification = "Supporting synchronous API.")] public void NewFile(string content) => editorOperations.NewFileAsync(content).Wait(); /// @@ -55,6 +57,7 @@ public sealed class EditorWorkspace /// its buffer will be made active. /// /// The path to the file to be opened. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD002:Avoid problematic synchronous waits", Justification = "Supporting synchronous API.")] public void OpenFile(string filePath) => editorOperations.OpenFileAsync(filePath).Wait(); /// @@ -64,18 +67,21 @@ public sealed class EditorWorkspace /// /// The path to the file to be opened. /// Determines wether the file is opened as a preview or as a durable editor. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD002:Avoid problematic synchronous waits", Justification = "Supporting synchronous API.")] public void OpenFile(string filePath, bool preview) => editorOperations.OpenFileAsync(filePath, preview).Wait(); /// /// Closes a file in the workspace. /// /// The path to the file to be closed. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD002:Avoid problematic synchronous waits", Justification = "Supporting synchronous API.")] public void CloseFile(string filePath) => editorOperations.CloseFileAsync(filePath).Wait(); /// /// Saves an open file in the workspace. /// /// The path to the file to be saved. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD002:Avoid problematic synchronous waits", Justification = "Supporting synchronous API.")] public void SaveFile(string filePath) => editorOperations.SaveFileAsync(filePath).Wait(); /// @@ -83,6 +89,7 @@ public sealed class EditorWorkspace /// /// The file to copy. /// The file to create. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD002:Avoid problematic synchronous waits", Justification = "Supporting synchronous API.")] public void SaveFile(string oldFilePath, string newFilePath) => editorOperations.SaveFileAsync(oldFilePath, newFilePath).Wait(); #endregion diff --git a/src/PowerShellEditorServices/Extensions/FileContext.cs b/src/PowerShellEditorServices/Extensions/FileContext.cs index c8c32e58e..39a4a275e 100644 --- a/src/PowerShellEditorServices/Extensions/FileContext.cs +++ b/src/PowerShellEditorServices/Extensions/FileContext.cs @@ -208,14 +208,13 @@ public void InsertText( /// /// The text string to insert. /// The buffer range which will be replaced by the string. - #pragma warning disable VSTHRD002 + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD002:Avoid problematic synchronous waits", Justification = "Supporting synchronous API.")] public void InsertText(string textToInsert, IFileRange insertRange) { editorOperations .InsertTextAsync(scriptFile.DocumentUri.ToString(), textToInsert, insertRange.ToBufferRange()) .Wait(); } - #pragma warning restore VSTHRD002 #endregion @@ -224,6 +223,7 @@ public void InsertText(string textToInsert, IFileRange insertRange) /// /// Saves this file. /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD110:Observe result of async calls", Justification = "Supporting synchronous API.")] public void Save() => editorOperations.SaveFileAsync(scriptFile.FilePath); /// @@ -233,7 +233,7 @@ public void InsertText(string textToInsert, IFileRange insertRange) /// the path where the file should be saved, /// including the file name with extension as the leaf /// - #pragma warning disable VSTHRD002 + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD002:Avoid problematic synchronous waits", Justification = "Supporting synchronous API.")] public void SaveAs(string newFilePath) { // Do some validation here so that we can provide a helpful error if the path won't work @@ -248,7 +248,6 @@ public void SaveAs(string newFilePath) editorOperations.SaveFileAsync(scriptFile.FilePath, newFilePath).Wait(); } - #pragma warning restore VSTHRD002 #endregion } diff --git a/src/PowerShellEditorServices/GlobalSuppressions.cs b/src/PowerShellEditorServices/GlobalSuppressions.cs deleted file mode 100644 index 3c0be1568..000000000 --- a/src/PowerShellEditorServices/GlobalSuppressions.cs +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -// This file is used by Code Analysis to maintain SuppressMessage -// attributes that are applied to this project. -// Project-level suppressions either have no target or are given -// a specific target and scoped to a namespace, type, member, etc. - -[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Globalization", "CA1303:Do not pass literals as localized parameters", Justification = "PSES is not localized", Scope = "module")] diff --git a/src/PowerShellEditorServices/IsExternalInit.cs b/src/PowerShellEditorServices/IsExternalInit.cs index c2a9d8275..c690a1820 100644 --- a/src/PowerShellEditorServices/IsExternalInit.cs +++ b/src/PowerShellEditorServices/IsExternalInit.cs @@ -1,4 +1,6 @@ -#pragma warning disable IDE0073 +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + #if NET5_0_OR_GREATER [assembly: System.Runtime.CompilerServices.TypeForwardedTo(typeof(System.Runtime.CompilerServices.IsExternalInit))] #else diff --git a/src/PowerShellEditorServices/Server/PsesLanguageServer.cs b/src/PowerShellEditorServices/Server/PsesLanguageServer.cs index c2e25f64b..03cd75307 100644 --- a/src/PowerShellEditorServices/Server/PsesLanguageServer.cs +++ b/src/PowerShellEditorServices/Server/PsesLanguageServer.cs @@ -70,9 +70,7 @@ public PsesLanguageServer( /// cref="PsesServiceCollectionExtensions.AddPsesLanguageServices"/>. /// /// A task that completes when the server is ready and listening. -#pragma warning disable CA1506 // Coupling complexity we don't care about public async Task StartAsync() -#pragma warning restore CA1506 { LanguageServer = await OmniSharp.Extensions.LanguageServer.Server.LanguageServer.From(options => { diff --git a/src/PowerShellEditorServices/Server/PsesServiceCollectionExtensions.cs b/src/PowerShellEditorServices/Server/PsesServiceCollectionExtensions.cs index 3c02510b9..243a9ebf9 100644 --- a/src/PowerShellEditorServices/Server/PsesServiceCollectionExtensions.cs +++ b/src/PowerShellEditorServices/Server/PsesServiceCollectionExtensions.cs @@ -17,6 +17,7 @@ namespace Microsoft.PowerShell.EditorServices.Server { internal static class PsesServiceCollectionExtensions { + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD110:Observe result of async calls", Justification = "Using lazy initialization.")] public static IServiceCollection AddPsesLanguageServices( this IServiceCollection collection, HostStartupInfo hostStartupInfo) @@ -48,9 +49,7 @@ public static IServiceCollection AddPsesLanguageServices( // is ready, it will be available. NOTE: We cannot await this because it // uses a lazy initialization to avoid a race with the dependency injection // framework, see the EditorObject class for that! -#pragma warning disable VSTHRD110 extensionService.InitializeAsync(); -#pragma warning restore VSTHRD110 return extensionService; }) .AddSingleton(); diff --git a/src/PowerShellEditorServices/Services/DebugAdapter/DebugService.cs b/src/PowerShellEditorServices/Services/DebugAdapter/DebugService.cs index 90faceda4..667a26bdd 100644 --- a/src/PowerShellEditorServices/Services/DebugAdapter/DebugService.cs +++ b/src/PowerShellEditorServices/Services/DebugAdapter/DebugService.cs @@ -923,6 +923,7 @@ private static string TrimScriptListingLine(PSObject scriptLineObj, ref int pref /// public event EventHandler DebuggerStopped; + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD100:Avoid async void methods", Justification = "It has to be async.")] internal async void OnDebuggerStopAsync(object sender, DebuggerStopEventArgs e) { try diff --git a/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/LaunchAndAttachHandler.cs b/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/LaunchAndAttachHandler.cs index 700c154b9..1ec1557ed 100644 --- a/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/LaunchAndAttachHandler.cs +++ b/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/LaunchAndAttachHandler.cs @@ -440,6 +440,7 @@ public async Task OnStarted(IDebugAdapterServer server, CancellationToken cancel // be sent to the client. await _debugStateService.ServerStarted.Task.ConfigureAwait(false); + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD003:Avoid awaiting foreign Tasks", Justification = "It's a wrapper.")] private async Task OnExecutionCompletedAsync(Task executeTask) { bool isRunspaceClosed = false; diff --git a/src/PowerShellEditorServices/Services/PowerShell/Console/LegacyReadLine.cs b/src/PowerShellEditorServices/Services/PowerShell/Console/LegacyReadLine.cs index 3c5e7a1d2..28d29baa1 100644 --- a/src/PowerShellEditorServices/Services/PowerShell/Console/LegacyReadLine.cs +++ b/src/PowerShellEditorServices/Services/PowerShell/Console/LegacyReadLine.cs @@ -35,9 +35,7 @@ public LegacyReadLine( _onIdleAction = onIdleAction; } -#pragma warning disable CA1502 // Cyclomatic complexity we don't care about public override string ReadLine(CancellationToken cancellationToken) -#pragma warning restore CA1502 { string inputBeforeCompletion = null; string inputAfterCompletion = null; @@ -394,6 +392,7 @@ protected override ConsoleKeyInfo ReadKey(CancellationToken cancellationToken) } } + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD002:Avoid problematic synchronous waits", Justification = "This is a legacy implementation.")] private ConsoleKeyInfo ReadKeyWithIdleSupport(CancellationToken cancellationToken) { // We run the readkey function on another thread so we can run an idle handler diff --git a/src/PowerShellEditorServices/Services/PowerShell/Host/PsesInternalHost.cs b/src/PowerShellEditorServices/Services/PowerShell/Host/PsesInternalHost.cs index 6c77daa82..a2072b2d9 100644 --- a/src/PowerShellEditorServices/Services/PowerShell/Host/PsesInternalHost.cs +++ b/src/PowerShellEditorServices/Services/PowerShell/Host/PsesInternalHost.cs @@ -29,9 +29,7 @@ namespace Microsoft.PowerShell.EditorServices.Services.PowerShell.Host using Microsoft.PowerShell.EditorServices.Server; using OmniSharp.Extensions.DebugAdapter.Protocol.Server; -#pragma warning disable CA1506 // Coupling complexity we don't care about internal class PsesInternalHost : PSHost, IHostSupportsInteractiveSession, IRunspaceContext, IInternalPowerShellExecutionService -#pragma warning restore CA1506 { internal const string DefaultPrompt = "> "; diff --git a/src/PowerShellEditorServices/Services/TextDocument/Handlers/DidChangeWatchedFilesHandler.cs b/src/PowerShellEditorServices/Services/TextDocument/Handlers/DidChangeWatchedFilesHandler.cs index edbe9b0ad..aa4c0a969 100644 --- a/src/PowerShellEditorServices/Services/TextDocument/Handlers/DidChangeWatchedFilesHandler.cs +++ b/src/PowerShellEditorServices/Services/TextDocument/Handlers/DidChangeWatchedFilesHandler.cs @@ -41,6 +41,7 @@ public DidChangeWatchedFilesHandler( public DidChangeWatchedFilesRegistrationOptions GetRegistrationOptions( DidChangeWatchedFilesCapability capability, ClientCapabilities clientCapabilities) +#pragma warning disable CS8601 // Possible null reference assignment (it's from the library). => new() { Watchers = new[] @@ -52,6 +53,7 @@ public DidChangeWatchedFilesRegistrationOptions GetRegistrationOptions( }, }, }; +#pragma warning restore CS8601 // Possible null reference assignment. public Task Handle(DidChangeWatchedFilesParams request, CancellationToken cancellationToken) { diff --git a/src/PowerShellEditorServices/Services/TextDocument/TokenOperations.cs b/src/PowerShellEditorServices/Services/TextDocument/TokenOperations.cs index 6a6f789ff..9ed65db20 100644 --- a/src/PowerShellEditorServices/Services/TextDocument/TokenOperations.cs +++ b/src/PowerShellEditorServices/Services/TextDocument/TokenOperations.cs @@ -25,9 +25,7 @@ internal static class TokenOperations /// /// Extracts all of the unique foldable regions in a script given the list tokens /// -#pragma warning disable CA1502 // Cyclomatic complexity we don't care about internal static FoldingReferenceList FoldableReferences(Token[] tokens) -#pragma warning restore CA1502 { FoldingReferenceList refList = new(); diff --git a/src/PowerShellEditorServices/Services/Workspace/RemoteFileManagerService.cs b/src/PowerShellEditorServices/Services/Workspace/RemoteFileManagerService.cs index a3e46f4f1..961338023 100644 --- a/src/PowerShellEditorServices/Services/Workspace/RemoteFileManagerService.cs +++ b/src/PowerShellEditorServices/Services/Workspace/RemoteFileManagerService.cs @@ -252,6 +252,7 @@ function New-EditorFile { /// /// The IEditorOperations instance to use for opening/closing files in the editor. /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD110:Observe result of async calls", Justification = "Intentionally fire and forget.")] public RemoteFileManagerService( ILoggerFactory factory, IRunspaceContext runspaceContext, @@ -275,7 +276,6 @@ public RemoteFileManagerService( // Delete existing temporary file cache path if it already exists TryDeleteTemporaryPath(); - // TODO: Do this somewhere other than the constructor and make it async // Register the psedit function in the current runspace RegisterPSEditFunctionAsync().HandleErrorsAsync(logger); } @@ -519,6 +519,8 @@ private RemotePathMappings GetPathMappings(IRunspaceInfo runspaceInfo) return remotePathMappings; } + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD002:Avoid problematic synchronous waits", Justification = "Supporting synchronous API.")] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD110:Observe result of async calls", Justification = "Intentionally fire and forget.")] private void HandleRunspaceChanged(object sender, RunspaceChangedEventArgs e) { if (e.ChangeAction == RunspaceChangeAction.Enter) @@ -572,6 +574,7 @@ private static bool ShouldTearDownRemoteFiles(RunspaceChangedEventArgs runspaceC StringComparison.CurrentCultureIgnoreCase); } + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD100:Avoid async void methods", Justification = "It has to be async.")] private async void HandlePSEventReceivedAsync(object sender, PSEventArgs args) { if (!string.Equals(RemoteSessionOpenFile, args.SourceIdentifier, StringComparison.CurrentCultureIgnoreCase)) diff --git a/src/PowerShellEditorServices/Utility/AsyncUtils.cs b/src/PowerShellEditorServices/Utility/AsyncUtils.cs index c3f146bb7..c94023a7e 100644 --- a/src/PowerShellEditorServices/Utility/AsyncUtils.cs +++ b/src/PowerShellEditorServices/Utility/AsyncUtils.cs @@ -33,6 +33,7 @@ internal static Task HandleErrorsAsync( : LogTaskErrors(task, logger, callerName, callerSourceFile, callerLineNumber); } + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD003:Avoid awaiting foreign Tasks", Justification = "It's a wrapper.")] private static async Task LogTaskErrors(Task task, ILogger logger, string callerName, string callerSourceFile, int callerLineNumber) { try diff --git a/test/PowerShellEditorServices.Test.E2E/Processes/StdioServerProcess.cs b/test/PowerShellEditorServices.Test.E2E/Processes/StdioServerProcess.cs index 0cfc516ec..9cc19810b 100644 --- a/test/PowerShellEditorServices.Test.E2E/Processes/StdioServerProcess.cs +++ b/test/PowerShellEditorServices.Test.E2E/Processes/StdioServerProcess.cs @@ -23,9 +23,8 @@ public class StdioServerProcess : ServerProcess /// /// The current server process (if any). /// -#pragma warning disable CA2213 + [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "CA2213:Disposable fields should be disposed", Justification = "It is diposed but with a lock.")] private Process _serverProcess; -#pragma warning restore CA2213 /// /// Create a new . From 95c0af57944dcdb9376918fc54ec42eeea7c5197 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Tue, 16 Apr 2024 09:57:05 -0700 Subject: [PATCH 12/88] Fix OneBranch signing certificate Which was silently broken due to a typo :( --- .pipelines/PowerShellEditorServices-Official.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pipelines/PowerShellEditorServices-Official.yml b/.pipelines/PowerShellEditorServices-Official.yml index e22560e72..8e3f998d1 100644 --- a/.pipelines/PowerShellEditorServices-Official.yml +++ b/.pipelines/PowerShellEditorServices-Official.yml @@ -103,7 +103,7 @@ extends: displayName: Sign 1st-party files inputs: command: sign - signing_environment: external_distribution + signing_profile: external_distribution search_root: $(Build.SourcesDirectory)/module files_to_sign: | **/*.ps1; @@ -111,12 +111,12 @@ extends: **/*.psm1; **/*.ps1xml; **/Microsoft.PowerShell.EditorServices*.dll; - !Plaster/*; + !Plaster/**; - task: onebranch.pipeline.signing@1 displayName: Sign 3rd-party files inputs: command: sign - signing_environment: 135020002 + signing_profile: 135020002 search_root: $(Build.SourcesDirectory)/module files_to_sign: | **/MediatR.dll; From 5cdb2682828241ea26dc9a17ab62813b3d64b09e Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Tue, 16 Apr 2024 12:28:46 -0700 Subject: [PATCH 13/88] Remove Plaster integration The project is dormant an longer shipped/signed by Microsoft. --- .../PowerShellEditorServices-Official.yml | 4 - modules.json | 4 - .../Server/PsesLanguageServer.cs | 2 - .../Server/PsesServiceCollectionExtensions.cs | 2 - .../Template/Handlers/ITemplateHandlers.cs | 76 ------- .../Template/Handlers/TemplateHandlers.cs | 70 ------ .../Services/Template/TemplateService.cs | 206 ------------------ .../LanguageServerProtocolMessageTests.cs | 21 -- 8 files changed, 385 deletions(-) delete mode 100644 src/PowerShellEditorServices/Services/Template/Handlers/ITemplateHandlers.cs delete mode 100644 src/PowerShellEditorServices/Services/Template/Handlers/TemplateHandlers.cs delete mode 100644 src/PowerShellEditorServices/Services/Template/TemplateService.cs diff --git a/.pipelines/PowerShellEditorServices-Official.yml b/.pipelines/PowerShellEditorServices-Official.yml index 8e3f998d1..f37bc0239 100644 --- a/.pipelines/PowerShellEditorServices-Official.yml +++ b/.pipelines/PowerShellEditorServices-Official.yml @@ -111,7 +111,6 @@ extends: **/*.psm1; **/*.ps1xml; **/Microsoft.PowerShell.EditorServices*.dll; - !Plaster/**; - task: onebranch.pipeline.signing@1 displayName: Sign 3rd-party files inputs: @@ -125,9 +124,6 @@ extends: **/OmniSharp.Extensions*.dll; **/Serilog*.dll; **/System.Reactive.dll; - Plaster/**/*.ps1; - Plaster/**/*.psd1; - Plaster/**/*.psm1; - stage: release dependsOn: build variables: diff --git a/modules.json b/modules.json index a21a350b0..f72a38714 100644 --- a/modules.json +++ b/modules.json @@ -3,10 +3,6 @@ "Version": "1.22.0", "AllowPrerelease": false }, - "Plaster": { - "Version": "1.1.3", - "AllowPrerelease": false - }, "PSReadLine": { "Version": "2.4.0-beta0", "AllowPrerelease": true diff --git a/src/PowerShellEditorServices/Server/PsesLanguageServer.cs b/src/PowerShellEditorServices/Server/PsesLanguageServer.cs index 03cd75307..58d52bb3a 100644 --- a/src/PowerShellEditorServices/Server/PsesLanguageServer.cs +++ b/src/PowerShellEditorServices/Server/PsesLanguageServer.cs @@ -11,7 +11,6 @@ using Microsoft.PowerShell.EditorServices.Services; using Microsoft.PowerShell.EditorServices.Services.Extension; using Microsoft.PowerShell.EditorServices.Services.PowerShell.Host; -using Microsoft.PowerShell.EditorServices.Services.Template; using Newtonsoft.Json.Linq; using OmniSharp.Extensions.JsonRpc; using OmniSharp.Extensions.LanguageServer.Protocol.Server; @@ -112,7 +111,6 @@ public async Task StartAsync() .WithHandler() .WithHandler() .WithHandler() - .WithHandler() .WithHandler() .WithHandler() .WithHandler() diff --git a/src/PowerShellEditorServices/Server/PsesServiceCollectionExtensions.cs b/src/PowerShellEditorServices/Server/PsesServiceCollectionExtensions.cs index 243a9ebf9..82081c341 100644 --- a/src/PowerShellEditorServices/Server/PsesServiceCollectionExtensions.cs +++ b/src/PowerShellEditorServices/Server/PsesServiceCollectionExtensions.cs @@ -10,7 +10,6 @@ using Microsoft.PowerShell.EditorServices.Services.PowerShell.Debugging; using Microsoft.PowerShell.EditorServices.Services.PowerShell.Host; using Microsoft.PowerShell.EditorServices.Services.PowerShell.Runspace; -using Microsoft.PowerShell.EditorServices.Services.Template; using OmniSharp.Extensions.LanguageServer.Protocol.Server; namespace Microsoft.PowerShell.EditorServices.Server @@ -34,7 +33,6 @@ public static IServiceCollection AddPsesLanguageServices( .AddSingleton() .AddSingleton( (provider) => provider.GetService().DebugContext) - .AddSingleton() .AddSingleton() .AddSingleton() .AddSingleton((provider) => diff --git a/src/PowerShellEditorServices/Services/Template/Handlers/ITemplateHandlers.cs b/src/PowerShellEditorServices/Services/Template/Handlers/ITemplateHandlers.cs deleted file mode 100644 index 88ae40789..000000000 --- a/src/PowerShellEditorServices/Services/Template/Handlers/ITemplateHandlers.cs +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using MediatR; -using OmniSharp.Extensions.JsonRpc; - -namespace Microsoft.PowerShell.EditorServices.Services.Template -{ - [Serial] - [Method("powerShell/getProjectTemplates", Direction.ClientToServer)] - internal interface IGetProjectTemplatesHandler : IJsonRpcRequestHandler { } - - [Serial] - [Method("powerShell/newProjectFromTemplate", Direction.ClientToServer)] - internal interface INewProjectFromTemplateHandler : IJsonRpcRequestHandler { } - - internal class GetProjectTemplatesRequest : IRequest - { - public bool IncludeInstalledModules { get; set; } - } - - internal class GetProjectTemplatesResponse - { - public bool NeedsModuleInstall { get; set; } - - public TemplateDetails[] Templates { get; set; } - } - - /// - /// Provides details about a file or project template. - /// - internal class TemplateDetails - { - /// - /// Gets or sets the title of the template. - /// - public string Title { get; set; } - - /// - /// Gets or sets the author of the template. - /// - public string Author { get; set; } - - /// - /// Gets or sets the version of the template. - /// - public string Version { get; set; } - - /// - /// Gets or sets the description of the template. - /// - public string Description { get; set; } - - /// - /// Gets or sets the template's comma-delimited string of tags. - /// - public string Tags { get; set; } - - /// - /// Gets or sets the template's folder path. - /// - public string TemplatePath { get; set; } - } - - internal class NewProjectFromTemplateRequest : IRequest - { - public string DestinationPath { get; set; } - - public string TemplatePath { get; set; } - } - - internal class NewProjectFromTemplateResponse - { - public bool CreationSuccessful { get; set; } - } -} diff --git a/src/PowerShellEditorServices/Services/Template/Handlers/TemplateHandlers.cs b/src/PowerShellEditorServices/Services/Template/Handlers/TemplateHandlers.cs deleted file mode 100644 index 685fda762..000000000 --- a/src/PowerShellEditorServices/Services/Template/Handlers/TemplateHandlers.cs +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Extensions.Logging; -using Microsoft.PowerShell.EditorServices.Logging; - -namespace Microsoft.PowerShell.EditorServices.Services.Template -{ - internal class TemplateHandlers : IGetProjectTemplatesHandler, INewProjectFromTemplateHandler - { - private readonly ILogger _logger; - private readonly TemplateService _templateService; - - public TemplateHandlers( - ILoggerFactory factory, - TemplateService templateService) - { - _logger = factory.CreateLogger(); - _templateService = templateService; - } - - public async Task Handle(GetProjectTemplatesRequest request, CancellationToken cancellationToken) - { - bool plasterInstalled = await _templateService.ImportPlasterIfInstalledAsync().ConfigureAwait(false); - - if (plasterInstalled) - { - TemplateDetails[] availableTemplates = - await _templateService.GetAvailableTemplatesAsync( - request.IncludeInstalledModules).ConfigureAwait(false); - - return new GetProjectTemplatesResponse - { - Templates = availableTemplates - }; - } - - return new GetProjectTemplatesResponse - { - NeedsModuleInstall = true, - Templates = Array.Empty() - }; - } - - [System.Diagnostics.CodeAnalysis.SuppressMessage("Design", "CA1031:Do not catch general exception types", Justification = "Want to log any exception")] - public async Task Handle(NewProjectFromTemplateRequest request, CancellationToken cancellationToken) - { - bool creationSuccessful; - try - { - await _templateService.CreateFromTemplateAsync(request.TemplatePath, request.DestinationPath).ConfigureAwait(false); - creationSuccessful = true; - } - catch (Exception e) - { - // We don't really care if this worked or not but we report status. - _logger.LogException("New plaster template failed.", e); - creationSuccessful = false; - } - - return new NewProjectFromTemplateResponse - { - CreationSuccessful = creationSuccessful - }; - } - } -} diff --git a/src/PowerShellEditorServices/Services/Template/TemplateService.cs b/src/PowerShellEditorServices/Services/Template/TemplateService.cs deleted file mode 100644 index e7295ec8c..000000000 --- a/src/PowerShellEditorServices/Services/Template/TemplateService.cs +++ /dev/null @@ -1,206 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using Microsoft.Extensions.Logging; -using Microsoft.PowerShell.EditorServices.Services.PowerShell; -using Microsoft.PowerShell.EditorServices.Services.PowerShell.Execution; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Management.Automation; -using System.Threading; -using System.Threading.Tasks; - -namespace Microsoft.PowerShell.EditorServices.Services.Template -{ - /// - /// Provides a service for listing PowerShell project templates and creating - /// new projects from those templates. This service leverages the Plaster - /// module for creating projects from templates. - /// - internal class TemplateService - { - #region Private Fields - - private readonly ILogger _logger; - private bool isPlasterLoaded; - private bool? isPlasterInstalled; - private readonly IInternalPowerShellExecutionService _executionService; - - #endregion - - #region Constructors - - /// - /// Creates a new instance of the TemplateService class. - /// - /// The PowerShellContext to use for this service. - /// An ILoggerFactory implementation used for writing log messages. - public TemplateService(IInternalPowerShellExecutionService executionService, ILoggerFactory factory) - { - _logger = factory.CreateLogger(); - _executionService = executionService; - } - - #endregion - - #region Public Methods - - /// - /// Checks if Plaster is installed on the user's machine. - /// - /// A Task that can be awaited until the check is complete. The result will be true if Plaster is installed. - public async Task ImportPlasterIfInstalledAsync() - { - if (!isPlasterInstalled.HasValue) - { - PSCommand psCommand = new(); - - psCommand - .AddCommand("Get-Module") - .AddParameter("ListAvailable") - .AddParameter("Name", "Plaster"); - - psCommand - .AddCommand("Sort-Object") - .AddParameter("Descending") - .AddParameter("Property", "Version"); - - psCommand - .AddCommand("Select-Object") - .AddParameter("First", 1); - - _logger.LogTrace("Checking if Plaster is installed..."); - - IReadOnlyList moduleObject = - await _executionService.ExecutePSCommandAsync( - psCommand, - CancellationToken.None, - new PowerShellExecutionOptions { ThrowOnError = false }) - .ConfigureAwait(false); - - isPlasterInstalled = moduleObject.Count > 0; - _logger.LogTrace("Plaster installed: " + isPlasterInstalled.Value); - - // Attempt to load plaster - if (isPlasterInstalled.Value && !isPlasterLoaded) - { - _logger.LogTrace("Loading Plaster..."); - - psCommand = new PSCommand(); - psCommand - .AddCommand(@"Microsoft.PowerShell.Core\Import-Module") - .AddParameter("ModuleInfo", (PSModuleInfo)moduleObject[0].ImmediateBaseObject) - .AddParameter("PassThru") - .AddParameter("ErrorAction", ActionPreference.Ignore); - - IReadOnlyList plasterModule = - await _executionService.ExecutePSCommandAsync( - psCommand, - CancellationToken.None, - new PowerShellExecutionOptions { ThrowOnError = false }) - .ConfigureAwait(false); - - isPlasterLoaded = plasterModule.Count > 0; - _logger.LogTrace("Plaster loaded: " + isPlasterLoaded); - } - } - - return isPlasterInstalled.Value; - } - - /// - /// Gets the available file or project templates on the user's - /// machine. - /// - /// - /// If true, searches the user's installed PowerShell modules for - /// included templates. - /// - /// A Task which can be awaited for the TemplateDetails list to be returned. - public async Task GetAvailableTemplatesAsync( - bool includeInstalledModules) - { - if (!isPlasterLoaded) - { - throw new InvalidOperationException("Plaster is not loaded, templates cannot be accessed."); - } - - PSCommand psCommand = new(); - psCommand.AddCommand("Get-PlasterTemplate"); - - if (includeInstalledModules) - { - psCommand.AddParameter("IncludeModules"); - } - - IReadOnlyList templateObjects = await _executionService.ExecutePSCommandAsync( - psCommand, - CancellationToken.None).ConfigureAwait(false); - - _logger.LogTrace($"Found {templateObjects.Count} Plaster templates"); - - return - templateObjects - .Select(CreateTemplateDetails) - .ToArray(); - } - - /// - /// Creates a new file or project from a specified template and - /// places it in the destination path. This ultimately calls - /// Invoke-Plaster in PowerShell. - /// - /// The folder path containing the template. - /// The folder path where the files will be created. - /// A boolean-returning Task which communicates success or failure. - public async Task CreateFromTemplateAsync( - string templatePath, - string destinationPath) - { - _logger.LogTrace( - $"Invoking Plaster...\n\n TemplatePath: {templatePath}\n DestinationPath: {destinationPath}"); - - PSCommand command = new PSCommand() - .AddCommand("Invoke-Plaster") - .AddParameter("TemplatePath", templatePath) - .AddParameter("DestinationPath", destinationPath); - - // This command is interactive so it requires the foreground. - await _executionService.ExecutePSCommandAsync( - command, - CancellationToken.None, - new PowerShellExecutionOptions - { - RequiresForeground = true, - WriteOutputToHost = true, - ThrowOnError = false - }).ConfigureAwait(false); - - // If any errors were written out, creation was not successful - return true; - } - - #endregion - - #region Private Methods - - private static TemplateDetails CreateTemplateDetails(PSObject psObject) - { - return new TemplateDetails - { - Title = psObject.Members["Title"].Value as string, - Author = psObject.Members["Author"].Value as string, - Version = psObject.Members["Version"].Value.ToString(), - Description = psObject.Members["Description"].Value as string, - TemplatePath = psObject.Members["TemplatePath"].Value as string, - Tags = - psObject.Members["Tags"].Value is object[] tags - ? string.Join(", ", tags) - : string.Empty - }; - } - - #endregion - } -} diff --git a/test/PowerShellEditorServices.Test.E2E/LanguageServerProtocolMessageTests.cs b/test/PowerShellEditorServices.Test.E2E/LanguageServerProtocolMessageTests.cs index 3c49ca805..6e8d3ff62 100644 --- a/test/PowerShellEditorServices.Test.E2E/LanguageServerProtocolMessageTests.cs +++ b/test/PowerShellEditorServices.Test.E2E/LanguageServerProtocolMessageTests.cs @@ -14,7 +14,6 @@ using Microsoft.PowerShell.EditorServices.Handlers; using Microsoft.PowerShell.EditorServices.Services.Configuration; using Microsoft.PowerShell.EditorServices.Services.PowerShell; -using Microsoft.PowerShell.EditorServices.Services.Template; using Newtonsoft.Json.Linq; using OmniSharp.Extensions.LanguageServer.Protocol; using OmniSharp.Extensions.LanguageServer.Protocol.Client; @@ -1213,26 +1212,6 @@ await PsesLanguageClient Assert.Equal(33, locationOrLocationLink.Location.Range.End.Character); } - [SkippableFact] - public async Task CanSendGetProjectTemplatesRequestAsync() - { - Skip.If(PsesStdioProcess.RunningInConstrainedLanguageMode, - "Plaster doesn't work in Constrained Language Mode."); - - GetProjectTemplatesResponse getProjectTemplatesResponse = - await PsesLanguageClient - .SendRequest( - "powerShell/getProjectTemplates", - new GetProjectTemplatesRequest - { - IncludeInstalledModules = true - }) - .Returning(CancellationToken.None); - - Assert.Contains(getProjectTemplatesResponse.Templates, t => t.Title is "AddPSScriptAnalyzerSettings"); - Assert.Contains(getProjectTemplatesResponse.Templates, t => t.Title is "New PowerShell Manifest Module"); - } - [SkippableFact] public async Task CanSendGetCommentHelpRequestAsync() { From 4317c8b2ad5542bf2197be43822c14a50e89e7c1 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Tue, 16 Apr 2024 10:01:40 -0700 Subject: [PATCH 14/88] v3.20.0: Hotfix for incorrect signing certificate --- CHANGELOG.md | 9 +++++++++ PowerShellEditorServices.Common.props | 2 +- .../PowerShellEditorServices.psd1 | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bf5c3f4ee..b50ec8ab7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # PowerShell Editor Services Release History +## v3.20.0 +### Tuesday, April 16, 2024 + +See more details at the GitHub Release for [v3.20.0](https://github.com/PowerShell/PowerShellEditorServices/releases/tag/v3.20.0). + +Hotfix for incorrect signing certificate, sorry about that! + +Also removed Plaster integration as we were unable to correctly sign it since we no longer own it. + ## v3.19.0 ### Wednesday, April 03, 2024 diff --git a/PowerShellEditorServices.Common.props b/PowerShellEditorServices.Common.props index 6681ee99a..28e7293ce 100644 --- a/PowerShellEditorServices.Common.props +++ b/PowerShellEditorServices.Common.props @@ -1,6 +1,6 @@ - 3.19.0 + 3.20.0 Microsoft © Microsoft Corporation. diff --git a/module/PowerShellEditorServices/PowerShellEditorServices.psd1 b/module/PowerShellEditorServices/PowerShellEditorServices.psd1 index 0dbfcdae0..4637aec33 100644 --- a/module/PowerShellEditorServices/PowerShellEditorServices.psd1 +++ b/module/PowerShellEditorServices/PowerShellEditorServices.psd1 @@ -19,7 +19,7 @@ RootModule = if ($PSEdition -eq 'Core') } # Version number of this module. -ModuleVersion = '3.19.0' +ModuleVersion = '3.20.0' # ID used to uniquely identify this module GUID = '9ca15887-53a2-479a-9cda-48d26bcb6c47' From 5b373447d24df9ff27f574ed1326aef22d3520a8 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Wed, 17 Apr 2024 12:58:24 -0700 Subject: [PATCH 15/88] Fix CI by removing Azure Artifacts Feeds (#2160) Until it's figured out how we're supposed to use these on GitHub. --- .github/workflows/ci-test.yml | 7 ++++--- .github/workflows/codeql-analysis.yml | 7 ++++--- .github/workflows/emacs-test.yml | 7 ++++--- .github/workflows/vim-test.yml | 7 ++++--- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/.github/workflows/ci-test.yml b/.github/workflows/ci-test.yml index fd93eb384..62d266d2f 100644 --- a/.github/workflows/ci-test.yml +++ b/.github/workflows/ci-test.yml @@ -37,9 +37,10 @@ jobs: 6.0.x 7.0.x 8.0.x - source-url: https://pkgs.dev.azure.com/mscodehub/PowerShellCore/_packaging/PowerShellCore_PublicPackages/nuget/v3/index.json - env: - NUGET_AUTH_TOKEN: ${{ secrets.AZURE_NUGET_TOKEN }} + + - name: Remove Azure Artifact Feed configurations + shell: pwsh + run: Remove-Item ./NuGet.Config - name: Install PSResources shell: pwsh diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 018eaaa77..4d260d9d3 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -33,9 +33,10 @@ jobs: with: cache: true cache-dependency-path: '**/packages.lock.json' - source-url: https://pkgs.dev.azure.com/mscodehub/PowerShellCore/_packaging/PowerShellCore_PublicPackages/nuget/v3/index.json - env: - NUGET_AUTH_TOKEN: ${{ secrets.AZURE_NUGET_TOKEN }} + + - name: Remove Azure Artifact Feed configurations + shell: pwsh + run: Remove-Item ./NuGet.Config - name: Initialize CodeQL uses: github/codeql-action/init@v3 diff --git a/.github/workflows/emacs-test.yml b/.github/workflows/emacs-test.yml index 31f840581..228343984 100644 --- a/.github/workflows/emacs-test.yml +++ b/.github/workflows/emacs-test.yml @@ -27,9 +27,10 @@ jobs: with: cache: true cache-dependency-path: '**/packages.lock.json' - source-url: https://pkgs.dev.azure.com/mscodehub/PowerShellCore/_packaging/PowerShellCore_PublicPackages/nuget/v3/index.json - env: - NUGET_AUTH_TOKEN: ${{ secrets.AZURE_NUGET_TOKEN }} + + - name: Remove Azure Artifact Feed configurations + shell: pwsh + run: Remove-Item ./NuGet.Config - name: Install PSResources shell: pwsh diff --git a/.github/workflows/vim-test.yml b/.github/workflows/vim-test.yml index b434fcb45..f347104c1 100644 --- a/.github/workflows/vim-test.yml +++ b/.github/workflows/vim-test.yml @@ -27,9 +27,10 @@ jobs: with: cache: true cache-dependency-path: '**/packages.lock.json' - source-url: https://pkgs.dev.azure.com/mscodehub/PowerShellCore/_packaging/PowerShellCore_PublicPackages/nuget/v3/index.json - env: - NUGET_AUTH_TOKEN: ${{ secrets.AZURE_NUGET_TOKEN }} + + - name: Remove Azure Artifact Feed configurations + shell: pwsh + run: Remove-Item ./NuGet.Config - name: Install PSResources shell: pwsh From c27a92b61a24b201d653ea23a5a98345fae99605 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Tue, 23 Apr 2024 13:52:35 -0700 Subject: [PATCH 16/88] Enable CodeQL weekly scan --- .github/workflows/codeql-analysis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 4d260d9d3..82e7d0fc6 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -7,6 +7,8 @@ on: # The branches below must be a subset of the branches above branches: [ main ] paths-ignore: [ '**/*.md' ] + schedule: + - cron: '35 13 * * 4' jobs: analyze: From ea5f3f01f198a416589a302e26df85cbff331d16 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Thu, 25 Apr 2024 18:52:17 -0700 Subject: [PATCH 17/88] Use public CFS feed and remove NuGet lockfiles (#2161) Partially reverts commit 5b373447d24df9ff27f574ed1326aef22d3520a8. --- .github/dependabot.yml | 8 - .github/workflows/ci-test.yml | 6 +- .github/workflows/codeql-analysis.yml | 6 +- .github/workflows/emacs-test.yml | 6 +- .github/workflows/vim-test.yml | 6 +- PowerShellEditorServices.Common.props | 2 - NuGet.Config => nuget.config | 2 +- .../packages.lock.json | 979 ---- .../packages.lock.json | 446 -- .../packages.lock.json | 500 --- .../packages.lock.json | 451 -- .../packages.lock.json | 3942 ----------------- 12 files changed, 5 insertions(+), 6349 deletions(-) rename NuGet.Config => nuget.config (64%) delete mode 100644 src/PowerShellEditorServices.Hosting/packages.lock.json delete mode 100644 src/PowerShellEditorServices/packages.lock.json delete mode 100644 test/PowerShellEditorServices.Test.E2E/packages.lock.json delete mode 100644 test/PowerShellEditorServices.Test.Shared/packages.lock.json delete mode 100644 test/PowerShellEditorServices.Test/packages.lock.json diff --git a/.github/dependabot.yml b/.github/dependabot.yml index d4c49ec2d..e3a2fb57f 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,15 +1,7 @@ version: 2 -registries: - nuget-azure: - type: nuget-feed - url: https://pkgs.dev.azure.com/mscodehub/PowerShellCore/_packaging/PowerShellCore_PublicPackages/nuget/v3/index.json - username: powershell - password: ${{ secrets.AZURE_NUGET_TOKEN }} updates: - package-ecosystem: nuget directory: "/" - registries: - - nuget-azure labels: [ ] schedule: interval: weekly diff --git a/.github/workflows/ci-test.yml b/.github/workflows/ci-test.yml index 62d266d2f..df7032bbc 100644 --- a/.github/workflows/ci-test.yml +++ b/.github/workflows/ci-test.yml @@ -32,16 +32,12 @@ jobs: uses: actions/setup-dotnet@v4 with: cache: true - cache-dependency-path: '**/packages.lock.json' + cache-dependency-path: '**/*.csproj' dotnet-version: | 6.0.x 7.0.x 8.0.x - - name: Remove Azure Artifact Feed configurations - shell: pwsh - run: Remove-Item ./NuGet.Config - - name: Install PSResources shell: pwsh run: ./tools/installPSResources.ps1 diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 82e7d0fc6..9475151aa 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -34,11 +34,7 @@ jobs: uses: actions/setup-dotnet@v4 with: cache: true - cache-dependency-path: '**/packages.lock.json' - - - name: Remove Azure Artifact Feed configurations - shell: pwsh - run: Remove-Item ./NuGet.Config + cache-dependency-path: '**/*.csproj' - name: Initialize CodeQL uses: github/codeql-action/init@v3 diff --git a/.github/workflows/emacs-test.yml b/.github/workflows/emacs-test.yml index 228343984..3f3ec37a9 100644 --- a/.github/workflows/emacs-test.yml +++ b/.github/workflows/emacs-test.yml @@ -26,11 +26,7 @@ jobs: uses: actions/setup-dotnet@v4 with: cache: true - cache-dependency-path: '**/packages.lock.json' - - - name: Remove Azure Artifact Feed configurations - shell: pwsh - run: Remove-Item ./NuGet.Config + cache-dependency-path: '**/*.csproj' - name: Install PSResources shell: pwsh diff --git a/.github/workflows/vim-test.yml b/.github/workflows/vim-test.yml index f347104c1..88e0d4f03 100644 --- a/.github/workflows/vim-test.yml +++ b/.github/workflows/vim-test.yml @@ -26,11 +26,7 @@ jobs: uses: actions/setup-dotnet@v4 with: cache: true - cache-dependency-path: '**/packages.lock.json' - - - name: Remove Azure Artifact Feed configurations - shell: pwsh - run: Remove-Item ./NuGet.Config + cache-dependency-path: '**/*.csproj' - name: Install PSResources shell: pwsh diff --git a/PowerShellEditorServices.Common.props b/PowerShellEditorServices.Common.props index 28e7293ce..a362992a8 100644 --- a/PowerShellEditorServices.Common.props +++ b/PowerShellEditorServices.Common.props @@ -11,8 +11,6 @@ git https://github.com/PowerShell/PowerShellEditorServices portable - - true true true diff --git a/NuGet.Config b/nuget.config similarity index 64% rename from NuGet.Config rename to nuget.config index f04dcd513..f003b0fbd 100644 --- a/NuGet.Config +++ b/nuget.config @@ -2,6 +2,6 @@ - + diff --git a/src/PowerShellEditorServices.Hosting/packages.lock.json b/src/PowerShellEditorServices.Hosting/packages.lock.json deleted file mode 100644 index 8be3c7711..000000000 --- a/src/PowerShellEditorServices.Hosting/packages.lock.json +++ /dev/null @@ -1,979 +0,0 @@ -{ - "version": 1, - "dependencies": { - ".NETFramework,Version=v4.6.2": { - "Microsoft.NETFramework.ReferenceAssemblies": { - "type": "Direct", - "requested": "[1.0.3, )", - "resolved": "1.0.3", - "contentHash": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==", - "dependencies": { - "Microsoft.NETFramework.ReferenceAssemblies.net462": "1.0.3" - } - }, - "NETStandard.Library": { - "type": "Direct", - "requested": "[2.0.3, )", - "resolved": "2.0.3", - "contentHash": "st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0" - } - }, - "PowerShellStandard.Library": { - "type": "Direct", - "requested": "[5.1.1, )", - "resolved": "5.1.1", - "contentHash": "e31xJjG+Kjbv6YF3Yq6D4Dl3or8v7LrNF41k3CXrWozW6hR1zcOe5KYuZJaGSiAgLnwP8wcW+I3+IWEzMPZKXQ==" - }, - "System.IO.Pipes.AccessControl": { - "type": "Direct", - "requested": "[5.0.0, )", - "resolved": "5.0.0", - "contentHash": "P0FIsXSFNL1AXlHO9zpJ9atRUzVyoPZCkcbkYGZfXXMx9xlGA2H3HOGBwIhpKhB+h0eL3hry/z0UcfJZ+yb2kQ==", - "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Runtime.InteropServices.RuntimeInformation": { - "type": "Direct", - "requested": "[4.3.0, )", - "resolved": "4.3.0", - "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==" - }, - "System.ValueTuple": { - "type": "Direct", - "requested": "[4.5.0, )", - "resolved": "4.5.0", - "contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==" - }, - "MediatR": { - "type": "Transitive", - "resolved": "8.1.0", - "contentHash": "KJFnA0MV83bNOhvYbjIX1iDykhwFXoQu0KV7E1SVbNA/CmO2I7SAm2Baly0eS7VJ2GwlmStLajBfeiNgTpvYzQ==" - }, - "Microsoft.Bcl.AsyncInterfaces": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==", - "dependencies": { - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.CSharp": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" - }, - "Microsoft.Extensions.Configuration": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "BUyFU9t+HzlSE7ri4B+AQN2BgTgHv/uM82s5ZkgU1BApyzWzIl48nDsG5wR1t0pniNuuyTBzG3qCW8152/NtSw==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0", - "System.ValueTuple": "4.5.0" - } - }, - "Microsoft.Extensions.Configuration.Binder": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.Extensions.FileSystemGlobbing": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" - }, - "Microsoft.Extensions.Logging": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.Extensions.DependencyInjection": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "System.Diagnostics.DiagnosticSource": "8.0.0", - "System.ValueTuple": "4.5.0" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "System.Buffers": "4.5.1", - "System.Memory": "4.5.5" - } - }, - "Microsoft.Extensions.Options": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0", - "System.ValueTuple": "4.5.0" - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "bXWINbTn0vC0FYc9GaQTISbxhQLAMrvtbuvD9N6JelEaIS/Pr62wUCinrq5bf1WRBGczt1v4wDhxFtVFNcMdUQ==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==", - "dependencies": { - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" - }, - "Microsoft.NETFramework.ReferenceAssemblies.net462": { - "type": "Transitive", - "resolved": "1.0.3", - "contentHash": "IzAV30z22ESCeQfxP29oVf4qEo8fBGXLXSU6oacv/9Iqe6PzgHDKCaWfwMBak7bSJQM0F5boXWoZS+kChztRIQ==" - }, - "Microsoft.VisualStudio.Threading": { - "type": "Transitive", - "resolved": "17.6.40", - "contentHash": "hLa/0xargG7p3bF7aeq2/lRYn/bVnfZXurUWVHx+MNqxxAUjIDMKi4OIOWbYQ/DTkbn9gv8TLvgso+6EtHVQQg==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "Microsoft.VisualStudio.Threading.Analyzers": "17.6.40", - "Microsoft.VisualStudio.Validation": "17.0.71", - "Microsoft.Win32.Registry": "5.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.VisualStudio.Threading.Analyzers": { - "type": "Transitive", - "resolved": "17.6.40", - "contentHash": "uU8vYr/Nx3ldEWcsbiHiyAX1G7od3eFK1+Aga6ZvgCvU+nQkcXYVkIMcSEkIDWkFaldx1dkoVvX3KRNQD0R7dw==" - }, - "Microsoft.VisualStudio.Validation": { - "type": "Transitive", - "resolved": "17.6.11", - "contentHash": "J+9L/iac6c8cwcgVSCMuoIYOlD1Jw4mbZ8XMe1IZVj8p8+3dJ46LnnkIkTRMjK7xs9UtU9MoUp1JGhWoN6fAEw==" - }, - "Microsoft.Win32.Registry": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", - "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "Nerdbank.Streams": { - "type": "Transitive", - "resolved": "2.10.69", - "contentHash": "YIudzeVyQRJAqytjpo1jdHkh2t+vqQqyusBqb2sFSOAOGEnyOXhcHx/rQqSuCIXUDr50a3XuZnamGRfQVBOf4g==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "Microsoft.VisualStudio.Threading": "17.6.40", - "Microsoft.VisualStudio.Validation": "17.6.11", - "System.IO.Pipelines": "7.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "Newtonsoft.Json": { - "type": "Transitive", - "resolved": "13.0.3", - "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" - }, - "OmniSharp.Extensions.DebugAdapter": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "Jy9RlVei7ay3LavvPH4F8BnIIMAo5th5EI8JnVe1RQlOxvu18H8hOyZ8fLFHtzbObs+oTONsJ9aynqeyMOErgA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.JsonRpc.Generators": "0.19.9" - } - }, - "OmniSharp.Extensions.DebugAdapter.Server": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "XRJ6EW44DaODkzjAuN1XbpnPFkciJIM2sIx4KpsvV/2Rle1CdRJY4gA6vJn+2uNh5hRr1d0SqZSieqV9Ly0utw==", - "dependencies": { - "OmniSharp.Extensions.DebugAdapter.Shared": "0.19.9" - } - }, - "OmniSharp.Extensions.DebugAdapter.Shared": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "A4psuqk+slrs585cCkZkwUO08nW0I6SVH4u7B7d8wU9lH0LLRTvQBlo3QlxrVAMxjwljPFzXaaRHv7D7X1BXbw==", - "dependencies": { - "OmniSharp.Extensions.DebugAdapter": "0.19.9", - "OmniSharp.Extensions.JsonRpc": "0.19.9" - } - }, - "OmniSharp.Extensions.JsonRpc": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "utFvrx9OYXhCS5rnfWAVeedJCrucuDLAOrKXjohf/NOjG9FFVbcp+hLqj9Ng+AxoADRD+rSJYHfBOeqGl5zW0A==", - "dependencies": { - "MediatR": "8.1.0", - "Microsoft.Extensions.DependencyInjection": "6.0.1", - "Microsoft.Extensions.Logging": "6.0.0", - "Nerdbank.Streams": "2.10.69", - "Newtonsoft.Json": "13.0.3", - "OmniSharp.Extensions.JsonRpc.Generators": "0.19.9", - "System.Collections.Immutable": "5.0.0", - "System.Reactive": "6.0.0", - "System.Threading.Channels": "6.0.0" - } - }, - "OmniSharp.Extensions.JsonRpc.Generators": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "hiWC0yGcKM+K00fgiL7KBmlvULmkKNhm40ZSzxqT+jNV21r+YZgKzEREhQe40ufb4tjcIxdYkif++IzGl/3H/Q==" - }, - "OmniSharp.Extensions.LanguageProtocol": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "d0crY6w5SyunGlERP27YeUeJnJfUjvJoALFlPMU4CHu3jovG1Y8RxLpihCPX8fKdjzgy7Ii+VjFYtIpDEEQqYQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.JsonRpc.Generators": "0.19.9" - } - }, - "OmniSharp.Extensions.LanguageServer": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "g09wOOCQ/oFqtZ47Q5R9E78tz2a5ODEB+V+S65wAiiRskR7xwL78Tse4/8ToBc8G/ZgQgqLtAOPo/BSPmHNlbw==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.LanguageProtocol": "0.19.9", - "OmniSharp.Extensions.LanguageServer.Shared": "0.19.9" - } - }, - "OmniSharp.Extensions.LanguageServer.Shared": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "+p+py79MrNG3QnqRrBp5J7Wc810HFFczMH8/WLIiUqih1bqmKPFY9l/uzBvq1Ko8+YO/8tzI7BDffHvaguISEw==", - "dependencies": { - "OmniSharp.Extensions.LanguageProtocol": "0.19.9" - } - }, - "Serilog": { - "type": "Transitive", - "resolved": "3.1.1", - "contentHash": "P6G4/4Kt9bT635bhuwdXlJ2SCqqn2nhh4gqFqQueCOr9bK/e7W9ll/IoX1Ter948cV2Z/5+5v8pAfJYUISY03A==", - "dependencies": { - "System.Diagnostics.DiagnosticSource": "7.0.2", - "System.ValueTuple": "4.5.0" - } - }, - "Serilog.Extensions.Logging": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "YEAMWu1UnWgf1c1KP85l1SgXGfiVo0Rz6x08pCiPOIBt2Qe18tcZLvdBUuV5o1QHvrs8FAry9wTIhgBRtjIlEg==", - "dependencies": { - "Microsoft.Extensions.Logging": "8.0.0", - "Serilog": "3.1.1" - } - }, - "Serilog.Sinks.Async": { - "type": "Transitive", - "resolved": "1.5.0", - "contentHash": "csHYIqAwI4Gy9oAhXYRwxGrQEAtBg3Ep7WaCzsnA1cZuBZjVAU0n7hWaJhItjO7hbLHh/9gRVxALCUB4Dv+gZw==", - "dependencies": { - "Serilog": "2.9.0" - } - }, - "Serilog.Sinks.File": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "uwV5hdhWPwUH1szhO8PJpFiahqXmzPzJT/sOijH/kFgUx+cyoDTMM8MHD0adw9+Iem6itoibbUXHYslzXsLEAg==", - "dependencies": { - "Serilog": "2.10.0" - } - }, - "System.Buffers": { - "type": "Transitive", - "resolved": "4.5.1", - "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" - }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g==", - "dependencies": { - "System.Memory": "4.5.4" - } - }, - "System.Diagnostics.DiagnosticSource": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==", - "dependencies": { - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "jRn6JYnNPW6xgQazROBLSfpdoczRw694vO5kKvMcNnpXuolEixUyw6IBuBs2Y2mlSX/LdLvyyWmfXhaI3ND1Yg==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.5", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "System.Memory": { - "type": "Transitive", - "resolved": "4.5.5", - "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Numerics.Vectors": "4.5.0", - "System.Runtime.CompilerServices.Unsafe": "4.5.3" - } - }, - "System.Numerics.Vectors": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" - }, - "System.Reactive": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "31kfaW4ZupZzPsI5PVe77VhnvFF55qgma7KZr/E0iFTs6fmdhhG8j0mgEx620iLTey1EynOkEfnyTjtNEpJzGw==", - "dependencies": { - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" - }, - "System.Security.AccessControl": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", - "dependencies": { - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Security.Principal": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==" - }, - "System.Security.Principal.Windows": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" - }, - "System.Threading.Channels": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==", - "dependencies": { - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "System.Threading.Tasks.Extensions": { - "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "4.5.3" - } - }, - "Microsoft.PowerShell.EditorServices": { - "type": "Project", - "dependencies": { - "Microsoft.CSharp": "[4.7.0, )", - "Microsoft.Extensions.FileSystemGlobbing": "[8.0.0, )", - "Microsoft.Extensions.Logging": "[8.0.0, )", - "OmniSharp.Extensions.DebugAdapter.Server": "[0.19.9, )", - "OmniSharp.Extensions.LanguageServer": "[0.19.9, )", - "PowerShellStandard.Library": "[5.1.1, )", - "Serilog": "[3.1.1, )", - "Serilog.Extensions.Logging": "[8.0.0, )", - "Serilog.Sinks.Async": "[1.5.0, )", - "Serilog.Sinks.File": "[5.0.0, )", - "System.IO.Pipes.AccessControl": "[5.0.0, )", - "System.Security.Principal": "[4.3.0, )", - "System.Security.Principal.Windows": "[5.0.0, )" - } - } - }, - "net6.0": { - "NETStandard.Library": { - "type": "Direct", - "requested": "[2.0.3, )", - "resolved": "2.0.3", - "contentHash": "st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0" - } - }, - "PowerShellStandard.Library": { - "type": "Direct", - "requested": "[5.1.1, )", - "resolved": "5.1.1", - "contentHash": "e31xJjG+Kjbv6YF3Yq6D4Dl3or8v7LrNF41k3CXrWozW6hR1zcOe5KYuZJaGSiAgLnwP8wcW+I3+IWEzMPZKXQ==" - }, - "System.IO.Pipes.AccessControl": { - "type": "Direct", - "requested": "[5.0.0, )", - "resolved": "5.0.0", - "contentHash": "P0FIsXSFNL1AXlHO9zpJ9atRUzVyoPZCkcbkYGZfXXMx9xlGA2H3HOGBwIhpKhB+h0eL3hry/z0UcfJZ+yb2kQ==", - "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Runtime.InteropServices.RuntimeInformation": { - "type": "Direct", - "requested": "[4.3.0, )", - "resolved": "4.3.0", - "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", - "dependencies": { - "System.Reflection": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Resources.ResourceManager": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Threading": "4.3.0", - "runtime.native.System": "4.3.0" - } - }, - "MediatR": { - "type": "Transitive", - "resolved": "8.1.0", - "contentHash": "KJFnA0MV83bNOhvYbjIX1iDykhwFXoQu0KV7E1SVbNA/CmO2I7SAm2Baly0eS7VJ2GwlmStLajBfeiNgTpvYzQ==" - }, - "Microsoft.Bcl.AsyncInterfaces": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "3aeMZ1N0lJoSyzqiP03hqemtb1BijhsJADdobn/4nsMJ8V1H+CrpuduUe4hlRdx+ikBQju1VGjMD1GJ3Sk05Eg==" - }, - "Microsoft.CSharp": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" - }, - "Microsoft.Extensions.Configuration": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "BUyFU9t+HzlSE7ri4B+AQN2BgTgHv/uM82s5ZkgU1BApyzWzIl48nDsG5wR1t0pniNuuyTBzG3qCW8152/NtSw==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Configuration.Binder": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" - }, - "Microsoft.Extensions.FileSystemGlobbing": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" - }, - "Microsoft.Extensions.Logging": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" - } - }, - "Microsoft.Extensions.Options": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "bXWINbTn0vC0FYc9GaQTISbxhQLAMrvtbuvD9N6JelEaIS/Pr62wUCinrq5bf1WRBGczt1v4wDhxFtVFNcMdUQ==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, - "Microsoft.VisualStudio.Threading": { - "type": "Transitive", - "resolved": "17.6.40", - "contentHash": "hLa/0xargG7p3bF7aeq2/lRYn/bVnfZXurUWVHx+MNqxxAUjIDMKi4OIOWbYQ/DTkbn9gv8TLvgso+6EtHVQQg==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "Microsoft.VisualStudio.Threading.Analyzers": "17.6.40", - "Microsoft.VisualStudio.Validation": "17.0.71", - "Microsoft.Win32.Registry": "5.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.VisualStudio.Threading.Analyzers": { - "type": "Transitive", - "resolved": "17.6.40", - "contentHash": "uU8vYr/Nx3ldEWcsbiHiyAX1G7od3eFK1+Aga6ZvgCvU+nQkcXYVkIMcSEkIDWkFaldx1dkoVvX3KRNQD0R7dw==" - }, - "Microsoft.VisualStudio.Validation": { - "type": "Transitive", - "resolved": "17.6.11", - "contentHash": "J+9L/iac6c8cwcgVSCMuoIYOlD1Jw4mbZ8XMe1IZVj8p8+3dJ46LnnkIkTRMjK7xs9UtU9MoUp1JGhWoN6fAEw==" - }, - "Microsoft.Win32.Registry": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", - "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "Nerdbank.Streams": { - "type": "Transitive", - "resolved": "2.10.69", - "contentHash": "YIudzeVyQRJAqytjpo1jdHkh2t+vqQqyusBqb2sFSOAOGEnyOXhcHx/rQqSuCIXUDr50a3XuZnamGRfQVBOf4g==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "Microsoft.VisualStudio.Threading": "17.6.40", - "Microsoft.VisualStudio.Validation": "17.6.11", - "System.IO.Pipelines": "7.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "Newtonsoft.Json": { - "type": "Transitive", - "resolved": "13.0.3", - "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" - }, - "OmniSharp.Extensions.DebugAdapter": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "Jy9RlVei7ay3LavvPH4F8BnIIMAo5th5EI8JnVe1RQlOxvu18H8hOyZ8fLFHtzbObs+oTONsJ9aynqeyMOErgA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.JsonRpc.Generators": "0.19.9" - } - }, - "OmniSharp.Extensions.DebugAdapter.Server": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "XRJ6EW44DaODkzjAuN1XbpnPFkciJIM2sIx4KpsvV/2Rle1CdRJY4gA6vJn+2uNh5hRr1d0SqZSieqV9Ly0utw==", - "dependencies": { - "OmniSharp.Extensions.DebugAdapter.Shared": "0.19.9" - } - }, - "OmniSharp.Extensions.DebugAdapter.Shared": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "A4psuqk+slrs585cCkZkwUO08nW0I6SVH4u7B7d8wU9lH0LLRTvQBlo3QlxrVAMxjwljPFzXaaRHv7D7X1BXbw==", - "dependencies": { - "OmniSharp.Extensions.DebugAdapter": "0.19.9", - "OmniSharp.Extensions.JsonRpc": "0.19.9" - } - }, - "OmniSharp.Extensions.JsonRpc": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "utFvrx9OYXhCS5rnfWAVeedJCrucuDLAOrKXjohf/NOjG9FFVbcp+hLqj9Ng+AxoADRD+rSJYHfBOeqGl5zW0A==", - "dependencies": { - "MediatR": "8.1.0", - "Microsoft.Extensions.DependencyInjection": "6.0.1", - "Microsoft.Extensions.Logging": "6.0.0", - "Nerdbank.Streams": "2.10.69", - "Newtonsoft.Json": "13.0.3", - "OmniSharp.Extensions.JsonRpc.Generators": "0.19.9", - "System.Collections.Immutable": "5.0.0", - "System.Reactive": "6.0.0", - "System.Threading.Channels": "6.0.0" - } - }, - "OmniSharp.Extensions.JsonRpc.Generators": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "hiWC0yGcKM+K00fgiL7KBmlvULmkKNhm40ZSzxqT+jNV21r+YZgKzEREhQe40ufb4tjcIxdYkif++IzGl/3H/Q==" - }, - "OmniSharp.Extensions.LanguageProtocol": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "d0crY6w5SyunGlERP27YeUeJnJfUjvJoALFlPMU4CHu3jovG1Y8RxLpihCPX8fKdjzgy7Ii+VjFYtIpDEEQqYQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.JsonRpc.Generators": "0.19.9" - } - }, - "OmniSharp.Extensions.LanguageServer": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "g09wOOCQ/oFqtZ47Q5R9E78tz2a5ODEB+V+S65wAiiRskR7xwL78Tse4/8ToBc8G/ZgQgqLtAOPo/BSPmHNlbw==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.LanguageProtocol": "0.19.9", - "OmniSharp.Extensions.LanguageServer.Shared": "0.19.9" - } - }, - "OmniSharp.Extensions.LanguageServer.Shared": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "+p+py79MrNG3QnqRrBp5J7Wc810HFFczMH8/WLIiUqih1bqmKPFY9l/uzBvq1Ko8+YO/8tzI7BDffHvaguISEw==", - "dependencies": { - "OmniSharp.Extensions.LanguageProtocol": "0.19.9" - } - }, - "runtime.native.System": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "Serilog": { - "type": "Transitive", - "resolved": "3.1.1", - "contentHash": "P6G4/4Kt9bT635bhuwdXlJ2SCqqn2nhh4gqFqQueCOr9bK/e7W9ll/IoX1Ter948cV2Z/5+5v8pAfJYUISY03A==" - }, - "Serilog.Extensions.Logging": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "YEAMWu1UnWgf1c1KP85l1SgXGfiVo0Rz6x08pCiPOIBt2Qe18tcZLvdBUuV5o1QHvrs8FAry9wTIhgBRtjIlEg==", - "dependencies": { - "Microsoft.Extensions.Logging": "8.0.0", - "Serilog": "3.1.1" - } - }, - "Serilog.Sinks.Async": { - "type": "Transitive", - "resolved": "1.5.0", - "contentHash": "csHYIqAwI4Gy9oAhXYRwxGrQEAtBg3Ep7WaCzsnA1cZuBZjVAU0n7hWaJhItjO7hbLHh/9gRVxALCUB4Dv+gZw==", - "dependencies": { - "Serilog": "2.9.0" - } - }, - "Serilog.Sinks.File": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "uwV5hdhWPwUH1szhO8PJpFiahqXmzPzJT/sOijH/kFgUx+cyoDTMM8MHD0adw9+Iem6itoibbUXHYslzXsLEAg==", - "dependencies": { - "Serilog": "2.10.0" - } - }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g==" - }, - "System.Globalization": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.IO": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "jRn6JYnNPW6xgQazROBLSfpdoczRw694vO5kKvMcNnpXuolEixUyw6IBuBs2Y2mlSX/LdLvyyWmfXhaI3ND1Yg==" - }, - "System.Reactive": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "31kfaW4ZupZzPsI5PVe77VhnvFF55qgma7KZr/E0iFTs6fmdhhG8j0mgEx620iLTey1EynOkEfnyTjtNEpJzGw==" - }, - "System.Reflection": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Extensions": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Reflection": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Reflection.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Resources.ResourceManager": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Globalization": "4.3.0", - "System.Reflection": "4.3.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" - }, - "System.Runtime.Handles": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime.InteropServices": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Reflection": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Handles": "4.3.0" - } - }, - "System.Security.AccessControl": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Security.Principal": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", - "dependencies": { - "System.Runtime": "4.3.0" - } - }, - "System.Security.Principal.Windows": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" - }, - "System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Threading": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", - "dependencies": { - "System.Runtime": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, - "System.Threading.Channels": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" - }, - "System.Threading.Tasks": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Threading.Tasks.Extensions": { - "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" - }, - "Microsoft.PowerShell.EditorServices": { - "type": "Project", - "dependencies": { - "Microsoft.CSharp": "[4.7.0, )", - "Microsoft.Extensions.FileSystemGlobbing": "[8.0.0, )", - "Microsoft.Extensions.Logging": "[8.0.0, )", - "OmniSharp.Extensions.DebugAdapter.Server": "[0.19.9, )", - "OmniSharp.Extensions.LanguageServer": "[0.19.9, )", - "PowerShellStandard.Library": "[5.1.1, )", - "Serilog": "[3.1.1, )", - "Serilog.Extensions.Logging": "[8.0.0, )", - "Serilog.Sinks.Async": "[1.5.0, )", - "Serilog.Sinks.File": "[5.0.0, )", - "System.IO.Pipes.AccessControl": "[5.0.0, )", - "System.Security.Principal": "[4.3.0, )", - "System.Security.Principal.Windows": "[5.0.0, )" - } - } - } - } -} \ No newline at end of file diff --git a/src/PowerShellEditorServices/packages.lock.json b/src/PowerShellEditorServices/packages.lock.json deleted file mode 100644 index a41fcb2aa..000000000 --- a/src/PowerShellEditorServices/packages.lock.json +++ /dev/null @@ -1,446 +0,0 @@ -{ - "version": 1, - "dependencies": { - ".NETStandard,Version=v2.0": { - "Microsoft.CSharp": { - "type": "Direct", - "requested": "[4.7.0, )", - "resolved": "4.7.0", - "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" - }, - "Microsoft.Extensions.FileSystemGlobbing": { - "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" - }, - "Microsoft.Extensions.Logging": { - "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.Extensions.DependencyInjection": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "System.Diagnostics.DiagnosticSource": "8.0.0" - } - }, - "NETStandard.Library": { - "type": "Direct", - "requested": "[2.0.3, )", - "resolved": "2.0.3", - "contentHash": "st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0" - } - }, - "OmniSharp.Extensions.DebugAdapter.Server": { - "type": "Direct", - "requested": "[0.19.9, )", - "resolved": "0.19.9", - "contentHash": "XRJ6EW44DaODkzjAuN1XbpnPFkciJIM2sIx4KpsvV/2Rle1CdRJY4gA6vJn+2uNh5hRr1d0SqZSieqV9Ly0utw==", - "dependencies": { - "OmniSharp.Extensions.DebugAdapter.Shared": "0.19.9" - } - }, - "OmniSharp.Extensions.LanguageServer": { - "type": "Direct", - "requested": "[0.19.9, )", - "resolved": "0.19.9", - "contentHash": "g09wOOCQ/oFqtZ47Q5R9E78tz2a5ODEB+V+S65wAiiRskR7xwL78Tse4/8ToBc8G/ZgQgqLtAOPo/BSPmHNlbw==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.LanguageProtocol": "0.19.9", - "OmniSharp.Extensions.LanguageServer.Shared": "0.19.9" - } - }, - "PowerShellStandard.Library": { - "type": "Direct", - "requested": "[5.1.1, )", - "resolved": "5.1.1", - "contentHash": "e31xJjG+Kjbv6YF3Yq6D4Dl3or8v7LrNF41k3CXrWozW6hR1zcOe5KYuZJaGSiAgLnwP8wcW+I3+IWEzMPZKXQ==" - }, - "Serilog": { - "type": "Direct", - "requested": "[3.1.1, )", - "resolved": "3.1.1", - "contentHash": "P6G4/4Kt9bT635bhuwdXlJ2SCqqn2nhh4gqFqQueCOr9bK/e7W9ll/IoX1Ter948cV2Z/5+5v8pAfJYUISY03A==", - "dependencies": { - "System.Diagnostics.DiagnosticSource": "7.0.2" - } - }, - "Serilog.Extensions.Logging": { - "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "YEAMWu1UnWgf1c1KP85l1SgXGfiVo0Rz6x08pCiPOIBt2Qe18tcZLvdBUuV5o1QHvrs8FAry9wTIhgBRtjIlEg==", - "dependencies": { - "Microsoft.Extensions.Logging": "8.0.0", - "Serilog": "3.1.1" - } - }, - "Serilog.Sinks.Async": { - "type": "Direct", - "requested": "[1.5.0, )", - "resolved": "1.5.0", - "contentHash": "csHYIqAwI4Gy9oAhXYRwxGrQEAtBg3Ep7WaCzsnA1cZuBZjVAU0n7hWaJhItjO7hbLHh/9gRVxALCUB4Dv+gZw==", - "dependencies": { - "Serilog": "2.9.0" - } - }, - "Serilog.Sinks.File": { - "type": "Direct", - "requested": "[5.0.0, )", - "resolved": "5.0.0", - "contentHash": "uwV5hdhWPwUH1szhO8PJpFiahqXmzPzJT/sOijH/kFgUx+cyoDTMM8MHD0adw9+Iem6itoibbUXHYslzXsLEAg==", - "dependencies": { - "Serilog": "2.10.0" - } - }, - "System.IO.Pipes.AccessControl": { - "type": "Direct", - "requested": "[5.0.0, )", - "resolved": "5.0.0", - "contentHash": "P0FIsXSFNL1AXlHO9zpJ9atRUzVyoPZCkcbkYGZfXXMx9xlGA2H3HOGBwIhpKhB+h0eL3hry/z0UcfJZ+yb2kQ==", - "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Security.Principal": { - "type": "Direct", - "requested": "[4.3.0, )", - "resolved": "4.3.0", - "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", - "dependencies": { - "System.Runtime": "4.3.0" - } - }, - "System.Security.Principal.Windows": { - "type": "Direct", - "requested": "[5.0.0, )", - "resolved": "5.0.0", - "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" - }, - "MediatR": { - "type": "Transitive", - "resolved": "8.1.0", - "contentHash": "KJFnA0MV83bNOhvYbjIX1iDykhwFXoQu0KV7E1SVbNA/CmO2I7SAm2Baly0eS7VJ2GwlmStLajBfeiNgTpvYzQ==" - }, - "Microsoft.Bcl.AsyncInterfaces": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==", - "dependencies": { - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.Extensions.Configuration": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "BUyFU9t+HzlSE7ri4B+AQN2BgTgHv/uM82s5ZkgU1BApyzWzIl48nDsG5wR1t0pniNuuyTBzG3qCW8152/NtSw==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Configuration.Binder": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "System.Buffers": "4.5.1", - "System.Memory": "4.5.5" - } - }, - "Microsoft.Extensions.Options": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0", - "System.ComponentModel.Annotations": "5.0.0" - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "bXWINbTn0vC0FYc9GaQTISbxhQLAMrvtbuvD9N6JelEaIS/Pr62wUCinrq5bf1WRBGczt1v4wDhxFtVFNcMdUQ==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==", - "dependencies": { - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, - "Microsoft.VisualStudio.Threading": { - "type": "Transitive", - "resolved": "17.6.40", - "contentHash": "hLa/0xargG7p3bF7aeq2/lRYn/bVnfZXurUWVHx+MNqxxAUjIDMKi4OIOWbYQ/DTkbn9gv8TLvgso+6EtHVQQg==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "Microsoft.VisualStudio.Threading.Analyzers": "17.6.40", - "Microsoft.VisualStudio.Validation": "17.0.71", - "Microsoft.Win32.Registry": "5.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.VisualStudio.Threading.Analyzers": { - "type": "Transitive", - "resolved": "17.6.40", - "contentHash": "uU8vYr/Nx3ldEWcsbiHiyAX1G7od3eFK1+Aga6ZvgCvU+nQkcXYVkIMcSEkIDWkFaldx1dkoVvX3KRNQD0R7dw==" - }, - "Microsoft.VisualStudio.Validation": { - "type": "Transitive", - "resolved": "17.6.11", - "contentHash": "J+9L/iac6c8cwcgVSCMuoIYOlD1Jw4mbZ8XMe1IZVj8p8+3dJ46LnnkIkTRMjK7xs9UtU9MoUp1JGhWoN6fAEw==" - }, - "Microsoft.Win32.Registry": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.4", - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "Nerdbank.Streams": { - "type": "Transitive", - "resolved": "2.10.69", - "contentHash": "YIudzeVyQRJAqytjpo1jdHkh2t+vqQqyusBqb2sFSOAOGEnyOXhcHx/rQqSuCIXUDr50a3XuZnamGRfQVBOf4g==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "Microsoft.VisualStudio.Threading": "17.6.40", - "Microsoft.VisualStudio.Validation": "17.6.11", - "System.IO.Pipelines": "7.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "Newtonsoft.Json": { - "type": "Transitive", - "resolved": "13.0.3", - "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" - }, - "OmniSharp.Extensions.DebugAdapter": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "Jy9RlVei7ay3LavvPH4F8BnIIMAo5th5EI8JnVe1RQlOxvu18H8hOyZ8fLFHtzbObs+oTONsJ9aynqeyMOErgA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.JsonRpc.Generators": "0.19.9" - } - }, - "OmniSharp.Extensions.DebugAdapter.Shared": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "A4psuqk+slrs585cCkZkwUO08nW0I6SVH4u7B7d8wU9lH0LLRTvQBlo3QlxrVAMxjwljPFzXaaRHv7D7X1BXbw==", - "dependencies": { - "OmniSharp.Extensions.DebugAdapter": "0.19.9", - "OmniSharp.Extensions.JsonRpc": "0.19.9" - } - }, - "OmniSharp.Extensions.JsonRpc": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "utFvrx9OYXhCS5rnfWAVeedJCrucuDLAOrKXjohf/NOjG9FFVbcp+hLqj9Ng+AxoADRD+rSJYHfBOeqGl5zW0A==", - "dependencies": { - "MediatR": "8.1.0", - "Microsoft.Extensions.DependencyInjection": "6.0.1", - "Microsoft.Extensions.Logging": "6.0.0", - "Nerdbank.Streams": "2.10.69", - "Newtonsoft.Json": "13.0.3", - "OmniSharp.Extensions.JsonRpc.Generators": "0.19.9", - "System.Collections.Immutable": "5.0.0", - "System.Reactive": "6.0.0", - "System.Threading.Channels": "6.0.0" - } - }, - "OmniSharp.Extensions.JsonRpc.Generators": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "hiWC0yGcKM+K00fgiL7KBmlvULmkKNhm40ZSzxqT+jNV21r+YZgKzEREhQe40ufb4tjcIxdYkif++IzGl/3H/Q==" - }, - "OmniSharp.Extensions.LanguageProtocol": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "d0crY6w5SyunGlERP27YeUeJnJfUjvJoALFlPMU4CHu3jovG1Y8RxLpihCPX8fKdjzgy7Ii+VjFYtIpDEEQqYQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.JsonRpc.Generators": "0.19.9" - } - }, - "OmniSharp.Extensions.LanguageServer.Shared": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "+p+py79MrNG3QnqRrBp5J7Wc810HFFczMH8/WLIiUqih1bqmKPFY9l/uzBvq1Ko8+YO/8tzI7BDffHvaguISEw==", - "dependencies": { - "OmniSharp.Extensions.LanguageProtocol": "0.19.9" - } - }, - "System.Buffers": { - "type": "Transitive", - "resolved": "4.5.1", - "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" - }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g==", - "dependencies": { - "System.Memory": "4.5.4" - } - }, - "System.ComponentModel.Annotations": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" - }, - "System.Diagnostics.DiagnosticSource": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==", - "dependencies": { - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "jRn6JYnNPW6xgQazROBLSfpdoczRw694vO5kKvMcNnpXuolEixUyw6IBuBs2Y2mlSX/LdLvyyWmfXhaI3ND1Yg==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.5", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "System.Memory": { - "type": "Transitive", - "resolved": "4.5.5", - "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Numerics.Vectors": "4.4.0", - "System.Runtime.CompilerServices.Unsafe": "4.5.3" - } - }, - "System.Numerics.Vectors": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ==" - }, - "System.Reactive": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "31kfaW4ZupZzPsI5PVe77VhnvFF55qgma7KZr/E0iFTs6fmdhhG8j0mgEx620iLTey1EynOkEfnyTjtNEpJzGw==", - "dependencies": { - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" - }, - "System.Security.AccessControl": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", - "dependencies": { - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Threading.Channels": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==", - "dependencies": { - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "System.Threading.Tasks.Extensions": { - "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "4.5.3" - } - } - } - } -} \ No newline at end of file diff --git a/test/PowerShellEditorServices.Test.E2E/packages.lock.json b/test/PowerShellEditorServices.Test.E2E/packages.lock.json deleted file mode 100644 index 91fccbf9e..000000000 --- a/test/PowerShellEditorServices.Test.E2E/packages.lock.json +++ /dev/null @@ -1,500 +0,0 @@ -{ - "version": 1, - "dependencies": { - "net8.0": { - "Microsoft.NET.Test.Sdk": { - "type": "Direct", - "requested": "[17.9.0, )", - "resolved": "17.9.0", - "contentHash": "7GUNAUbJYn644jzwLm5BD3a2p9C1dmP8Hr6fDPDxgItQk9hBs1Svdxzz07KQ/UphMSmgza9AbijBJGmw5D658A==", - "dependencies": { - "Microsoft.CodeCoverage": "17.9.0", - "Microsoft.TestPlatform.TestHost": "17.9.0" - } - }, - "Newtonsoft.Json": { - "type": "Direct", - "requested": "[13.0.3, )", - "resolved": "13.0.3", - "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" - }, - "OmniSharp.Extensions.DebugAdapter.Client": { - "type": "Direct", - "requested": "[0.19.9, )", - "resolved": "0.19.9", - "contentHash": "wxjisQyg/+IL6PAdcEUdQ5PQKgwi5C5h8TJ+Lq2LHwzCH4q75dd2KtCgMeLfGv2zYX+iejkvrTKJla/NI5yjVw==", - "dependencies": { - "OmniSharp.Extensions.DebugAdapter.Shared": "0.19.9" - } - }, - "OmniSharp.Extensions.LanguageClient": { - "type": "Direct", - "requested": "[0.19.9, )", - "resolved": "0.19.9", - "contentHash": "WI+oxw30IYVykAxnZjf8fdBP2qiO4qjk3KvMtav7u3VytbDQ+wqjAGV83/os61Lc3EhF+QC8kCGKv8vQtfJ+aA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.LanguageProtocol": "0.19.9", - "OmniSharp.Extensions.LanguageServer.Shared": "0.19.9" - } - }, - "xunit": { - "type": "Direct", - "requested": "[2.7.0, )", - "resolved": "2.7.0", - "contentHash": "KcCI5zxh8zbUfQTeErc4oT7YokViVND2V0p4vDJ2VD4lhF9V5qCYMMDNixme7FdwYy3SwPHF+2xC2Dq4Z9GSlA==", - "dependencies": { - "xunit.analyzers": "1.11.0", - "xunit.assert": "2.7.0", - "xunit.core": "[2.7.0]" - } - }, - "xunit.runner.visualstudio": { - "type": "Direct", - "requested": "[2.5.7, )", - "resolved": "2.5.7", - "contentHash": "31Rl7dBJriX0DNwZfDp8gqFOPsiM0c9kqpcH/HvNi9vDp+K7Ydf42H7mVIvYT918Ywzn1ymLg1c4DDC6iU754w==" - }, - "Xunit.SkippableFact": { - "type": "Direct", - "requested": "[1.4.13, )", - "resolved": "1.4.13", - "contentHash": "IyzZNvJEtXGlXrzxDiSbtH5Lyxf4iJdRQADuyjGdDf00LjXRLJwIoezQNFhFGKTMtvk8IIgaSHxW4mAV4O7b8A==", - "dependencies": { - "Validation": "2.4.18", - "xunit.extensibility.execution": "2.4.0" - } - }, - "MediatR": { - "type": "Transitive", - "resolved": "8.1.0", - "contentHash": "KJFnA0MV83bNOhvYbjIX1iDykhwFXoQu0KV7E1SVbNA/CmO2I7SAm2Baly0eS7VJ2GwlmStLajBfeiNgTpvYzQ==" - }, - "Microsoft.Bcl.AsyncInterfaces": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "3aeMZ1N0lJoSyzqiP03hqemtb1BijhsJADdobn/4nsMJ8V1H+CrpuduUe4hlRdx+ikBQju1VGjMD1GJ3Sk05Eg==" - }, - "Microsoft.CodeCoverage": { - "type": "Transitive", - "resolved": "17.9.0", - "contentHash": "RGD37ZSrratfScYXm7M0HjvxMxZyWZL4jm+XgMZbkIY1UPgjUpbNA/t+WTGj/rC/0Hm9A3IrH3ywbKZkOCnoZA==" - }, - "Microsoft.CSharp": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" - }, - "Microsoft.Extensions.Configuration": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "BUyFU9t+HzlSE7ri4B+AQN2BgTgHv/uM82s5ZkgU1BApyzWzIl48nDsG5wR1t0pniNuuyTBzG3qCW8152/NtSw==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Configuration.Binder": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" - }, - "Microsoft.Extensions.FileSystemGlobbing": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" - }, - "Microsoft.Extensions.Logging": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" - } - }, - "Microsoft.Extensions.Options": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "bXWINbTn0vC0FYc9GaQTISbxhQLAMrvtbuvD9N6JelEaIS/Pr62wUCinrq5bf1WRBGczt1v4wDhxFtVFNcMdUQ==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" - }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, - "Microsoft.TestPlatform.ObjectModel": { - "type": "Transitive", - "resolved": "17.9.0", - "contentHash": "1ilw/8vgmjLyKU+2SKXKXaOqpYFJCQfGqGz+x0cosl981VzjrY74Sv6qAJv+neZMZ9ZMxF3ArN6kotaQ4uvEBw==", - "dependencies": { - "System.Reflection.Metadata": "1.6.0" - } - }, - "Microsoft.TestPlatform.TestHost": { - "type": "Transitive", - "resolved": "17.9.0", - "contentHash": "Spmg7Wx49Ya3SxBjyeAR+nQpjMTKZwTwpZ7KyeOTIqI/WHNPnBU4HUvl5kuHPQAwGWqMy4FGZja1HvEwvoaDiA==", - "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.9.0", - "Newtonsoft.Json": "13.0.1" - } - }, - "Microsoft.VisualStudio.Threading": { - "type": "Transitive", - "resolved": "17.6.40", - "contentHash": "hLa/0xargG7p3bF7aeq2/lRYn/bVnfZXurUWVHx+MNqxxAUjIDMKi4OIOWbYQ/DTkbn9gv8TLvgso+6EtHVQQg==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "Microsoft.VisualStudio.Threading.Analyzers": "17.6.40", - "Microsoft.VisualStudio.Validation": "17.0.71", - "Microsoft.Win32.Registry": "5.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.VisualStudio.Threading.Analyzers": { - "type": "Transitive", - "resolved": "17.6.40", - "contentHash": "uU8vYr/Nx3ldEWcsbiHiyAX1G7od3eFK1+Aga6ZvgCvU+nQkcXYVkIMcSEkIDWkFaldx1dkoVvX3KRNQD0R7dw==" - }, - "Microsoft.VisualStudio.Validation": { - "type": "Transitive", - "resolved": "17.6.11", - "contentHash": "J+9L/iac6c8cwcgVSCMuoIYOlD1Jw4mbZ8XMe1IZVj8p8+3dJ46LnnkIkTRMjK7xs9UtU9MoUp1JGhWoN6fAEw==" - }, - "Microsoft.Win32.Registry": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", - "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "Nerdbank.Streams": { - "type": "Transitive", - "resolved": "2.10.69", - "contentHash": "YIudzeVyQRJAqytjpo1jdHkh2t+vqQqyusBqb2sFSOAOGEnyOXhcHx/rQqSuCIXUDr50a3XuZnamGRfQVBOf4g==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "Microsoft.VisualStudio.Threading": "17.6.40", - "Microsoft.VisualStudio.Validation": "17.6.11", - "System.IO.Pipelines": "7.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "OmniSharp.Extensions.DebugAdapter": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "Jy9RlVei7ay3LavvPH4F8BnIIMAo5th5EI8JnVe1RQlOxvu18H8hOyZ8fLFHtzbObs+oTONsJ9aynqeyMOErgA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.JsonRpc.Generators": "0.19.9" - } - }, - "OmniSharp.Extensions.DebugAdapter.Server": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "XRJ6EW44DaODkzjAuN1XbpnPFkciJIM2sIx4KpsvV/2Rle1CdRJY4gA6vJn+2uNh5hRr1d0SqZSieqV9Ly0utw==", - "dependencies": { - "OmniSharp.Extensions.DebugAdapter.Shared": "0.19.9" - } - }, - "OmniSharp.Extensions.DebugAdapter.Shared": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "A4psuqk+slrs585cCkZkwUO08nW0I6SVH4u7B7d8wU9lH0LLRTvQBlo3QlxrVAMxjwljPFzXaaRHv7D7X1BXbw==", - "dependencies": { - "OmniSharp.Extensions.DebugAdapter": "0.19.9", - "OmniSharp.Extensions.JsonRpc": "0.19.9" - } - }, - "OmniSharp.Extensions.JsonRpc": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "utFvrx9OYXhCS5rnfWAVeedJCrucuDLAOrKXjohf/NOjG9FFVbcp+hLqj9Ng+AxoADRD+rSJYHfBOeqGl5zW0A==", - "dependencies": { - "MediatR": "8.1.0", - "Microsoft.Extensions.DependencyInjection": "6.0.1", - "Microsoft.Extensions.Logging": "6.0.0", - "Nerdbank.Streams": "2.10.69", - "Newtonsoft.Json": "13.0.3", - "OmniSharp.Extensions.JsonRpc.Generators": "0.19.9", - "System.Collections.Immutable": "5.0.0", - "System.Reactive": "6.0.0", - "System.Threading.Channels": "6.0.0" - } - }, - "OmniSharp.Extensions.JsonRpc.Generators": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "hiWC0yGcKM+K00fgiL7KBmlvULmkKNhm40ZSzxqT+jNV21r+YZgKzEREhQe40ufb4tjcIxdYkif++IzGl/3H/Q==" - }, - "OmniSharp.Extensions.LanguageProtocol": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "d0crY6w5SyunGlERP27YeUeJnJfUjvJoALFlPMU4CHu3jovG1Y8RxLpihCPX8fKdjzgy7Ii+VjFYtIpDEEQqYQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.JsonRpc.Generators": "0.19.9" - } - }, - "OmniSharp.Extensions.LanguageServer": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "g09wOOCQ/oFqtZ47Q5R9E78tz2a5ODEB+V+S65wAiiRskR7xwL78Tse4/8ToBc8G/ZgQgqLtAOPo/BSPmHNlbw==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.LanguageProtocol": "0.19.9", - "OmniSharp.Extensions.LanguageServer.Shared": "0.19.9" - } - }, - "OmniSharp.Extensions.LanguageServer.Shared": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "+p+py79MrNG3QnqRrBp5J7Wc810HFFczMH8/WLIiUqih1bqmKPFY9l/uzBvq1Ko8+YO/8tzI7BDffHvaguISEw==", - "dependencies": { - "OmniSharp.Extensions.LanguageProtocol": "0.19.9" - } - }, - "PowerShellStandard.Library": { - "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "e31xJjG+Kjbv6YF3Yq6D4Dl3or8v7LrNF41k3CXrWozW6hR1zcOe5KYuZJaGSiAgLnwP8wcW+I3+IWEzMPZKXQ==" - }, - "Serilog": { - "type": "Transitive", - "resolved": "3.1.1", - "contentHash": "P6G4/4Kt9bT635bhuwdXlJ2SCqqn2nhh4gqFqQueCOr9bK/e7W9ll/IoX1Ter948cV2Z/5+5v8pAfJYUISY03A==" - }, - "Serilog.Extensions.Logging": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "YEAMWu1UnWgf1c1KP85l1SgXGfiVo0Rz6x08pCiPOIBt2Qe18tcZLvdBUuV5o1QHvrs8FAry9wTIhgBRtjIlEg==", - "dependencies": { - "Microsoft.Extensions.Logging": "8.0.0", - "Serilog": "3.1.1" - } - }, - "Serilog.Sinks.Async": { - "type": "Transitive", - "resolved": "1.5.0", - "contentHash": "csHYIqAwI4Gy9oAhXYRwxGrQEAtBg3Ep7WaCzsnA1cZuBZjVAU0n7hWaJhItjO7hbLHh/9gRVxALCUB4Dv+gZw==", - "dependencies": { - "Serilog": "2.9.0" - } - }, - "Serilog.Sinks.File": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "uwV5hdhWPwUH1szhO8PJpFiahqXmzPzJT/sOijH/kFgUx+cyoDTMM8MHD0adw9+Iem6itoibbUXHYslzXsLEAg==", - "dependencies": { - "Serilog": "2.10.0" - } - }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g==" - }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "jRn6JYnNPW6xgQazROBLSfpdoczRw694vO5kKvMcNnpXuolEixUyw6IBuBs2Y2mlSX/LdLvyyWmfXhaI3ND1Yg==" - }, - "System.IO.Pipes.AccessControl": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "P0FIsXSFNL1AXlHO9zpJ9atRUzVyoPZCkcbkYGZfXXMx9xlGA2H3HOGBwIhpKhB+h0eL3hry/z0UcfJZ+yb2kQ==", - "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Reactive": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "31kfaW4ZupZzPsI5PVe77VhnvFF55qgma7KZr/E0iFTs6fmdhhG8j0mgEx620iLTey1EynOkEfnyTjtNEpJzGw==" - }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "1.6.0", - "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" - }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" - }, - "System.Security.AccessControl": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Security.Principal": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", - "dependencies": { - "System.Runtime": "4.3.0" - } - }, - "System.Security.Principal.Windows": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" - }, - "System.Threading.Channels": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" - }, - "System.Threading.Tasks.Extensions": { - "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" - }, - "Validation": { - "type": "Transitive", - "resolved": "2.4.18", - "contentHash": "NfvWJ1QeuZ1FQCkqgXTu1cOkRkbNCfxs4Tat+abXLwom6OXbULVhRGp34BTvVB4XPxj6VIAl7KfLfStXMt/Ehw==" - }, - "xunit.abstractions": { - "type": "Transitive", - "resolved": "2.0.3", - "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" - }, - "xunit.analyzers": { - "type": "Transitive", - "resolved": "1.11.0", - "contentHash": "SCv+Ihxv+fCqotGeM8sVwLhw8nzAJ2aFRN5lcoKn9QtGdbVJ79JqDc+4u8/Ddnp2udxtmv+xYFWkHNlb/sk01w==" - }, - "xunit.assert": { - "type": "Transitive", - "resolved": "2.7.0", - "contentHash": "CCTs3bUhmIS4tDwK6Cn/IiabG3RhYzdf65eIkO7u9/grKoN9MrN780LzVED3E8v+vwmmj7b5TW3/GFuZHPAzWA==" - }, - "xunit.core": { - "type": "Transitive", - "resolved": "2.7.0", - "contentHash": "98tzqYAbtc/p/2Ba455XTNbD12Qoo8kPehjC4oDT46CAsLli5JOCU9hFF2MV3HHWMw/Y3yFUV2Vcukplbs6kuA==", - "dependencies": { - "xunit.extensibility.core": "[2.7.0]", - "xunit.extensibility.execution": "[2.7.0]" - } - }, - "xunit.extensibility.core": { - "type": "Transitive", - "resolved": "2.7.0", - "contentHash": "JLnx4PI0vn1Xr1Ust6ydrp2t/ktm2dyGPAVoDJV5gQuvBMSbd2K7WGzODa2ttiz030CeQ8nbsXl05+cvf7QNyA==", - "dependencies": { - "xunit.abstractions": "2.0.3" - } - }, - "xunit.extensibility.execution": { - "type": "Transitive", - "resolved": "2.7.0", - "contentHash": "bjY+crT1jOyxKagFjCMdEVzoenO2v66ru8+CK/0UaXvyG4U9Q3UTieJkbQXbi7/1yZIK1sGh01l5/jh2CwLJtQ==", - "dependencies": { - "xunit.extensibility.core": "[2.7.0]" - } - }, - "Microsoft.PowerShell.EditorServices": { - "type": "Project", - "dependencies": { - "Microsoft.CSharp": "[4.7.0, )", - "Microsoft.Extensions.FileSystemGlobbing": "[8.0.0, )", - "Microsoft.Extensions.Logging": "[8.0.0, )", - "OmniSharp.Extensions.DebugAdapter.Server": "[0.19.9, )", - "OmniSharp.Extensions.LanguageServer": "[0.19.9, )", - "PowerShellStandard.Library": "[5.1.1, )", - "Serilog": "[3.1.1, )", - "Serilog.Extensions.Logging": "[8.0.0, )", - "Serilog.Sinks.Async": "[1.5.0, )", - "Serilog.Sinks.File": "[5.0.0, )", - "System.IO.Pipes.AccessControl": "[5.0.0, )", - "System.Security.Principal": "[4.3.0, )", - "System.Security.Principal.Windows": "[5.0.0, )" - } - } - } - } -} \ No newline at end of file diff --git a/test/PowerShellEditorServices.Test.Shared/packages.lock.json b/test/PowerShellEditorServices.Test.Shared/packages.lock.json deleted file mode 100644 index c6efa4b81..000000000 --- a/test/PowerShellEditorServices.Test.Shared/packages.lock.json +++ /dev/null @@ -1,451 +0,0 @@ -{ - "version": 1, - "dependencies": { - ".NETStandard,Version=v2.0": { - "NETStandard.Library": { - "type": "Direct", - "requested": "[2.0.3, )", - "resolved": "2.0.3", - "contentHash": "st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0" - } - }, - "MediatR": { - "type": "Transitive", - "resolved": "8.1.0", - "contentHash": "KJFnA0MV83bNOhvYbjIX1iDykhwFXoQu0KV7E1SVbNA/CmO2I7SAm2Baly0eS7VJ2GwlmStLajBfeiNgTpvYzQ==" - }, - "Microsoft.Bcl.AsyncInterfaces": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==", - "dependencies": { - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.CSharp": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" - }, - "Microsoft.Extensions.Configuration": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "BUyFU9t+HzlSE7ri4B+AQN2BgTgHv/uM82s5ZkgU1BApyzWzIl48nDsG5wR1t0pniNuuyTBzG3qCW8152/NtSw==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Configuration.Binder": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.Extensions.FileSystemGlobbing": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" - }, - "Microsoft.Extensions.Logging": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.Extensions.DependencyInjection": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "System.Diagnostics.DiagnosticSource": "8.0.0" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "System.Buffers": "4.5.1", - "System.Memory": "4.5.5" - } - }, - "Microsoft.Extensions.Options": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0", - "System.ComponentModel.Annotations": "5.0.0" - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "bXWINbTn0vC0FYc9GaQTISbxhQLAMrvtbuvD9N6JelEaIS/Pr62wUCinrq5bf1WRBGczt1v4wDhxFtVFNcMdUQ==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==", - "dependencies": { - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, - "Microsoft.VisualStudio.Threading": { - "type": "Transitive", - "resolved": "17.6.40", - "contentHash": "hLa/0xargG7p3bF7aeq2/lRYn/bVnfZXurUWVHx+MNqxxAUjIDMKi4OIOWbYQ/DTkbn9gv8TLvgso+6EtHVQQg==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "Microsoft.VisualStudio.Threading.Analyzers": "17.6.40", - "Microsoft.VisualStudio.Validation": "17.0.71", - "Microsoft.Win32.Registry": "5.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.VisualStudio.Threading.Analyzers": { - "type": "Transitive", - "resolved": "17.6.40", - "contentHash": "uU8vYr/Nx3ldEWcsbiHiyAX1G7od3eFK1+Aga6ZvgCvU+nQkcXYVkIMcSEkIDWkFaldx1dkoVvX3KRNQD0R7dw==" - }, - "Microsoft.VisualStudio.Validation": { - "type": "Transitive", - "resolved": "17.6.11", - "contentHash": "J+9L/iac6c8cwcgVSCMuoIYOlD1Jw4mbZ8XMe1IZVj8p8+3dJ46LnnkIkTRMjK7xs9UtU9MoUp1JGhWoN6fAEw==" - }, - "Microsoft.Win32.Registry": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.4", - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "Nerdbank.Streams": { - "type": "Transitive", - "resolved": "2.10.69", - "contentHash": "YIudzeVyQRJAqytjpo1jdHkh2t+vqQqyusBqb2sFSOAOGEnyOXhcHx/rQqSuCIXUDr50a3XuZnamGRfQVBOf4g==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "Microsoft.VisualStudio.Threading": "17.6.40", - "Microsoft.VisualStudio.Validation": "17.6.11", - "System.IO.Pipelines": "7.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "Newtonsoft.Json": { - "type": "Transitive", - "resolved": "13.0.3", - "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" - }, - "OmniSharp.Extensions.DebugAdapter": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "Jy9RlVei7ay3LavvPH4F8BnIIMAo5th5EI8JnVe1RQlOxvu18H8hOyZ8fLFHtzbObs+oTONsJ9aynqeyMOErgA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.JsonRpc.Generators": "0.19.9" - } - }, - "OmniSharp.Extensions.DebugAdapter.Server": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "XRJ6EW44DaODkzjAuN1XbpnPFkciJIM2sIx4KpsvV/2Rle1CdRJY4gA6vJn+2uNh5hRr1d0SqZSieqV9Ly0utw==", - "dependencies": { - "OmniSharp.Extensions.DebugAdapter.Shared": "0.19.9" - } - }, - "OmniSharp.Extensions.DebugAdapter.Shared": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "A4psuqk+slrs585cCkZkwUO08nW0I6SVH4u7B7d8wU9lH0LLRTvQBlo3QlxrVAMxjwljPFzXaaRHv7D7X1BXbw==", - "dependencies": { - "OmniSharp.Extensions.DebugAdapter": "0.19.9", - "OmniSharp.Extensions.JsonRpc": "0.19.9" - } - }, - "OmniSharp.Extensions.JsonRpc": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "utFvrx9OYXhCS5rnfWAVeedJCrucuDLAOrKXjohf/NOjG9FFVbcp+hLqj9Ng+AxoADRD+rSJYHfBOeqGl5zW0A==", - "dependencies": { - "MediatR": "8.1.0", - "Microsoft.Extensions.DependencyInjection": "6.0.1", - "Microsoft.Extensions.Logging": "6.0.0", - "Nerdbank.Streams": "2.10.69", - "Newtonsoft.Json": "13.0.3", - "OmniSharp.Extensions.JsonRpc.Generators": "0.19.9", - "System.Collections.Immutable": "5.0.0", - "System.Reactive": "6.0.0", - "System.Threading.Channels": "6.0.0" - } - }, - "OmniSharp.Extensions.JsonRpc.Generators": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "hiWC0yGcKM+K00fgiL7KBmlvULmkKNhm40ZSzxqT+jNV21r+YZgKzEREhQe40ufb4tjcIxdYkif++IzGl/3H/Q==" - }, - "OmniSharp.Extensions.LanguageProtocol": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "d0crY6w5SyunGlERP27YeUeJnJfUjvJoALFlPMU4CHu3jovG1Y8RxLpihCPX8fKdjzgy7Ii+VjFYtIpDEEQqYQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.JsonRpc.Generators": "0.19.9" - } - }, - "OmniSharp.Extensions.LanguageServer": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "g09wOOCQ/oFqtZ47Q5R9E78tz2a5ODEB+V+S65wAiiRskR7xwL78Tse4/8ToBc8G/ZgQgqLtAOPo/BSPmHNlbw==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.LanguageProtocol": "0.19.9", - "OmniSharp.Extensions.LanguageServer.Shared": "0.19.9" - } - }, - "OmniSharp.Extensions.LanguageServer.Shared": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "+p+py79MrNG3QnqRrBp5J7Wc810HFFczMH8/WLIiUqih1bqmKPFY9l/uzBvq1Ko8+YO/8tzI7BDffHvaguISEw==", - "dependencies": { - "OmniSharp.Extensions.LanguageProtocol": "0.19.9" - } - }, - "PowerShellStandard.Library": { - "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "e31xJjG+Kjbv6YF3Yq6D4Dl3or8v7LrNF41k3CXrWozW6hR1zcOe5KYuZJaGSiAgLnwP8wcW+I3+IWEzMPZKXQ==" - }, - "Serilog": { - "type": "Transitive", - "resolved": "3.1.1", - "contentHash": "P6G4/4Kt9bT635bhuwdXlJ2SCqqn2nhh4gqFqQueCOr9bK/e7W9ll/IoX1Ter948cV2Z/5+5v8pAfJYUISY03A==", - "dependencies": { - "System.Diagnostics.DiagnosticSource": "7.0.2" - } - }, - "Serilog.Extensions.Logging": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "YEAMWu1UnWgf1c1KP85l1SgXGfiVo0Rz6x08pCiPOIBt2Qe18tcZLvdBUuV5o1QHvrs8FAry9wTIhgBRtjIlEg==", - "dependencies": { - "Microsoft.Extensions.Logging": "8.0.0", - "Serilog": "3.1.1" - } - }, - "Serilog.Sinks.Async": { - "type": "Transitive", - "resolved": "1.5.0", - "contentHash": "csHYIqAwI4Gy9oAhXYRwxGrQEAtBg3Ep7WaCzsnA1cZuBZjVAU0n7hWaJhItjO7hbLHh/9gRVxALCUB4Dv+gZw==", - "dependencies": { - "Serilog": "2.9.0" - } - }, - "Serilog.Sinks.File": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "uwV5hdhWPwUH1szhO8PJpFiahqXmzPzJT/sOijH/kFgUx+cyoDTMM8MHD0adw9+Iem6itoibbUXHYslzXsLEAg==", - "dependencies": { - "Serilog": "2.10.0" - } - }, - "System.Buffers": { - "type": "Transitive", - "resolved": "4.5.1", - "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" - }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g==", - "dependencies": { - "System.Memory": "4.5.4" - } - }, - "System.ComponentModel.Annotations": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" - }, - "System.Diagnostics.DiagnosticSource": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==", - "dependencies": { - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "jRn6JYnNPW6xgQazROBLSfpdoczRw694vO5kKvMcNnpXuolEixUyw6IBuBs2Y2mlSX/LdLvyyWmfXhaI3ND1Yg==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.5", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "System.IO.Pipes.AccessControl": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "P0FIsXSFNL1AXlHO9zpJ9atRUzVyoPZCkcbkYGZfXXMx9xlGA2H3HOGBwIhpKhB+h0eL3hry/z0UcfJZ+yb2kQ==", - "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Memory": { - "type": "Transitive", - "resolved": "4.5.5", - "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Numerics.Vectors": "4.4.0", - "System.Runtime.CompilerServices.Unsafe": "4.5.3" - } - }, - "System.Numerics.Vectors": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ==" - }, - "System.Reactive": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "31kfaW4ZupZzPsI5PVe77VhnvFF55qgma7KZr/E0iFTs6fmdhhG8j0mgEx620iLTey1EynOkEfnyTjtNEpJzGw==", - "dependencies": { - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" - }, - "System.Security.AccessControl": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", - "dependencies": { - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Security.Principal": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", - "dependencies": { - "System.Runtime": "4.3.0" - } - }, - "System.Security.Principal.Windows": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" - }, - "System.Threading.Channels": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==", - "dependencies": { - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "System.Threading.Tasks.Extensions": { - "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "4.5.3" - } - }, - "Microsoft.PowerShell.EditorServices": { - "type": "Project", - "dependencies": { - "Microsoft.CSharp": "[4.7.0, )", - "Microsoft.Extensions.FileSystemGlobbing": "[8.0.0, )", - "Microsoft.Extensions.Logging": "[8.0.0, )", - "OmniSharp.Extensions.DebugAdapter.Server": "[0.19.9, )", - "OmniSharp.Extensions.LanguageServer": "[0.19.9, )", - "PowerShellStandard.Library": "[5.1.1, )", - "Serilog": "[3.1.1, )", - "Serilog.Extensions.Logging": "[8.0.0, )", - "Serilog.Sinks.Async": "[1.5.0, )", - "Serilog.Sinks.File": "[5.0.0, )", - "System.IO.Pipes.AccessControl": "[5.0.0, )", - "System.Security.Principal": "[4.3.0, )", - "System.Security.Principal.Windows": "[5.0.0, )" - } - } - } - } -} \ No newline at end of file diff --git a/test/PowerShellEditorServices.Test/packages.lock.json b/test/PowerShellEditorServices.Test/packages.lock.json deleted file mode 100644 index 35e73f2b9..000000000 --- a/test/PowerShellEditorServices.Test/packages.lock.json +++ /dev/null @@ -1,3942 +0,0 @@ -{ - "version": 1, - "dependencies": { - ".NETFramework,Version=v4.6.2": { - "Microsoft.NET.Test.Sdk": { - "type": "Direct", - "requested": "[17.9.0, )", - "resolved": "17.9.0", - "contentHash": "7GUNAUbJYn644jzwLm5BD3a2p9C1dmP8Hr6fDPDxgItQk9hBs1Svdxzz07KQ/UphMSmgza9AbijBJGmw5D658A==", - "dependencies": { - "Microsoft.CodeCoverage": "17.9.0" - } - }, - "Microsoft.NETFramework.ReferenceAssemblies": { - "type": "Direct", - "requested": "[1.0.3, )", - "resolved": "1.0.3", - "contentHash": "vUc9Npcs14QsyOD01tnv/m8sQUnGTGOw1BCmKcv77LBJY7OxhJ+zJF7UD/sCL3lYNFuqmQEVlkfS4Quif6FyYg==", - "dependencies": { - "Microsoft.NETFramework.ReferenceAssemblies.net462": "1.0.3" - } - }, - "Microsoft.PowerShell.5.ReferenceAssemblies": { - "type": "Direct", - "requested": "[1.1.0, )", - "resolved": "1.1.0", - "contentHash": "EE87t3aUXlO0Rjq83Ti8z1g4wwsWnB4W+pOn84i3QWzUOOuP5gZg8n4Y8XTZ7GkxGcoSR6w/d/kBJTJbc3VZPQ==" - }, - "xunit": { - "type": "Direct", - "requested": "[2.7.0, )", - "resolved": "2.7.0", - "contentHash": "KcCI5zxh8zbUfQTeErc4oT7YokViVND2V0p4vDJ2VD4lhF9V5qCYMMDNixme7FdwYy3SwPHF+2xC2Dq4Z9GSlA==", - "dependencies": { - "xunit.analyzers": "1.11.0", - "xunit.assert": "2.7.0", - "xunit.core": "[2.7.0]" - } - }, - "xunit.runner.visualstudio": { - "type": "Direct", - "requested": "[2.5.7, )", - "resolved": "2.5.7", - "contentHash": "31Rl7dBJriX0DNwZfDp8gqFOPsiM0c9kqpcH/HvNi9vDp+K7Ydf42H7mVIvYT918Ywzn1ymLg1c4DDC6iU754w==", - "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.8.0" - } - }, - "Xunit.SkippableFact": { - "type": "Direct", - "requested": "[1.4.13, )", - "resolved": "1.4.13", - "contentHash": "IyzZNvJEtXGlXrzxDiSbtH5Lyxf4iJdRQADuyjGdDf00LjXRLJwIoezQNFhFGKTMtvk8IIgaSHxW4mAV4O7b8A==", - "dependencies": { - "Validation": "2.4.18", - "xunit.extensibility.execution": "2.4.0" - } - }, - "MediatR": { - "type": "Transitive", - "resolved": "8.1.0", - "contentHash": "KJFnA0MV83bNOhvYbjIX1iDykhwFXoQu0KV7E1SVbNA/CmO2I7SAm2Baly0eS7VJ2GwlmStLajBfeiNgTpvYzQ==" - }, - "Microsoft.Bcl.AsyncInterfaces": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==", - "dependencies": { - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.CodeCoverage": { - "type": "Transitive", - "resolved": "17.9.0", - "contentHash": "RGD37ZSrratfScYXm7M0HjvxMxZyWZL4jm+XgMZbkIY1UPgjUpbNA/t+WTGj/rC/0Hm9A3IrH3ywbKZkOCnoZA==" - }, - "Microsoft.CSharp": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" - }, - "Microsoft.Extensions.Configuration": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "BUyFU9t+HzlSE7ri4B+AQN2BgTgHv/uM82s5ZkgU1BApyzWzIl48nDsG5wR1t0pniNuuyTBzG3qCW8152/NtSw==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0", - "System.ValueTuple": "4.5.0" - } - }, - "Microsoft.Extensions.Configuration.Binder": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.Extensions.FileSystemGlobbing": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" - }, - "Microsoft.Extensions.Logging": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "8.0.0", - "Microsoft.Extensions.DependencyInjection": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", - "System.Diagnostics.DiagnosticSource": "8.0.0", - "System.ValueTuple": "4.5.0" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "System.Buffers": "4.5.1", - "System.Memory": "4.5.5" - } - }, - "Microsoft.Extensions.Options": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0", - "System.ValueTuple": "4.5.0" - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "bXWINbTn0vC0FYc9GaQTISbxhQLAMrvtbuvD9N6JelEaIS/Pr62wUCinrq5bf1WRBGczt1v4wDhxFtVFNcMdUQ==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==", - "dependencies": { - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "Microsoft.NETFramework.ReferenceAssemblies.net462": { - "type": "Transitive", - "resolved": "1.0.3", - "contentHash": "IzAV30z22ESCeQfxP29oVf4qEo8fBGXLXSU6oacv/9Iqe6PzgHDKCaWfwMBak7bSJQM0F5boXWoZS+kChztRIQ==" - }, - "Microsoft.TestPlatform.ObjectModel": { - "type": "Transitive", - "resolved": "17.8.0", - "contentHash": "AYy6vlpGMfz5kOFq99L93RGbqftW/8eQTqjT9iGXW6s9MRP3UdtY8idJ8rJcjeSja8A18IhIro5YnH3uv1nz4g==", - "dependencies": { - "NuGet.Frameworks": "6.5.0", - "System.Reflection.Metadata": "1.6.0" - } - }, - "Microsoft.VisualStudio.Threading": { - "type": "Transitive", - "resolved": "17.6.40", - "contentHash": "hLa/0xargG7p3bF7aeq2/lRYn/bVnfZXurUWVHx+MNqxxAUjIDMKi4OIOWbYQ/DTkbn9gv8TLvgso+6EtHVQQg==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "Microsoft.VisualStudio.Threading.Analyzers": "17.6.40", - "Microsoft.VisualStudio.Validation": "17.0.71", - "Microsoft.Win32.Registry": "5.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.VisualStudio.Threading.Analyzers": { - "type": "Transitive", - "resolved": "17.6.40", - "contentHash": "uU8vYr/Nx3ldEWcsbiHiyAX1G7od3eFK1+Aga6ZvgCvU+nQkcXYVkIMcSEkIDWkFaldx1dkoVvX3KRNQD0R7dw==" - }, - "Microsoft.VisualStudio.Validation": { - "type": "Transitive", - "resolved": "17.6.11", - "contentHash": "J+9L/iac6c8cwcgVSCMuoIYOlD1Jw4mbZ8XMe1IZVj8p8+3dJ46LnnkIkTRMjK7xs9UtU9MoUp1JGhWoN6fAEw==" - }, - "Microsoft.Win32.Registry": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", - "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "Nerdbank.Streams": { - "type": "Transitive", - "resolved": "2.10.69", - "contentHash": "YIudzeVyQRJAqytjpo1jdHkh2t+vqQqyusBqb2sFSOAOGEnyOXhcHx/rQqSuCIXUDr50a3XuZnamGRfQVBOf4g==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "Microsoft.VisualStudio.Threading": "17.6.40", - "Microsoft.VisualStudio.Validation": "17.6.11", - "System.IO.Pipelines": "7.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "Newtonsoft.Json": { - "type": "Transitive", - "resolved": "13.0.3", - "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" - }, - "NuGet.Frameworks": { - "type": "Transitive", - "resolved": "6.5.0", - "contentHash": "QWINE2x3MbTODsWT1Gh71GaGb5icBz4chS8VYvTgsBnsi8esgN6wtHhydd7fvToWECYGq7T4cgBBDiKD/363fg==" - }, - "OmniSharp.Extensions.DebugAdapter": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "Jy9RlVei7ay3LavvPH4F8BnIIMAo5th5EI8JnVe1RQlOxvu18H8hOyZ8fLFHtzbObs+oTONsJ9aynqeyMOErgA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.JsonRpc.Generators": "0.19.9" - } - }, - "OmniSharp.Extensions.DebugAdapter.Server": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "XRJ6EW44DaODkzjAuN1XbpnPFkciJIM2sIx4KpsvV/2Rle1CdRJY4gA6vJn+2uNh5hRr1d0SqZSieqV9Ly0utw==", - "dependencies": { - "OmniSharp.Extensions.DebugAdapter.Shared": "0.19.9" - } - }, - "OmniSharp.Extensions.DebugAdapter.Shared": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "A4psuqk+slrs585cCkZkwUO08nW0I6SVH4u7B7d8wU9lH0LLRTvQBlo3QlxrVAMxjwljPFzXaaRHv7D7X1BXbw==", - "dependencies": { - "OmniSharp.Extensions.DebugAdapter": "0.19.9", - "OmniSharp.Extensions.JsonRpc": "0.19.9" - } - }, - "OmniSharp.Extensions.JsonRpc": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "utFvrx9OYXhCS5rnfWAVeedJCrucuDLAOrKXjohf/NOjG9FFVbcp+hLqj9Ng+AxoADRD+rSJYHfBOeqGl5zW0A==", - "dependencies": { - "MediatR": "8.1.0", - "Microsoft.Extensions.DependencyInjection": "6.0.1", - "Microsoft.Extensions.Logging": "6.0.0", - "Nerdbank.Streams": "2.10.69", - "Newtonsoft.Json": "13.0.3", - "OmniSharp.Extensions.JsonRpc.Generators": "0.19.9", - "System.Collections.Immutable": "5.0.0", - "System.Reactive": "6.0.0", - "System.Threading.Channels": "6.0.0" - } - }, - "OmniSharp.Extensions.JsonRpc.Generators": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "hiWC0yGcKM+K00fgiL7KBmlvULmkKNhm40ZSzxqT+jNV21r+YZgKzEREhQe40ufb4tjcIxdYkif++IzGl/3H/Q==" - }, - "OmniSharp.Extensions.LanguageProtocol": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "d0crY6w5SyunGlERP27YeUeJnJfUjvJoALFlPMU4CHu3jovG1Y8RxLpihCPX8fKdjzgy7Ii+VjFYtIpDEEQqYQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.JsonRpc.Generators": "0.19.9" - } - }, - "OmniSharp.Extensions.LanguageServer": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "g09wOOCQ/oFqtZ47Q5R9E78tz2a5ODEB+V+S65wAiiRskR7xwL78Tse4/8ToBc8G/ZgQgqLtAOPo/BSPmHNlbw==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.LanguageProtocol": "0.19.9", - "OmniSharp.Extensions.LanguageServer.Shared": "0.19.9" - } - }, - "OmniSharp.Extensions.LanguageServer.Shared": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "+p+py79MrNG3QnqRrBp5J7Wc810HFFczMH8/WLIiUqih1bqmKPFY9l/uzBvq1Ko8+YO/8tzI7BDffHvaguISEw==", - "dependencies": { - "OmniSharp.Extensions.LanguageProtocol": "0.19.9" - } - }, - "PowerShellStandard.Library": { - "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "e31xJjG+Kjbv6YF3Yq6D4Dl3or8v7LrNF41k3CXrWozW6hR1zcOe5KYuZJaGSiAgLnwP8wcW+I3+IWEzMPZKXQ==" - }, - "Serilog": { - "type": "Transitive", - "resolved": "3.1.1", - "contentHash": "P6G4/4Kt9bT635bhuwdXlJ2SCqqn2nhh4gqFqQueCOr9bK/e7W9ll/IoX1Ter948cV2Z/5+5v8pAfJYUISY03A==", - "dependencies": { - "System.Diagnostics.DiagnosticSource": "7.0.2", - "System.ValueTuple": "4.5.0" - } - }, - "Serilog.Extensions.Logging": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "YEAMWu1UnWgf1c1KP85l1SgXGfiVo0Rz6x08pCiPOIBt2Qe18tcZLvdBUuV5o1QHvrs8FAry9wTIhgBRtjIlEg==", - "dependencies": { - "Microsoft.Extensions.Logging": "8.0.0", - "Serilog": "3.1.1" - } - }, - "Serilog.Sinks.Async": { - "type": "Transitive", - "resolved": "1.5.0", - "contentHash": "csHYIqAwI4Gy9oAhXYRwxGrQEAtBg3Ep7WaCzsnA1cZuBZjVAU0n7hWaJhItjO7hbLHh/9gRVxALCUB4Dv+gZw==", - "dependencies": { - "Serilog": "2.9.0" - } - }, - "Serilog.Sinks.File": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "uwV5hdhWPwUH1szhO8PJpFiahqXmzPzJT/sOijH/kFgUx+cyoDTMM8MHD0adw9+Iem6itoibbUXHYslzXsLEAg==", - "dependencies": { - "Serilog": "2.10.0" - } - }, - "System.Buffers": { - "type": "Transitive", - "resolved": "4.5.1", - "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" - }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g==", - "dependencies": { - "System.Memory": "4.5.4" - } - }, - "System.Diagnostics.DiagnosticSource": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==", - "dependencies": { - "System.Memory": "4.5.5", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "jRn6JYnNPW6xgQazROBLSfpdoczRw694vO5kKvMcNnpXuolEixUyw6IBuBs2Y2mlSX/LdLvyyWmfXhaI3ND1Yg==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Memory": "4.5.5", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "System.IO.Pipes.AccessControl": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "P0FIsXSFNL1AXlHO9zpJ9atRUzVyoPZCkcbkYGZfXXMx9xlGA2H3HOGBwIhpKhB+h0eL3hry/z0UcfJZ+yb2kQ==", - "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Memory": { - "type": "Transitive", - "resolved": "4.5.5", - "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==", - "dependencies": { - "System.Buffers": "4.5.1", - "System.Numerics.Vectors": "4.5.0", - "System.Runtime.CompilerServices.Unsafe": "4.5.3" - } - }, - "System.Numerics.Vectors": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" - }, - "System.Reactive": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "31kfaW4ZupZzPsI5PVe77VhnvFF55qgma7KZr/E0iFTs6fmdhhG8j0mgEx620iLTey1EynOkEfnyTjtNEpJzGw==", - "dependencies": { - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "1.6.0", - "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==", - "dependencies": { - "System.Collections.Immutable": "1.5.0" - } - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" - }, - "System.Security.AccessControl": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", - "dependencies": { - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Security.Principal": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==" - }, - "System.Security.Principal.Windows": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" - }, - "System.Threading.Channels": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==", - "dependencies": { - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "System.Threading.Tasks.Extensions": { - "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "4.5.3" - } - }, - "System.ValueTuple": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==" - }, - "Validation": { - "type": "Transitive", - "resolved": "2.4.18", - "contentHash": "NfvWJ1QeuZ1FQCkqgXTu1cOkRkbNCfxs4Tat+abXLwom6OXbULVhRGp34BTvVB4XPxj6VIAl7KfLfStXMt/Ehw==" - }, - "xunit.abstractions": { - "type": "Transitive", - "resolved": "2.0.3", - "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" - }, - "xunit.analyzers": { - "type": "Transitive", - "resolved": "1.11.0", - "contentHash": "SCv+Ihxv+fCqotGeM8sVwLhw8nzAJ2aFRN5lcoKn9QtGdbVJ79JqDc+4u8/Ddnp2udxtmv+xYFWkHNlb/sk01w==" - }, - "xunit.assert": { - "type": "Transitive", - "resolved": "2.7.0", - "contentHash": "CCTs3bUhmIS4tDwK6Cn/IiabG3RhYzdf65eIkO7u9/grKoN9MrN780LzVED3E8v+vwmmj7b5TW3/GFuZHPAzWA==" - }, - "xunit.core": { - "type": "Transitive", - "resolved": "2.7.0", - "contentHash": "98tzqYAbtc/p/2Ba455XTNbD12Qoo8kPehjC4oDT46CAsLli5JOCU9hFF2MV3HHWMw/Y3yFUV2Vcukplbs6kuA==", - "dependencies": { - "xunit.extensibility.core": "[2.7.0]", - "xunit.extensibility.execution": "[2.7.0]" - } - }, - "xunit.extensibility.core": { - "type": "Transitive", - "resolved": "2.7.0", - "contentHash": "JLnx4PI0vn1Xr1Ust6ydrp2t/ktm2dyGPAVoDJV5gQuvBMSbd2K7WGzODa2ttiz030CeQ8nbsXl05+cvf7QNyA==", - "dependencies": { - "xunit.abstractions": "2.0.3" - } - }, - "xunit.extensibility.execution": { - "type": "Transitive", - "resolved": "2.7.0", - "contentHash": "bjY+crT1jOyxKagFjCMdEVzoenO2v66ru8+CK/0UaXvyG4U9Q3UTieJkbQXbi7/1yZIK1sGh01l5/jh2CwLJtQ==", - "dependencies": { - "xunit.extensibility.core": "[2.7.0]" - } - }, - "Microsoft.PowerShell.EditorServices": { - "type": "Project", - "dependencies": { - "Microsoft.CSharp": "[4.7.0, )", - "Microsoft.Extensions.FileSystemGlobbing": "[8.0.0, )", - "Microsoft.Extensions.Logging": "[8.0.0, )", - "OmniSharp.Extensions.DebugAdapter.Server": "[0.19.9, )", - "OmniSharp.Extensions.LanguageServer": "[0.19.9, )", - "PowerShellStandard.Library": "[5.1.1, )", - "Serilog": "[3.1.1, )", - "Serilog.Extensions.Logging": "[8.0.0, )", - "Serilog.Sinks.Async": "[1.5.0, )", - "Serilog.Sinks.File": "[5.0.0, )", - "System.IO.Pipes.AccessControl": "[5.0.0, )", - "System.Security.Principal": "[4.3.0, )", - "System.Security.Principal.Windows": "[5.0.0, )" - } - }, - "Microsoft.PowerShell.EditorServices.Test.Shared": { - "type": "Project", - "dependencies": { - "Microsoft.PowerShell.EditorServices": "[3.19.0, )" - } - } - }, - "net6.0": { - "Microsoft.NET.Test.Sdk": { - "type": "Direct", - "requested": "[17.9.0, )", - "resolved": "17.9.0", - "contentHash": "7GUNAUbJYn644jzwLm5BD3a2p9C1dmP8Hr6fDPDxgItQk9hBs1Svdxzz07KQ/UphMSmgza9AbijBJGmw5D658A==", - "dependencies": { - "Microsoft.CodeCoverage": "17.9.0", - "Microsoft.TestPlatform.TestHost": "17.9.0" - } - }, - "Microsoft.PowerShell.SDK": { - "type": "Direct", - "requested": "[7.2.18, )", - "resolved": "7.2.18", - "contentHash": "0rFp8M289yx/ArclYFgu0Hiu5545KeFGKj+u1wVe7x/UNnCjZKYJzZz30GB0+mdQ1JsMjRITNgkvOCjnRCS5Kw==", - "dependencies": { - "Microsoft.Extensions.ObjectPool": "5.0.17", - "Microsoft.Management.Infrastructure.CimCmdlets": "7.2.18", - "Microsoft.NETCore.Windows.ApiSets": "1.0.1", - "Microsoft.PowerShell.Commands.Diagnostics": "7.2.18", - "Microsoft.PowerShell.Commands.Management": "7.2.18", - "Microsoft.PowerShell.Commands.Utility": "7.2.18", - "Microsoft.PowerShell.ConsoleHost": "7.2.18", - "Microsoft.PowerShell.Security": "7.2.18", - "Microsoft.WSMan.Management": "7.2.18", - "Microsoft.Windows.Compatibility": "6.0.7", - "System.Data.SqlClient": "4.8.6", - "System.IO.Packaging": "6.0.0", - "System.Management.Automation": "7.2.18", - "System.Net.Http.WinHttpHandler": "6.0.1", - "System.Private.ServiceModel": "4.9.0", - "System.ServiceModel.Duplex": "4.9.0", - "System.ServiceModel.Http": "4.9.0", - "System.ServiceModel.NetTcp": "4.9.0", - "System.ServiceModel.Primitives": "4.9.0", - "System.ServiceModel.Security": "4.9.0", - "System.Text.Encodings.Web": "6.0.0" - } - }, - "xunit": { - "type": "Direct", - "requested": "[2.7.0, )", - "resolved": "2.7.0", - "contentHash": "KcCI5zxh8zbUfQTeErc4oT7YokViVND2V0p4vDJ2VD4lhF9V5qCYMMDNixme7FdwYy3SwPHF+2xC2Dq4Z9GSlA==", - "dependencies": { - "xunit.analyzers": "1.11.0", - "xunit.assert": "2.7.0", - "xunit.core": "[2.7.0]" - } - }, - "xunit.runner.visualstudio": { - "type": "Direct", - "requested": "[2.5.7, )", - "resolved": "2.5.7", - "contentHash": "31Rl7dBJriX0DNwZfDp8gqFOPsiM0c9kqpcH/HvNi9vDp+K7Ydf42H7mVIvYT918Ywzn1ymLg1c4DDC6iU754w==" - }, - "Xunit.SkippableFact": { - "type": "Direct", - "requested": "[1.4.13, )", - "resolved": "1.4.13", - "contentHash": "IyzZNvJEtXGlXrzxDiSbtH5Lyxf4iJdRQADuyjGdDf00LjXRLJwIoezQNFhFGKTMtvk8IIgaSHxW4mAV4O7b8A==", - "dependencies": { - "Validation": "2.4.18", - "xunit.extensibility.execution": "2.4.0" - } - }, - "Markdig.Signed": { - "type": "Transitive", - "resolved": "0.31.0", - "contentHash": "u05eQvNRunYLR+J0SZAgt8ia+qCF3cMfyYh7LR4jSjG5Tg+0HuRrv7u/Gox9kOItWlSacMITcHBio7jas/zaEQ==" - }, - "MediatR": { - "type": "Transitive", - "resolved": "8.1.0", - "contentHash": "KJFnA0MV83bNOhvYbjIX1iDykhwFXoQu0KV7E1SVbNA/CmO2I7SAm2Baly0eS7VJ2GwlmStLajBfeiNgTpvYzQ==" - }, - "Microsoft.ApplicationInsights": { - "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "btZEDWAFNo9CoYliMCriSMTX3ruRGZTtYw4mo2XyyfLlowFicYVM2Xszi5evDG95QRYV7MbbH3D2RqVwfZlJHw==", - "dependencies": { - "System.Diagnostics.DiagnosticSource": "5.0.0" - } - }, - "Microsoft.Bcl.AsyncInterfaces": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "3aeMZ1N0lJoSyzqiP03hqemtb1BijhsJADdobn/4nsMJ8V1H+CrpuduUe4hlRdx+ikBQju1VGjMD1GJ3Sk05Eg==" - }, - "Microsoft.CodeAnalysis.Analyzers": { - "type": "Transitive", - "resolved": "3.3.2", - "contentHash": "7xt6zTlIEizUgEsYAIgm37EbdkiMmr6fP6J9pDoKEpiGM4pi32BCPGr/IczmSJI9Zzp0a6HOzpr9OvpMP+2veA==" - }, - "Microsoft.CodeAnalysis.Common": { - "type": "Transitive", - "resolved": "4.0.1", - "contentHash": "SMREwaVD5SzatlWhh9aahQAtSWdb63NcE//f+bQzgHSECU6xtDtaxk0kwV+asdFfr6HtW38UeO6jvqdfzudg3w==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.2", - "System.Collections.Immutable": "5.0.0", - "System.Memory": "4.5.4", - "System.Reflection.Metadata": "5.0.0", - "System.Runtime.CompilerServices.Unsafe": "5.0.0", - "System.Text.Encoding.CodePages": "4.5.1", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.CodeAnalysis.CSharp": { - "type": "Transitive", - "resolved": "4.0.1", - "contentHash": "Q9RxxydPpUElj/x1/qykDTUGsRoKbJG8H5XUSeMGmMu54fBiuX1xyanom9caa1oQfh5JIW1BgLxobSaWs4WyHQ==", - "dependencies": { - "Microsoft.CodeAnalysis.Common": "[4.0.1]" - } - }, - "Microsoft.CodeCoverage": { - "type": "Transitive", - "resolved": "17.9.0", - "contentHash": "RGD37ZSrratfScYXm7M0HjvxMxZyWZL4jm+XgMZbkIY1UPgjUpbNA/t+WTGj/rC/0Hm9A3IrH3ywbKZkOCnoZA==" - }, - "Microsoft.CSharp": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" - }, - "Microsoft.Extensions.Configuration": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "BUyFU9t+HzlSE7ri4B+AQN2BgTgHv/uM82s5ZkgU1BApyzWzIl48nDsG5wR1t0pniNuuyTBzG3qCW8152/NtSw==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Configuration.Binder": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" - }, - "Microsoft.Extensions.FileSystemGlobbing": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" - }, - "Microsoft.Extensions.Logging": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" - } - }, - "Microsoft.Extensions.ObjectPool": { - "type": "Transitive", - "resolved": "5.0.17", - "contentHash": "EkIghF7cRBcogXKrfhopcCRjMs6b19THqSvACV5Oppp0nDA8oNyTLpAsfBQJ1hLgOjHfc5eNKFaFocKdg9nmnA==" - }, - "Microsoft.Extensions.Options": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "bXWINbTn0vC0FYc9GaQTISbxhQLAMrvtbuvD9N6JelEaIS/Pr62wUCinrq5bf1WRBGczt1v4wDhxFtVFNcMdUQ==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "Microsoft.Management.Infrastructure": { - "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "IaKZRNBBv3sdrmBWd+aqwHq8cVHk/3WgWFAN/dt40MRY9rbtHiDfTTmaEN0tGTmQqGCGDo/ncntA8MvFMvcsRw==", - "dependencies": { - "Microsoft.Management.Infrastructure.Runtime.Unix": "2.0.0", - "Microsoft.Management.Infrastructure.Runtime.Win": "2.0.0" - } - }, - "Microsoft.Management.Infrastructure.CimCmdlets": { - "type": "Transitive", - "resolved": "7.2.18", - "contentHash": "nx2CXZTGtRP3tC+WCqr+A6hgq0UddHd6yjAbkh457yjNYQS5N0EP23rVoF2NfFeVgFy3Gdut3MB6LLeCTEW+EA==", - "dependencies": { - "System.Management.Automation": "7.2.18" - } - }, - "Microsoft.Management.Infrastructure.Runtime.Unix": { - "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "p0lslMX5bdWLxO2P7ao+rjAMOB0LEwPYpzvdCQ2OEYgX2NxFpQ8ILvqPGnYlTAb53rT8gu5DyIol1HboHFYfxQ==" - }, - "Microsoft.Management.Infrastructure.Runtime.Win": { - "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "vjBWQeDOjgernkrOdbEgn7M70SF7hof7ORdKPSlL06Uc15+oYdth5dZju9KsgUoti/cwnkZTiwtDx/lRtay0sA==" - }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, - "Microsoft.NETCore.Windows.ApiSets": { - "type": "Transitive", - "resolved": "1.0.1", - "contentHash": "SaToCvvsGMxTgtLv/BrFQ5IFMPRE1zpWbnqbpwykJa8W5XiX82CXI6K2o7yf5xS7EP6t/JzFLV0SIDuWpvBZVw==" - }, - "Microsoft.PowerShell.Commands.Diagnostics": { - "type": "Transitive", - "resolved": "7.2.18", - "contentHash": "3dYKtjevF/6gdm6yitIwGbqBPBPQ0/Rixtibb/4fab1UdmZjYjOFJDDdbLoG2hL+LLE8PmLIN5rCRKY6Yepriw==", - "dependencies": { - "System.Management.Automation": "7.2.18" - } - }, - "Microsoft.PowerShell.Commands.Management": { - "type": "Transitive", - "resolved": "7.2.18", - "contentHash": "+x3qjcQ9DvwKVbTDVIOVYal7FxuOdqqecbz/ngTqs/uJUcCPOv2p9YgE1NkoAAO9UT56ukxvbaLbMaLihOnI0Q==", - "dependencies": { - "Microsoft.PowerShell.Security": "7.2.18", - "System.ServiceProcess.ServiceController": "6.0.1" - } - }, - "Microsoft.PowerShell.Commands.Utility": { - "type": "Transitive", - "resolved": "7.2.18", - "contentHash": "Qut0tzMArwa5CEb4NDr8Pt/ZKeI18QdfFXIKgJYO4NN6E/15He4lWyoDxw0BDI9vORMGVgeP9uLz+L/i/w+ftA==", - "dependencies": { - "Markdig.Signed": "0.31.0", - "Microsoft.CodeAnalysis.CSharp": "4.0.1", - "Microsoft.PowerShell.MarkdownRender": "7.2.1", - "Microsoft.Win32.SystemEvents": "6.0.1", - "NJsonSchema": "10.5.2", - "Namotion.Reflection": "2.0.10", - "System.Drawing.Common": "6.0.0", - "System.Management.Automation": "7.2.18", - "System.Threading.AccessControl": "6.0.0" - } - }, - "Microsoft.PowerShell.ConsoleHost": { - "type": "Transitive", - "resolved": "7.2.18", - "contentHash": "xra5nMBncp0JPzoeCjpGqARAJkimxGBFpDY29+/0BIkeFHrlSVttI7ZSMrDamo6OCRUzpPn5gNZIP1LprWOgVw==", - "dependencies": { - "System.Management.Automation": "7.2.18" - } - }, - "Microsoft.PowerShell.CoreCLR.Eventing": { - "type": "Transitive", - "resolved": "7.2.18", - "contentHash": "n3zlvCVXT0vbs5NUZCGgP7bl6xdoB/rddiSnrvIqpW8eNrh8auImj8KKgVNW3iOmL2OzMPIrSCeaP2ZyOSTh3A==", - "dependencies": { - "System.Diagnostics.EventLog": "6.0.0" - } - }, - "Microsoft.PowerShell.MarkdownRender": { - "type": "Transitive", - "resolved": "7.2.1", - "contentHash": "o5oUwL23R/KnjQPD2Oi49WAG5j4O4VLo1fPRSyM/aq0HuTrY2RnF4B3MCGk13BfcmK51p9kPlHZ1+8a/ZjO4Jg==", - "dependencies": { - "Markdig.Signed": "0.31.0" - } - }, - "Microsoft.PowerShell.Native": { - "type": "Transitive", - "resolved": "7.2.1", - "contentHash": "Ce7sccSKHemYA/p/ADD3twqp2RgvtPV6ch+hY6n50tWkGmytfSccYgnhtG30/1SaU0ktCLvg0/NSE6XB10XFqA==" - }, - "Microsoft.PowerShell.Security": { - "type": "Transitive", - "resolved": "7.2.18", - "contentHash": "nbp5NIsAoWC1jFIIG+PSXtfoEFN4Em90JIrDEro6gahQBMVh3QH60vFRqim5WthUbO4Q5IAyzlViGs8AZNSzZw==", - "dependencies": { - "System.Management.Automation": "7.2.18" - } - }, - "Microsoft.TestPlatform.ObjectModel": { - "type": "Transitive", - "resolved": "17.9.0", - "contentHash": "1ilw/8vgmjLyKU+2SKXKXaOqpYFJCQfGqGz+x0cosl981VzjrY74Sv6qAJv+neZMZ9ZMxF3ArN6kotaQ4uvEBw==", - "dependencies": { - "System.Reflection.Metadata": "1.6.0" - } - }, - "Microsoft.TestPlatform.TestHost": { - "type": "Transitive", - "resolved": "17.9.0", - "contentHash": "Spmg7Wx49Ya3SxBjyeAR+nQpjMTKZwTwpZ7KyeOTIqI/WHNPnBU4HUvl5kuHPQAwGWqMy4FGZja1HvEwvoaDiA==", - "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.9.0", - "Newtonsoft.Json": "13.0.1" - } - }, - "Microsoft.VisualStudio.Threading": { - "type": "Transitive", - "resolved": "17.6.40", - "contentHash": "hLa/0xargG7p3bF7aeq2/lRYn/bVnfZXurUWVHx+MNqxxAUjIDMKi4OIOWbYQ/DTkbn9gv8TLvgso+6EtHVQQg==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "Microsoft.VisualStudio.Threading.Analyzers": "17.6.40", - "Microsoft.VisualStudio.Validation": "17.0.71", - "Microsoft.Win32.Registry": "5.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.VisualStudio.Threading.Analyzers": { - "type": "Transitive", - "resolved": "17.6.40", - "contentHash": "uU8vYr/Nx3ldEWcsbiHiyAX1G7od3eFK1+Aga6ZvgCvU+nQkcXYVkIMcSEkIDWkFaldx1dkoVvX3KRNQD0R7dw==" - }, - "Microsoft.VisualStudio.Validation": { - "type": "Transitive", - "resolved": "17.6.11", - "contentHash": "J+9L/iac6c8cwcgVSCMuoIYOlD1Jw4mbZ8XMe1IZVj8p8+3dJ46LnnkIkTRMjK7xs9UtU9MoUp1JGhWoN6fAEw==" - }, - "Microsoft.Win32.Registry": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", - "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "Microsoft.Win32.Registry.AccessControl": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "UoE+eeuBKL+GFHxHV3FjHlY5K8Wr/IR7Ee/a2oDNqFodF1iMqyt5hIs0U9Z217AbWrHrNle4750kD03hv1IMZw==", - "dependencies": { - "System.Security.AccessControl": "6.0.0" - } - }, - "Microsoft.Win32.SystemEvents": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "AlsaDWyQHLFB7O2nfbny0x0oziB34WWzGnf/4Q5R8KjXhu8MnCsxE2MIePr192lIIaxarfTLI9bQg+qtmM+9ag==" - }, - "Microsoft.Windows.Compatibility": { - "type": "Transitive", - "resolved": "6.0.7", - "contentHash": "ubX/cYXBas9hMYhzb4ZkdsMuS+Z1z0X43oZ0rOQq9HnVsQgdbsBCEUmvgFwBxPd41KiPwSZiNZeuBZC+BSyFPw==", - "dependencies": { - "Microsoft.Win32.Registry.AccessControl": "6.0.0", - "Microsoft.Win32.SystemEvents": "6.0.1", - "System.CodeDom": "6.0.0", - "System.ComponentModel.Composition": "6.0.0", - "System.ComponentModel.Composition.Registration": "6.0.0", - "System.Configuration.ConfigurationManager": "6.0.1", - "System.Data.Odbc": "6.0.1", - "System.Data.OleDb": "6.0.0", - "System.Data.SqlClient": "4.8.5", - "System.Diagnostics.EventLog": "6.0.0", - "System.Diagnostics.PerformanceCounter": "6.0.1", - "System.DirectoryServices": "6.0.1", - "System.DirectoryServices.AccountManagement": "6.0.0", - "System.DirectoryServices.Protocols": "6.0.2", - "System.Drawing.Common": "6.0.0", - "System.IO.Packaging": "6.0.0", - "System.IO.Ports": "6.0.0", - "System.Management": "6.0.2", - "System.Reflection.Context": "6.0.0", - "System.Runtime.Caching": "6.0.0", - "System.Security.AccessControl": "6.0.0", - "System.Security.Cryptography.Pkcs": "6.0.4", - "System.Security.Cryptography.ProtectedData": "6.0.0", - "System.Security.Cryptography.Xml": "6.0.1", - "System.Security.Permissions": "6.0.0", - "System.ServiceModel.Duplex": "4.9.0", - "System.ServiceModel.Http": "4.9.0", - "System.ServiceModel.NetTcp": "4.9.0", - "System.ServiceModel.Primitives": "4.9.0", - "System.ServiceModel.Security": "4.9.0", - "System.ServiceModel.Syndication": "6.0.0", - "System.ServiceProcess.ServiceController": "6.0.1", - "System.Speech": "6.0.0", - "System.Text.Encoding.CodePages": "6.0.0", - "System.Threading.AccessControl": "6.0.0", - "System.Web.Services.Description": "4.9.0" - } - }, - "Microsoft.WSMan.Management": { - "type": "Transitive", - "resolved": "7.2.18", - "contentHash": "w2Wnb9M1uSG+JGbwG5bSbW1tCNh3XgA3hdA+/4320YR+jx63yEmySeG6wGxG0Z1sND7uhb6/8usw8bH0do2ZSg==", - "dependencies": { - "Microsoft.WSMan.Runtime": "7.2.18", - "System.Management.Automation": "7.2.18", - "System.ServiceProcess.ServiceController": "6.0.1" - } - }, - "Microsoft.WSMan.Runtime": { - "type": "Transitive", - "resolved": "7.2.18", - "contentHash": "ye/1J/2VsrSBd67B/D68NYxRpAUdtx9aHdDeVGXaDzktf7/P+OgUXPlYmvHCEC5dDvsPli/KFtNWkMhoIwEKOw==" - }, - "Namotion.Reflection": { - "type": "Transitive", - "resolved": "2.0.10", - "contentHash": "KHndyscosup/AnzMQLzW0g6+z0h2NCmTyW9hnEL/T/ZkiUIQWBA1RadYgUT+dXuMORmQI/BXm+DXYySWwq8h0Q==", - "dependencies": { - "Microsoft.CSharp": "4.3.0" - } - }, - "Nerdbank.Streams": { - "type": "Transitive", - "resolved": "2.10.69", - "contentHash": "YIudzeVyQRJAqytjpo1jdHkh2t+vqQqyusBqb2sFSOAOGEnyOXhcHx/rQqSuCIXUDr50a3XuZnamGRfQVBOf4g==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "Microsoft.VisualStudio.Threading": "17.6.40", - "Microsoft.VisualStudio.Validation": "17.6.11", - "System.IO.Pipelines": "7.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "Newtonsoft.Json": { - "type": "Transitive", - "resolved": "13.0.3", - "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" - }, - "NJsonSchema": { - "type": "Transitive", - "resolved": "10.5.2", - "contentHash": "Vr2CbySuXh74TQFU0rGJYZOS492xOE64cPXdB7a0cfXJb/N45Bf4v7sd4LOla0jNhgc5V/B61Ko3qecriL195w==", - "dependencies": { - "Namotion.Reflection": "2.0.3", - "Newtonsoft.Json": "9.0.1" - } - }, - "OmniSharp.Extensions.DebugAdapter": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "Jy9RlVei7ay3LavvPH4F8BnIIMAo5th5EI8JnVe1RQlOxvu18H8hOyZ8fLFHtzbObs+oTONsJ9aynqeyMOErgA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.JsonRpc.Generators": "0.19.9" - } - }, - "OmniSharp.Extensions.DebugAdapter.Server": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "XRJ6EW44DaODkzjAuN1XbpnPFkciJIM2sIx4KpsvV/2Rle1CdRJY4gA6vJn+2uNh5hRr1d0SqZSieqV9Ly0utw==", - "dependencies": { - "OmniSharp.Extensions.DebugAdapter.Shared": "0.19.9" - } - }, - "OmniSharp.Extensions.DebugAdapter.Shared": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "A4psuqk+slrs585cCkZkwUO08nW0I6SVH4u7B7d8wU9lH0LLRTvQBlo3QlxrVAMxjwljPFzXaaRHv7D7X1BXbw==", - "dependencies": { - "OmniSharp.Extensions.DebugAdapter": "0.19.9", - "OmniSharp.Extensions.JsonRpc": "0.19.9" - } - }, - "OmniSharp.Extensions.JsonRpc": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "utFvrx9OYXhCS5rnfWAVeedJCrucuDLAOrKXjohf/NOjG9FFVbcp+hLqj9Ng+AxoADRD+rSJYHfBOeqGl5zW0A==", - "dependencies": { - "MediatR": "8.1.0", - "Microsoft.Extensions.DependencyInjection": "6.0.1", - "Microsoft.Extensions.Logging": "6.0.0", - "Nerdbank.Streams": "2.10.69", - "Newtonsoft.Json": "13.0.3", - "OmniSharp.Extensions.JsonRpc.Generators": "0.19.9", - "System.Collections.Immutable": "5.0.0", - "System.Reactive": "6.0.0", - "System.Threading.Channels": "6.0.0" - } - }, - "OmniSharp.Extensions.JsonRpc.Generators": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "hiWC0yGcKM+K00fgiL7KBmlvULmkKNhm40ZSzxqT+jNV21r+YZgKzEREhQe40ufb4tjcIxdYkif++IzGl/3H/Q==" - }, - "OmniSharp.Extensions.LanguageProtocol": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "d0crY6w5SyunGlERP27YeUeJnJfUjvJoALFlPMU4CHu3jovG1Y8RxLpihCPX8fKdjzgy7Ii+VjFYtIpDEEQqYQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.JsonRpc.Generators": "0.19.9" - } - }, - "OmniSharp.Extensions.LanguageServer": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "g09wOOCQ/oFqtZ47Q5R9E78tz2a5ODEB+V+S65wAiiRskR7xwL78Tse4/8ToBc8G/ZgQgqLtAOPo/BSPmHNlbw==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.LanguageProtocol": "0.19.9", - "OmniSharp.Extensions.LanguageServer.Shared": "0.19.9" - } - }, - "OmniSharp.Extensions.LanguageServer.Shared": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "+p+py79MrNG3QnqRrBp5J7Wc810HFFczMH8/WLIiUqih1bqmKPFY9l/uzBvq1Ko8+YO/8tzI7BDffHvaguISEw==", - "dependencies": { - "OmniSharp.Extensions.LanguageProtocol": "0.19.9" - } - }, - "PowerShellStandard.Library": { - "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "e31xJjG+Kjbv6YF3Yq6D4Dl3or8v7LrNF41k3CXrWozW6hR1zcOe5KYuZJaGSiAgLnwP8wcW+I3+IWEzMPZKXQ==" - }, - "runtime.linux-arm.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "75q52H7CSpgIoIDwXb9o833EvBZIXJ0mdPhz1E6jSisEXUBlSCPalC29cj3EXsjpuDwr0dj1LRXZepIQH/oL4Q==" - }, - "runtime.linux-arm64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "xn2bMThmXr3CsvOYmS8ex2Yz1xo+kcnhVg2iVhS9PlmqjZPAkrEo/I40wjrBZH/tU4kvH0s1AE8opAvQ3KIS8g==" - }, - "runtime.linux-x64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "16nbNXwv0sC+gLGIuecri0skjuh6R1maIJggsaNP7MQBcbVcEfWFUOkEnsnvoLEjy0XerfibuRptfQ8AmdIcWA==" - }, - "runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", - "dependencies": { - "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", - "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", - "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" - } - }, - "runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "KaaXlpOcuZjMdmyF5wzzx3b+PRKIzt6A5Ax9dKenPDQbVJAFpev+casD0BIig1pBcbs3zx7CqWemzUJKAeHdSQ==", - "dependencies": { - "runtime.linux-arm.runtime.native.System.IO.Ports": "6.0.0", - "runtime.linux-arm64.runtime.native.System.IO.Ports": "6.0.0", - "runtime.linux-x64.runtime.native.System.IO.Ports": "6.0.0", - "runtime.osx-arm64.runtime.native.System.IO.Ports": "6.0.0", - "runtime.osx-x64.runtime.native.System.IO.Ports": "6.0.0" - } - }, - "runtime.osx-arm64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "fXG12NodG1QrCdoaeSQ1gVnk/koi4WYY4jZtarMkZeQMyReBm1nZlSRoPnUjLr2ZR36TiMjpcGnQfxymieUe7w==" - }, - "runtime.osx-x64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/As+zPY49+dSUXkh+fTUbyPhqrdGN//evLxo4Vue88pfh1BHZgF7q4kMblTkxYvwR6Vi03zSYxysSFktO8/SDQ==" - }, - "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" - }, - "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" - }, - "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" - }, - "Serilog": { - "type": "Transitive", - "resolved": "3.1.1", - "contentHash": "P6G4/4Kt9bT635bhuwdXlJ2SCqqn2nhh4gqFqQueCOr9bK/e7W9ll/IoX1Ter948cV2Z/5+5v8pAfJYUISY03A==" - }, - "Serilog.Extensions.Logging": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "YEAMWu1UnWgf1c1KP85l1SgXGfiVo0Rz6x08pCiPOIBt2Qe18tcZLvdBUuV5o1QHvrs8FAry9wTIhgBRtjIlEg==", - "dependencies": { - "Microsoft.Extensions.Logging": "8.0.0", - "Serilog": "3.1.1" - } - }, - "Serilog.Sinks.Async": { - "type": "Transitive", - "resolved": "1.5.0", - "contentHash": "csHYIqAwI4Gy9oAhXYRwxGrQEAtBg3Ep7WaCzsnA1cZuBZjVAU0n7hWaJhItjO7hbLHh/9gRVxALCUB4Dv+gZw==", - "dependencies": { - "Serilog": "2.9.0" - } - }, - "Serilog.Sinks.File": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "uwV5hdhWPwUH1szhO8PJpFiahqXmzPzJT/sOijH/kFgUx+cyoDTMM8MHD0adw9+Iem6itoibbUXHYslzXsLEAg==", - "dependencies": { - "Serilog": "2.10.0" - } - }, - "System.CodeDom": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "CPc6tWO1LAer3IzfZufDBRL+UZQcj5uS207NHALQzP84Vp/z6wF0Aa0YZImOQY8iStY0A2zI/e3ihKNPfUm8XA==" - }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g==" - }, - "System.ComponentModel.Composition": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "60Qv+F7oxomOjJeTDA5Z4iCyFbQ0B/2Mi5HT+13pxxq0lVnu2ipbWMzFB+RWKr3wWKA8BSncXr9PH/fECwMX5Q==" - }, - "System.ComponentModel.Composition.Registration": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "+i3RLlOgTsf15VeADBPpzPyRiXq71aLSuzdHeNtmq9f6BwpF3OWhB76p0WDUNCa3Z+SLD4dJbBM9yAep7kQCGA==", - "dependencies": { - "System.ComponentModel.Composition": "6.0.0", - "System.Reflection.Context": "6.0.0" - } - }, - "System.Configuration.ConfigurationManager": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "jXw9MlUu/kRfEU0WyTptAVueupqIeE3/rl0EZDMlf8pcvJnitQ8HeVEp69rZdaStXwTV72boi/Bhw8lOeO+U2w==", - "dependencies": { - "System.Security.Cryptography.ProtectedData": "6.0.0", - "System.Security.Permissions": "6.0.0" - } - }, - "System.Data.Odbc": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "4vl7z0b8gcwc2NotcpEkqaLVQAw/wo46zV1uVSoIx2UfJdqlxWKD3ViUicCNJGo41th4kaGcY9kyVe2q9EuB4w==", - "dependencies": { - "System.Text.Encoding.CodePages": "6.0.0" - } - }, - "System.Data.OleDb": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "LQ8PjTIF1LtrrlGiyiTVjAkQtTWKm9GSNnygIlWjhN9y88s7xhy6DUNDDkmQQ9f6ex7mA4k0Tl97lz/CklaiLg==", - "dependencies": { - "System.Configuration.ConfigurationManager": "6.0.0", - "System.Diagnostics.PerformanceCounter": "6.0.0" - } - }, - "System.Data.SqlClient": { - "type": "Transitive", - "resolved": "4.8.6", - "contentHash": "2Ij/LCaTQRyAi5lAv7UUTV9R2FobC8xN9mE0fXBZohum/xLl8IZVmE98Rq5ugQHjCgTBRKqpXRb4ORulRdA6Ig==", - "dependencies": { - "Microsoft.Win32.Registry": "4.7.0", - "System.Security.Principal.Windows": "4.7.0", - "runtime.native.System.Data.SqlClient.sni": "4.7.0" - } - }, - "System.Diagnostics.DiagnosticSource": { - "type": "Transitive", - "resolved": "5.0.1", - "contentHash": "uXQEYqav2V3zP6OwkOKtLv+qIi6z3m1hsGyKwXX7ZA7htT4shoVccGxnJ9kVRFPNAsi1ArZTq2oh7WOto6GbkQ==" - }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" - }, - "System.Diagnostics.PerformanceCounter": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "dDl7Gx3bmSrM2k2ZIm+ucEJnLloZRyvfQF1DvfvATcGF3jtaUBiPvChma+6ZcZzxWMirN3kCywkW7PILphXyMQ==", - "dependencies": { - "System.Configuration.ConfigurationManager": "6.0.0" - } - }, - "System.DirectoryServices": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "935IbO7h5FDGYxeO3cbx/CuvBBuk/VI8sENlfmXlh1pupNOB3LAGzdYdPY8CawGJFP7KNrHK5eUlsFoz3F6cuA==", - "dependencies": { - "System.Security.AccessControl": "6.0.0", - "System.Security.Permissions": "6.0.0" - } - }, - "System.DirectoryServices.AccountManagement": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "2iKkY6VC4WX6H13N8WhH2SRUfWCwg2KZR5w9JIS9cw9N8cZhT7VXxHX0L6OX6Po419aSu2LWrJE9tu6b+cUnPA==", - "dependencies": { - "System.Configuration.ConfigurationManager": "6.0.0", - "System.DirectoryServices": "6.0.0", - "System.DirectoryServices.Protocols": "6.0.0", - "System.Security.AccessControl": "6.0.0" - } - }, - "System.DirectoryServices.Protocols": { - "type": "Transitive", - "resolved": "6.0.2", - "contentHash": "vDDPWwHn3/DNZ+kPkdXHoada+tKPEC9bVqDOr4hK6HBSP7hGCUTA0Zw6WU5qpGaqa5M1/V+axHMIv+DNEbIf6g==" - }, - "System.Drawing.Common": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "NfuoKUiP2nUWwKZN6twGqXioIe1zVD0RIj2t976A+czLHr2nY454RwwXs6JU9Htc6mwqL6Dn/nEL3dpVf2jOhg==", - "dependencies": { - "Microsoft.Win32.SystemEvents": "6.0.0" - } - }, - "System.Formats.Asn1": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "T6fD00dQ3NTbPDy31m4eQUwKW84s03z0N2C8HpOklyeaDgaJPa/TexP4/SkORMSOwc7WhKifnA6Ya33AkzmafA==" - }, - "System.IO.Packaging": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "C7OkTRIjqIjAKu6ef/fuj8ynCZTPcTYZnvHaq48bniACgXXJogmEoIc56YCDNTc14xhsbLmgpS3KP+evbsUa2g==" - }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "jRn6JYnNPW6xgQazROBLSfpdoczRw694vO5kKvMcNnpXuolEixUyw6IBuBs2Y2mlSX/LdLvyyWmfXhaI3ND1Yg==" - }, - "System.IO.Pipes.AccessControl": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "P0FIsXSFNL1AXlHO9zpJ9atRUzVyoPZCkcbkYGZfXXMx9xlGA2H3HOGBwIhpKhB+h0eL3hry/z0UcfJZ+yb2kQ==", - "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.IO.Ports": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "dRyGI7fUESar5ZLIpiBOaaNLW7YyOBGftjj5Of+xcduC/Rjl7RjhEnWDvvNBmHuF3d0tdXoqdVI/yrVA8f00XA==", - "dependencies": { - "runtime.native.System.IO.Ports": "6.0.0" - } - }, - "System.Management": { - "type": "Transitive", - "resolved": "6.0.2", - "contentHash": "s6c9x2Kghd+ncEDnT6ApYVOacDXr/Y57oSUSx6wjegMOfKxhtrXn3PdASPNU59y3kB9OJ1yb3l5k6uKr3bhqew==", - "dependencies": { - "System.CodeDom": "6.0.0" - } - }, - "System.Management.Automation": { - "type": "Transitive", - "resolved": "7.2.18", - "contentHash": "SEIWaTtkkajmCGEjOkWHubbQ0ndtrxOPLqG19ogmodjYo+U7jw7MmimOU4fUH2A3wpB1lwXCVqI79x/vvcIPtQ==", - "dependencies": { - "Microsoft.ApplicationInsights": "2.21.0", - "Microsoft.CSharp": "4.7.0", - "Microsoft.Management.Infrastructure": "2.0.0", - "Microsoft.PowerShell.CoreCLR.Eventing": "7.2.18", - "Microsoft.PowerShell.Native": "7.2.1", - "Microsoft.Win32.Registry.AccessControl": "6.0.0", - "Newtonsoft.Json": "13.0.3", - "System.Configuration.ConfigurationManager": "6.0.1", - "System.Diagnostics.DiagnosticSource": "5.0.1", - "System.DirectoryServices": "6.0.1", - "System.Management": "6.0.2", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Security.AccessControl": "6.0.0", - "System.Security.Cryptography.Pkcs": "6.0.4", - "System.Security.Permissions": "6.0.0", - "System.Text.Encoding.CodePages": "6.0.0" - } - }, - "System.Memory": { - "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" - }, - "System.Net.Http.WinHttpHandler": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "zdSpn2+EPBEXmsopvUjkpvbXNN53dqL7BifCKBJ5M+A/P3JEiCL/guuPwuiazu+RzCuEX/NJLnoXhllaf3vBxg==" - }, - "System.Numerics.Vectors": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" - }, - "System.Private.ServiceModel": { - "type": "Transitive", - "resolved": "4.9.0", - "contentHash": "d3RjkrtpjUQ63PzFmm/SZ4aOXeJNP+8YW5QeP0lCJy8iX4xlHdlNLWTF9sRn9SmrFTK757kQXT9Op/R4l858uw==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "5.0.0", - "Microsoft.Extensions.ObjectPool": "5.0.10", - "System.Numerics.Vectors": "4.5.0", - "System.Reflection.DispatchProxy": "4.7.1", - "System.Security.Cryptography.Xml": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Reactive": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "31kfaW4ZupZzPsI5PVe77VhnvFF55qgma7KZr/E0iFTs6fmdhhG8j0mgEx620iLTey1EynOkEfnyTjtNEpJzGw==" - }, - "System.Reflection.Context": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "Vi+Gb41oyOYie7uLSsjRmfRg3bryUg5DssJvj3gDUl0D8z6ipSm6/yi/XNx2rcS5iVMvHcwRUHjcx7ixv0K3/w==" - }, - "System.Reflection.DispatchProxy": { - "type": "Transitive", - "resolved": "4.7.1", - "contentHash": "C1sMLwIG6ILQ2bmOT4gh62V6oJlyF4BlHcVMrOoor49p0Ji2tA8QAoqyMcIhAdH6OHKJ8m7BU+r4LK2CUEOKqw==" - }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" - }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "System.Runtime.Caching": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "E0e03kUp5X2k+UAoVl6efmI7uU7JRBWi5EIdlQ7cr0NpBGjHG4fWII35PgsBY9T4fJQ8E4QPsL0rKksU9gcL5A==", - "dependencies": { - "System.Configuration.ConfigurationManager": "6.0.0" - } - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" - }, - "System.Security.AccessControl": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ==" - }, - "System.Security.Cryptography.Pkcs": { - "type": "Transitive", - "resolved": "6.0.4", - "contentHash": "LGbXi1oUJ9QgCNGXRO9ndzBL/GZgANcsURpMhNR8uO+rca47SZmciS3RSQUvlQRwK3QHZSHNOXzoMUASKA+Anw==", - "dependencies": { - "System.Formats.Asn1": "6.0.0" - } - }, - "System.Security.Cryptography.ProtectedData": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "rp1gMNEZpvx9vP0JW0oHLxlf8oSiQgtno77Y4PLUBjSiDYoD77Y8uXHr1Ea5XG4/pIKhqAdxZ8v8OTUtqo9PeQ==" - }, - "System.Security.Cryptography.Xml": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "5e5bI28T0x73AwTsbuFP4qSRzthmU2C0Gqgg3AZ3KTxmSyA+Uhk31puA3srdaeWaacVnHhLdJywCzqOiEpbO/w==", - "dependencies": { - "System.Security.AccessControl": "6.0.0", - "System.Security.Cryptography.Pkcs": "6.0.1" - } - }, - "System.Security.Permissions": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "T/uuc7AklkDoxmcJ7LGkyX1CcSviZuLCa4jg3PekfJ7SU0niF0IVTXwUiNVP9DSpzou2PpxJ+eNY2IfDM90ZCg==", - "dependencies": { - "System.Security.AccessControl": "6.0.0", - "System.Windows.Extensions": "6.0.0" - } - }, - "System.Security.Principal": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", - "dependencies": { - "System.Runtime": "4.3.0" - } - }, - "System.Security.Principal.Windows": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" - }, - "System.ServiceModel.Duplex": { - "type": "Transitive", - "resolved": "4.9.0", - "contentHash": "Yb8MFiJxBBtm2JnfS/5SxYzm2HqkEmHu5xeaVIHXy83sNpty9wc30JifH2xgda821D6nr1UctbwbdZqN4LBUKQ==", - "dependencies": { - "System.Private.ServiceModel": "4.9.0", - "System.ServiceModel.Primitives": "4.9.0" - } - }, - "System.ServiceModel.Http": { - "type": "Transitive", - "resolved": "4.9.0", - "contentHash": "Z+s3RkLNzJ31fDXAjqXdXp67FqsNG4V3Md3r7FOrzMkHmg61gY8faEfTFPBLxU9tax1HPWt6IHVAquXBKySJaw==", - "dependencies": { - "System.Private.ServiceModel": "4.9.0", - "System.ServiceModel.Primitives": "4.9.0" - } - }, - "System.ServiceModel.NetTcp": { - "type": "Transitive", - "resolved": "4.9.0", - "contentHash": "nXgnnkrZERUF/KwmoLwZPkc7fqgiq94DXkmUZBvDNh/LdZquDvjy2NbhJLElpApOa5x8zEoQoBZyJ2PqNC39qg==", - "dependencies": { - "System.Private.ServiceModel": "4.9.0", - "System.ServiceModel.Primitives": "4.9.0" - } - }, - "System.ServiceModel.Primitives": { - "type": "Transitive", - "resolved": "4.9.0", - "contentHash": "LTFPVdS8Nf76xg/wRZkDa+2Q+GnjTOmwkTlwuoetwX37mAfYnGkf7p8ydhpDwVmomNljpUOhUUGxfjQyd5YcOg==", - "dependencies": { - "System.Private.ServiceModel": "4.9.0" - } - }, - "System.ServiceModel.Security": { - "type": "Transitive", - "resolved": "4.9.0", - "contentHash": "iurpbSmPgotHps94VQ6acvL6hU2gjiuBmQI7PwLLN76jsbSpUcahT0PglccKIAwoMujATk/LWtAapBHpwCFn2g==", - "dependencies": { - "System.Private.ServiceModel": "4.9.0", - "System.ServiceModel.Primitives": "4.9.0" - } - }, - "System.ServiceModel.Syndication": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "cp1mMNG87iJtE0oHXFtfWT6cfski2JNo5iU0siTPi/uN2k1CIJI6FE4jr4v3got2dzt7wBq17fSy44btun9GiA==" - }, - "System.ServiceProcess.ServiceController": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "LJGWSUfoEZ6NBVPGnDsCMDrT8sDI7QJ8SUzuJQUnIDOtkZiC1LFUmsGu+Dq6OdwSnaW9nENIbL7uSd4PF9YpIA==", - "dependencies": { - "System.Diagnostics.EventLog": "6.0.0" - } - }, - "System.Speech": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "GQovERMrNP0Vbtgk8LzH4PlFS6lqHgsL9WkUmv8Kkxa0m0vNakitytpHZlfJ9WR7n9WKLXh68nn2kyL9mflnLg==" - }, - "System.Text.Encoding.CodePages": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "ZFCILZuOvtKPauZ/j/swhvw68ZRi9ATCfvGbk1QfydmcXBkIWecWKn/250UH7rahZ5OoDBaiAudJtPvLwzw85A==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.Threading.AccessControl": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "2258mqWesMch/xCpcnjJBgJP33yhpZLGLbEOm01qwq0efG4b+NG8c9sxYOWNxmDQ82swXrnQRl1Yp2wC1NrfZA==", - "dependencies": { - "System.Security.AccessControl": "6.0.0" - } - }, - "System.Threading.Channels": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" - }, - "System.Threading.Tasks.Extensions": { - "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" - }, - "System.Web.Services.Description": { - "type": "Transitive", - "resolved": "4.9.0", - "contentHash": "d20B3upsWddwSG5xF3eQLs0cAV3tXDsBNqP4kh02ylfgZwqfpf4f/9KiZVIGIoxULt2cKqxWs+U4AdNAJ7L8cQ==" - }, - "System.Windows.Extensions": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "IXoJOXIqc39AIe+CIR7koBtRGMiCt/LPM3lI+PELtDIy9XdyeSrwXFdWV9dzJ2Awl0paLWUaknLxFQ5HpHZUog==", - "dependencies": { - "System.Drawing.Common": "6.0.0" - } - }, - "Validation": { - "type": "Transitive", - "resolved": "2.4.18", - "contentHash": "NfvWJ1QeuZ1FQCkqgXTu1cOkRkbNCfxs4Tat+abXLwom6OXbULVhRGp34BTvVB4XPxj6VIAl7KfLfStXMt/Ehw==" - }, - "xunit.abstractions": { - "type": "Transitive", - "resolved": "2.0.3", - "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" - }, - "xunit.analyzers": { - "type": "Transitive", - "resolved": "1.11.0", - "contentHash": "SCv+Ihxv+fCqotGeM8sVwLhw8nzAJ2aFRN5lcoKn9QtGdbVJ79JqDc+4u8/Ddnp2udxtmv+xYFWkHNlb/sk01w==" - }, - "xunit.assert": { - "type": "Transitive", - "resolved": "2.7.0", - "contentHash": "CCTs3bUhmIS4tDwK6Cn/IiabG3RhYzdf65eIkO7u9/grKoN9MrN780LzVED3E8v+vwmmj7b5TW3/GFuZHPAzWA==" - }, - "xunit.core": { - "type": "Transitive", - "resolved": "2.7.0", - "contentHash": "98tzqYAbtc/p/2Ba455XTNbD12Qoo8kPehjC4oDT46CAsLli5JOCU9hFF2MV3HHWMw/Y3yFUV2Vcukplbs6kuA==", - "dependencies": { - "xunit.extensibility.core": "[2.7.0]", - "xunit.extensibility.execution": "[2.7.0]" - } - }, - "xunit.extensibility.core": { - "type": "Transitive", - "resolved": "2.7.0", - "contentHash": "JLnx4PI0vn1Xr1Ust6ydrp2t/ktm2dyGPAVoDJV5gQuvBMSbd2K7WGzODa2ttiz030CeQ8nbsXl05+cvf7QNyA==", - "dependencies": { - "xunit.abstractions": "2.0.3" - } - }, - "xunit.extensibility.execution": { - "type": "Transitive", - "resolved": "2.7.0", - "contentHash": "bjY+crT1jOyxKagFjCMdEVzoenO2v66ru8+CK/0UaXvyG4U9Q3UTieJkbQXbi7/1yZIK1sGh01l5/jh2CwLJtQ==", - "dependencies": { - "xunit.extensibility.core": "[2.7.0]" - } - }, - "Microsoft.PowerShell.EditorServices": { - "type": "Project", - "dependencies": { - "Microsoft.CSharp": "[4.7.0, )", - "Microsoft.Extensions.FileSystemGlobbing": "[8.0.0, )", - "Microsoft.Extensions.Logging": "[8.0.0, )", - "OmniSharp.Extensions.DebugAdapter.Server": "[0.19.9, )", - "OmniSharp.Extensions.LanguageServer": "[0.19.9, )", - "PowerShellStandard.Library": "[5.1.1, )", - "Serilog": "[3.1.1, )", - "Serilog.Extensions.Logging": "[8.0.0, )", - "Serilog.Sinks.Async": "[1.5.0, )", - "Serilog.Sinks.File": "[5.0.0, )", - "System.IO.Pipes.AccessControl": "[5.0.0, )", - "System.Security.Principal": "[4.3.0, )", - "System.Security.Principal.Windows": "[5.0.0, )" - } - }, - "Microsoft.PowerShell.EditorServices.Test.Shared": { - "type": "Project", - "dependencies": { - "Microsoft.PowerShell.EditorServices": "[3.19.0, )" - } - } - }, - "net7.0": { - "Microsoft.NET.Test.Sdk": { - "type": "Direct", - "requested": "[17.9.0, )", - "resolved": "17.9.0", - "contentHash": "7GUNAUbJYn644jzwLm5BD3a2p9C1dmP8Hr6fDPDxgItQk9hBs1Svdxzz07KQ/UphMSmgza9AbijBJGmw5D658A==", - "dependencies": { - "Microsoft.CodeCoverage": "17.9.0", - "Microsoft.TestPlatform.TestHost": "17.9.0" - } - }, - "Microsoft.PowerShell.SDK": { - "type": "Direct", - "requested": "[7.3.11, )", - "resolved": "7.3.11", - "contentHash": "QKeE4siV3o8CwIlIqxj2AV1GAm7yy+XEOtke1vdUT/IBs7QIPnzFqEFHN9+NJAJ3iiSQFFGq7Mryy3RExS6eJg==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "Microsoft.Extensions.ObjectPool": "7.0.15", - "Microsoft.Management.Infrastructure.CimCmdlets": "7.3.11", - "Microsoft.PowerShell.Commands.Diagnostics": "7.3.11", - "Microsoft.PowerShell.Commands.Management": "7.3.11", - "Microsoft.PowerShell.Commands.Utility": "7.3.11", - "Microsoft.PowerShell.ConsoleHost": "7.3.11", - "Microsoft.PowerShell.Security": "7.3.11", - "Microsoft.WSMan.Management": "7.3.11", - "Microsoft.Win32.Registry": "5.0.0", - "Microsoft.Windows.Compatibility": "7.0.5", - "System.Data.SqlClient": "4.8.6", - "System.IO.Packaging": "7.0.0", - "System.Management.Automation": "7.3.11", - "System.Net.Http.WinHttpHandler": "7.0.0", - "System.Private.ServiceModel": "4.10.3", - "System.Security.Cryptography.ProtectedData": "7.0.1", - "System.Security.Cryptography.Xml": "7.0.1", - "System.ServiceModel.Duplex": "4.10.3", - "System.ServiceModel.Http": "4.10.3", - "System.ServiceModel.NetTcp": "4.10.3", - "System.ServiceModel.Primitives": "4.10.3", - "System.ServiceModel.Security": "4.10.3", - "System.Text.Encodings.Web": "7.0.0", - "System.Web.Services.Description": "4.10.3" - } - }, - "xunit": { - "type": "Direct", - "requested": "[2.7.0, )", - "resolved": "2.7.0", - "contentHash": "KcCI5zxh8zbUfQTeErc4oT7YokViVND2V0p4vDJ2VD4lhF9V5qCYMMDNixme7FdwYy3SwPHF+2xC2Dq4Z9GSlA==", - "dependencies": { - "xunit.analyzers": "1.11.0", - "xunit.assert": "2.7.0", - "xunit.core": "[2.7.0]" - } - }, - "xunit.runner.visualstudio": { - "type": "Direct", - "requested": "[2.5.7, )", - "resolved": "2.5.7", - "contentHash": "31Rl7dBJriX0DNwZfDp8gqFOPsiM0c9kqpcH/HvNi9vDp+K7Ydf42H7mVIvYT918Ywzn1ymLg1c4DDC6iU754w==" - }, - "Xunit.SkippableFact": { - "type": "Direct", - "requested": "[1.4.13, )", - "resolved": "1.4.13", - "contentHash": "IyzZNvJEtXGlXrzxDiSbtH5Lyxf4iJdRQADuyjGdDf00LjXRLJwIoezQNFhFGKTMtvk8IIgaSHxW4mAV4O7b8A==", - "dependencies": { - "Validation": "2.4.18", - "xunit.extensibility.execution": "2.4.0" - } - }, - "Markdig.Signed": { - "type": "Transitive", - "resolved": "0.31.0", - "contentHash": "u05eQvNRunYLR+J0SZAgt8ia+qCF3cMfyYh7LR4jSjG5Tg+0HuRrv7u/Gox9kOItWlSacMITcHBio7jas/zaEQ==" - }, - "MediatR": { - "type": "Transitive", - "resolved": "8.1.0", - "contentHash": "KJFnA0MV83bNOhvYbjIX1iDykhwFXoQu0KV7E1SVbNA/CmO2I7SAm2Baly0eS7VJ2GwlmStLajBfeiNgTpvYzQ==" - }, - "Microsoft.ApplicationInsights": { - "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "btZEDWAFNo9CoYliMCriSMTX3ruRGZTtYw4mo2XyyfLlowFicYVM2Xszi5evDG95QRYV7MbbH3D2RqVwfZlJHw==", - "dependencies": { - "System.Diagnostics.DiagnosticSource": "5.0.0" - } - }, - "Microsoft.Bcl.AsyncInterfaces": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "3aeMZ1N0lJoSyzqiP03hqemtb1BijhsJADdobn/4nsMJ8V1H+CrpuduUe4hlRdx+ikBQju1VGjMD1GJ3Sk05Eg==" - }, - "Microsoft.CodeAnalysis.Analyzers": { - "type": "Transitive", - "resolved": "3.3.3", - "contentHash": "j/rOZtLMVJjrfLRlAMckJLPW/1rze9MT1yfWqSIbUPGRu1m1P0fuo9PmqapwsmePfGB5PJrudQLvmUOAMF0DqQ==" - }, - "Microsoft.CodeAnalysis.Common": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "JfHupS/B7Jb5MZoYkFFABn3mux0wQgxi2D8F/rJYZeRBK2ZOyk7TjQ2Kq9rh6W/DCh0KNbbSbn5qoFar+ueHqw==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.3", - "System.Collections.Immutable": "6.0.0", - "System.Memory": "4.5.5", - "System.Reflection.Metadata": "5.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encoding.CodePages": "6.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.CodeAnalysis.CSharp": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "eD2w0xHRoaqK07hjlOKGR9eLNy3nimiGNeCClNax1NDgS/+DBtBqCjXelOa+TNy99kIB3nHhUqDmr46nDXy/RQ==", - "dependencies": { - "Microsoft.CodeAnalysis.Common": "[4.4.0]" - } - }, - "Microsoft.CodeCoverage": { - "type": "Transitive", - "resolved": "17.9.0", - "contentHash": "RGD37ZSrratfScYXm7M0HjvxMxZyWZL4jm+XgMZbkIY1UPgjUpbNA/t+WTGj/rC/0Hm9A3IrH3ywbKZkOCnoZA==" - }, - "Microsoft.CSharp": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" - }, - "Microsoft.Extensions.Configuration": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "BUyFU9t+HzlSE7ri4B+AQN2BgTgHv/uM82s5ZkgU1BApyzWzIl48nDsG5wR1t0pniNuuyTBzG3qCW8152/NtSw==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Configuration.Binder": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" - }, - "Microsoft.Extensions.FileSystemGlobbing": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" - }, - "Microsoft.Extensions.Logging": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" - } - }, - "Microsoft.Extensions.ObjectPool": { - "type": "Transitive", - "resolved": "7.0.15", - "contentHash": "eP9AS3epm6pOeviGKt2GT+sW1LtLA6lHiY2oQFthoGisGRxDKgxerwXgrsXvWv6YJ9w4Pz/ih3vI1njeSbYPBw==" - }, - "Microsoft.Extensions.Options": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "bXWINbTn0vC0FYc9GaQTISbxhQLAMrvtbuvD9N6JelEaIS/Pr62wUCinrq5bf1WRBGczt1v4wDhxFtVFNcMdUQ==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" - }, - "Microsoft.Management.Infrastructure": { - "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "IaKZRNBBv3sdrmBWd+aqwHq8cVHk/3WgWFAN/dt40MRY9rbtHiDfTTmaEN0tGTmQqGCGDo/ncntA8MvFMvcsRw==", - "dependencies": { - "Microsoft.Management.Infrastructure.Runtime.Unix": "2.0.0", - "Microsoft.Management.Infrastructure.Runtime.Win": "2.0.0" - } - }, - "Microsoft.Management.Infrastructure.CimCmdlets": { - "type": "Transitive", - "resolved": "7.3.11", - "contentHash": "n4rOiTl9SUly/qPXXHtJygaaEt002W7dXN24CoZJllbtyY/dAuIIOTkqN397BGiluff9c1BrmhsjGx7sHoavjg==", - "dependencies": { - "System.Management.Automation": "7.3.11" - } - }, - "Microsoft.Management.Infrastructure.Runtime.Unix": { - "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "p0lslMX5bdWLxO2P7ao+rjAMOB0LEwPYpzvdCQ2OEYgX2NxFpQ8ILvqPGnYlTAb53rT8gu5DyIol1HboHFYfxQ==" - }, - "Microsoft.Management.Infrastructure.Runtime.Win": { - "type": "Transitive", - "resolved": "2.0.0", - "contentHash": "vjBWQeDOjgernkrOdbEgn7M70SF7hof7ORdKPSlL06Uc15+oYdth5dZju9KsgUoti/cwnkZTiwtDx/lRtay0sA==" - }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, - "Microsoft.PowerShell.Commands.Diagnostics": { - "type": "Transitive", - "resolved": "7.3.11", - "contentHash": "FS2k1cOEs7mL1qHg1xOshK6h083mCM+F9vPRQz9twPQG0mZU3nhs0+Fh9U4jJ74zdpBzebZbNgUQYwa0nRCo7g==", - "dependencies": { - "System.Management.Automation": "7.3.11" - } - }, - "Microsoft.PowerShell.Commands.Management": { - "type": "Transitive", - "resolved": "7.3.11", - "contentHash": "/5h9m1knoXmQIbL9kSv65JarwdvZR49QjpQ7xPzDCQnUciTpRBSC1hrY5kgqWeI444xw+s4mEQhkMvyAyvTi8g==", - "dependencies": { - "Microsoft.PowerShell.Security": "7.3.11", - "System.ServiceProcess.ServiceController": "7.0.1" - } - }, - "Microsoft.PowerShell.Commands.Utility": { - "type": "Transitive", - "resolved": "7.3.11", - "contentHash": "RA87scdTlsiVc6HEz9TjB5KunCWVyFTvz0VZKAET8xdhMeaTbiQKMj2zK3qBKI+fLw2O7xhqYsUJqyX9VrWjfg==", - "dependencies": { - "Markdig.Signed": "0.31.0", - "Microsoft.CodeAnalysis.CSharp": "4.4.0", - "Microsoft.PowerShell.MarkdownRender": "7.2.1", - "NJsonSchema": "10.8.0", - "Namotion.Reflection": "2.1.2", - "System.Drawing.Common": "7.0.0", - "System.Management.Automation": "7.3.11", - "System.Threading.AccessControl": "7.0.1" - } - }, - "Microsoft.PowerShell.ConsoleHost": { - "type": "Transitive", - "resolved": "7.3.11", - "contentHash": "2UdF1+vXCPo9nb6PTxNHJ4w+Gv5oMAhWV/4uG8kGIrR47dcDg1GNngdxi0LkZw1jFrTaYWJnG8LQ8Pl66KUAOw==", - "dependencies": { - "System.Management.Automation": "7.3.11" - } - }, - "Microsoft.PowerShell.CoreCLR.Eventing": { - "type": "Transitive", - "resolved": "7.3.11", - "contentHash": "99s2ohi4HIsBE94yTr+ZFaktbhpnuJGHu+orrVb2lBTsM55mOMDcDodDy9t0Wi4bu1kJVr7cbr5guO22z++/VQ==", - "dependencies": { - "System.Diagnostics.EventLog": "7.0.0" - } - }, - "Microsoft.PowerShell.MarkdownRender": { - "type": "Transitive", - "resolved": "7.2.1", - "contentHash": "o5oUwL23R/KnjQPD2Oi49WAG5j4O4VLo1fPRSyM/aq0HuTrY2RnF4B3MCGk13BfcmK51p9kPlHZ1+8a/ZjO4Jg==", - "dependencies": { - "Markdig.Signed": "0.31.0" - } - }, - "Microsoft.PowerShell.Native": { - "type": "Transitive", - "resolved": "7.3.2", - "contentHash": "MlLhJgzrUlxijTKJ19Eht++iGTUdg/F1jSbqwzjnc2Q8XStkUYNh8/81aUcNxWcg+0z1Yj/iUjW7czgWUYdV6Q==" - }, - "Microsoft.PowerShell.Security": { - "type": "Transitive", - "resolved": "7.3.11", - "contentHash": "enBmNAktfPJS1Wlg/MmfgJGsI11oBbEpmwI8pMSCYu7pqh3Wq25h1Sp+eyJAy0Q0MxllIZAbeVVu9LCeu8TphA==", - "dependencies": { - "System.Management.Automation": "7.3.11" - } - }, - "Microsoft.Security.Extensions": { - "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "GjHZBE5PHKrxPRyGujWQKwbKNjPQYds6HcAWKeV49X3KPgBfF2B1vV5uJey5UluyGQlvAO/DezL7WzEx9HlPQA==" - }, - "Microsoft.TestPlatform.ObjectModel": { - "type": "Transitive", - "resolved": "17.9.0", - "contentHash": "1ilw/8vgmjLyKU+2SKXKXaOqpYFJCQfGqGz+x0cosl981VzjrY74Sv6qAJv+neZMZ9ZMxF3ArN6kotaQ4uvEBw==", - "dependencies": { - "System.Reflection.Metadata": "1.6.0" - } - }, - "Microsoft.TestPlatform.TestHost": { - "type": "Transitive", - "resolved": "17.9.0", - "contentHash": "Spmg7Wx49Ya3SxBjyeAR+nQpjMTKZwTwpZ7KyeOTIqI/WHNPnBU4HUvl5kuHPQAwGWqMy4FGZja1HvEwvoaDiA==", - "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.9.0", - "Newtonsoft.Json": "13.0.1" - } - }, - "Microsoft.VisualStudio.Threading": { - "type": "Transitive", - "resolved": "17.6.40", - "contentHash": "hLa/0xargG7p3bF7aeq2/lRYn/bVnfZXurUWVHx+MNqxxAUjIDMKi4OIOWbYQ/DTkbn9gv8TLvgso+6EtHVQQg==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "Microsoft.VisualStudio.Threading.Analyzers": "17.6.40", - "Microsoft.VisualStudio.Validation": "17.0.71", - "Microsoft.Win32.Registry": "5.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.VisualStudio.Threading.Analyzers": { - "type": "Transitive", - "resolved": "17.6.40", - "contentHash": "uU8vYr/Nx3ldEWcsbiHiyAX1G7od3eFK1+Aga6ZvgCvU+nQkcXYVkIMcSEkIDWkFaldx1dkoVvX3KRNQD0R7dw==" - }, - "Microsoft.VisualStudio.Validation": { - "type": "Transitive", - "resolved": "17.6.11", - "contentHash": "J+9L/iac6c8cwcgVSCMuoIYOlD1Jw4mbZ8XMe1IZVj8p8+3dJ46LnnkIkTRMjK7xs9UtU9MoUp1JGhWoN6fAEw==" - }, - "Microsoft.Win32.Registry": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", - "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "Microsoft.Win32.Registry.AccessControl": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "JwM65WXVca58WzqY/Rpz7FGyHbN/SMdyr/3EI2CwPIYkB55EIRJUdPQJwO64x3ntOwPQoqCATKuDYA9K7Np5Ww==" - }, - "Microsoft.Win32.SystemEvents": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "2nXPrhdAyAzir0gLl8Yy8S5Mnm/uBSQQA7jEsILOS1MTyS7DbmV1NgViMtvV1sfCD1ebITpNwb1NIinKeJgUVQ==" - }, - "Microsoft.Windows.Compatibility": { - "type": "Transitive", - "resolved": "7.0.5", - "contentHash": "N4aTGZVV1PYPLVLtNn6jsh2b20oS87jegwkB1yDbV4Fy8bs2FZvsjEjjQg1wc7E29JKuwdNXOUYd9ww9LKuLtA==", - "dependencies": { - "Microsoft.Win32.Registry.AccessControl": "7.0.0", - "Microsoft.Win32.SystemEvents": "7.0.0", - "System.CodeDom": "7.0.0", - "System.ComponentModel.Composition": "7.0.0", - "System.ComponentModel.Composition.Registration": "7.0.0", - "System.Configuration.ConfigurationManager": "7.0.0", - "System.Data.Odbc": "7.0.0", - "System.Data.OleDb": "7.0.0", - "System.Data.SqlClient": "4.8.5", - "System.Diagnostics.EventLog": "7.0.0", - "System.Diagnostics.PerformanceCounter": "7.0.0", - "System.DirectoryServices": "7.0.1", - "System.DirectoryServices.AccountManagement": "7.0.1", - "System.DirectoryServices.Protocols": "7.0.1", - "System.Drawing.Common": "7.0.0", - "System.IO.Packaging": "7.0.0", - "System.IO.Ports": "7.0.0", - "System.Management": "7.0.2", - "System.Reflection.Context": "7.0.0", - "System.Runtime.Caching": "7.0.0", - "System.Security.Cryptography.Pkcs": "7.0.2", - "System.Security.Cryptography.ProtectedData": "7.0.1", - "System.Security.Cryptography.Xml": "7.0.1", - "System.Security.Permissions": "7.0.0", - "System.ServiceModel.Duplex": "4.9.0", - "System.ServiceModel.Http": "4.9.0", - "System.ServiceModel.NetTcp": "4.9.0", - "System.ServiceModel.Primitives": "4.9.0", - "System.ServiceModel.Security": "4.9.0", - "System.ServiceModel.Syndication": "7.0.0", - "System.ServiceProcess.ServiceController": "7.0.1", - "System.Speech": "7.0.0", - "System.Text.Encoding.CodePages": "7.0.0", - "System.Threading.AccessControl": "7.0.1", - "System.Web.Services.Description": "4.9.0" - } - }, - "Microsoft.WSMan.Management": { - "type": "Transitive", - "resolved": "7.3.11", - "contentHash": "A9pD4KCByhco7PnlaTVYAczNGMIbb9yUB2heSZCWLw6b6nC6JMJiawRTwptUeJaw0RfWrB2a/6W2jkecB9UlQg==", - "dependencies": { - "Microsoft.WSMan.Runtime": "7.3.11", - "System.Management.Automation": "7.3.11", - "System.ServiceProcess.ServiceController": "7.0.1" - } - }, - "Microsoft.WSMan.Runtime": { - "type": "Transitive", - "resolved": "7.3.11", - "contentHash": "NUGKQ+OR9Ic0fBMn8kmh9f5YPTNDLIXJxHUDw4amJu6vGE6Zm7lvZZ5P9wQ3+QEU1D3ikpzDKoG+JCHrPsKKag==" - }, - "Namotion.Reflection": { - "type": "Transitive", - "resolved": "2.1.2", - "contentHash": "7tSHAzX8GWKy0qrW6OgQWD7kAZiqzhq+m1503qczuwuK6ZYhOGCQUxw+F3F4KkRM70aB6RMslsRVSCFeouIehw==", - "dependencies": { - "Microsoft.CSharp": "4.3.0" - } - }, - "Nerdbank.Streams": { - "type": "Transitive", - "resolved": "2.10.69", - "contentHash": "YIudzeVyQRJAqytjpo1jdHkh2t+vqQqyusBqb2sFSOAOGEnyOXhcHx/rQqSuCIXUDr50a3XuZnamGRfQVBOf4g==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "Microsoft.VisualStudio.Threading": "17.6.40", - "Microsoft.VisualStudio.Validation": "17.6.11", - "System.IO.Pipelines": "7.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "Newtonsoft.Json": { - "type": "Transitive", - "resolved": "13.0.3", - "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" - }, - "NJsonSchema": { - "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "lChjsLWaxyvElh4WJjVhdIiCtx7rimYGFTxtSi2pAkZf0ZnKaXYIX484HCVyzbDDHejDZPgOrcfAJ3kqNSTONw==", - "dependencies": { - "Namotion.Reflection": "2.1.0", - "Newtonsoft.Json": "9.0.1" - } - }, - "OmniSharp.Extensions.DebugAdapter": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "Jy9RlVei7ay3LavvPH4F8BnIIMAo5th5EI8JnVe1RQlOxvu18H8hOyZ8fLFHtzbObs+oTONsJ9aynqeyMOErgA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.JsonRpc.Generators": "0.19.9" - } - }, - "OmniSharp.Extensions.DebugAdapter.Server": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "XRJ6EW44DaODkzjAuN1XbpnPFkciJIM2sIx4KpsvV/2Rle1CdRJY4gA6vJn+2uNh5hRr1d0SqZSieqV9Ly0utw==", - "dependencies": { - "OmniSharp.Extensions.DebugAdapter.Shared": "0.19.9" - } - }, - "OmniSharp.Extensions.DebugAdapter.Shared": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "A4psuqk+slrs585cCkZkwUO08nW0I6SVH4u7B7d8wU9lH0LLRTvQBlo3QlxrVAMxjwljPFzXaaRHv7D7X1BXbw==", - "dependencies": { - "OmniSharp.Extensions.DebugAdapter": "0.19.9", - "OmniSharp.Extensions.JsonRpc": "0.19.9" - } - }, - "OmniSharp.Extensions.JsonRpc": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "utFvrx9OYXhCS5rnfWAVeedJCrucuDLAOrKXjohf/NOjG9FFVbcp+hLqj9Ng+AxoADRD+rSJYHfBOeqGl5zW0A==", - "dependencies": { - "MediatR": "8.1.0", - "Microsoft.Extensions.DependencyInjection": "6.0.1", - "Microsoft.Extensions.Logging": "6.0.0", - "Nerdbank.Streams": "2.10.69", - "Newtonsoft.Json": "13.0.3", - "OmniSharp.Extensions.JsonRpc.Generators": "0.19.9", - "System.Collections.Immutable": "5.0.0", - "System.Reactive": "6.0.0", - "System.Threading.Channels": "6.0.0" - } - }, - "OmniSharp.Extensions.JsonRpc.Generators": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "hiWC0yGcKM+K00fgiL7KBmlvULmkKNhm40ZSzxqT+jNV21r+YZgKzEREhQe40ufb4tjcIxdYkif++IzGl/3H/Q==" - }, - "OmniSharp.Extensions.LanguageProtocol": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "d0crY6w5SyunGlERP27YeUeJnJfUjvJoALFlPMU4CHu3jovG1Y8RxLpihCPX8fKdjzgy7Ii+VjFYtIpDEEQqYQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.JsonRpc.Generators": "0.19.9" - } - }, - "OmniSharp.Extensions.LanguageServer": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "g09wOOCQ/oFqtZ47Q5R9E78tz2a5ODEB+V+S65wAiiRskR7xwL78Tse4/8ToBc8G/ZgQgqLtAOPo/BSPmHNlbw==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.LanguageProtocol": "0.19.9", - "OmniSharp.Extensions.LanguageServer.Shared": "0.19.9" - } - }, - "OmniSharp.Extensions.LanguageServer.Shared": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "+p+py79MrNG3QnqRrBp5J7Wc810HFFczMH8/WLIiUqih1bqmKPFY9l/uzBvq1Ko8+YO/8tzI7BDffHvaguISEw==", - "dependencies": { - "OmniSharp.Extensions.LanguageProtocol": "0.19.9" - } - }, - "PowerShellStandard.Library": { - "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "e31xJjG+Kjbv6YF3Yq6D4Dl3or8v7LrNF41k3CXrWozW6hR1zcOe5KYuZJaGSiAgLnwP8wcW+I3+IWEzMPZKXQ==" - }, - "runtime.linux-arm.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "CBvgRaF+M0xGLDv2Geb/0v0LEADheH8aK72GRAUJdnqnJVsQO60ki1XO8M3keEhnjm+T5NvLm41pNXAVYAPiSg==" - }, - "runtime.linux-arm64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "5VCyRCtCIYU8FR/W8oo7ouFuJ8tmAg9ddsuXhfCKZfZrbaVZSKxkmNBa6fxkfYPueD0jQfOvwFBmE5c6zalCSw==" - }, - "runtime.linux-x64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "DV9dWDUs23OoZqMWl5IhLr3D+b9koDiSHQxFKdYgWnQbnthv8c/yDjrlrI8nMrDc71RAKCO8jlUojzuPMX04gg==" - }, - "runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", - "dependencies": { - "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", - "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", - "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" - } - }, - "runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "L4Ivegqc3B0Fee7VifFy2JST9nndm+uvJ0viLIZUaImDfnr+JmRin9Tbqd56KuMtm0eVxHpNOWZBPtKrA/1h5Q==", - "dependencies": { - "runtime.linux-arm.runtime.native.System.IO.Ports": "7.0.0", - "runtime.linux-arm64.runtime.native.System.IO.Ports": "7.0.0", - "runtime.linux-x64.runtime.native.System.IO.Ports": "7.0.0", - "runtime.osx-arm64.runtime.native.System.IO.Ports": "7.0.0", - "runtime.osx-x64.runtime.native.System.IO.Ports": "7.0.0" - } - }, - "runtime.osx-arm64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "jFwh4sKSXZ7al5XrItEO4GdGWa6XNxvNx+LhEHjrSzOwawO1znwJ+Dy+VjnrkySX9Qi4bnHNLoiqOXbqMuka4g==" - }, - "runtime.osx-x64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "X4LrHEfke/z9+z+iuVr35NlkhdZldY8JGNMYUN+sfPK/U/6TcE+vP44I0Yv0ir1v0bqIzq3v6Qdv1c1vmp8s4g==" - }, - "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" - }, - "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" - }, - "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" - }, - "Serilog": { - "type": "Transitive", - "resolved": "3.1.1", - "contentHash": "P6G4/4Kt9bT635bhuwdXlJ2SCqqn2nhh4gqFqQueCOr9bK/e7W9ll/IoX1Ter948cV2Z/5+5v8pAfJYUISY03A==" - }, - "Serilog.Extensions.Logging": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "YEAMWu1UnWgf1c1KP85l1SgXGfiVo0Rz6x08pCiPOIBt2Qe18tcZLvdBUuV5o1QHvrs8FAry9wTIhgBRtjIlEg==", - "dependencies": { - "Microsoft.Extensions.Logging": "8.0.0", - "Serilog": "3.1.1" - } - }, - "Serilog.Sinks.Async": { - "type": "Transitive", - "resolved": "1.5.0", - "contentHash": "csHYIqAwI4Gy9oAhXYRwxGrQEAtBg3Ep7WaCzsnA1cZuBZjVAU0n7hWaJhItjO7hbLHh/9gRVxALCUB4Dv+gZw==", - "dependencies": { - "Serilog": "2.9.0" - } - }, - "Serilog.Sinks.File": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "uwV5hdhWPwUH1szhO8PJpFiahqXmzPzJT/sOijH/kFgUx+cyoDTMM8MHD0adw9+Iem6itoibbUXHYslzXsLEAg==", - "dependencies": { - "Serilog": "2.10.0" - } - }, - "System.CodeDom": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "GLltyqEsE5/3IE+zYRP5sNa1l44qKl9v+bfdMcwg+M9qnQf47wK3H0SUR/T+3N4JEQXF3vV4CSuuo0rsg+nq2A==" - }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "l4zZJ1WU2hqpQQHXz1rvC3etVZN+2DLmQMO79FhOTZHMn8tDRr+WU287sbomD0BETlmKDn0ygUgVy9k5xkkJdA==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "System.ComponentModel.Composition": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "orv0h38ZVPCPo/FW0LGv8/TigXwX8cIwXeQcaNYhikkqELDm8sUFLMcof/Sjcq5EvYCm5NA7MV3hG4u75H44UQ==" - }, - "System.ComponentModel.Composition.Registration": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "yy/xYOznnc7Hfg2/LeVqAMlJGv1v7b1ILxFShzx5PWUv53PwU0MaKPG8Dh9DC3gxayzw44UVuQJImhw7LtMKlw==", - "dependencies": { - "System.ComponentModel.Composition": "7.0.0", - "System.Reflection.Context": "7.0.0" - } - }, - "System.Configuration.ConfigurationManager": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "WvRUdlL1lB0dTRZSs5XcQOd5q9MYNk90GkbmRmiCvRHThWiojkpGqWdmEDJdXyHbxG/BhE5hmVbMfRLXW9FJVA==", - "dependencies": { - "System.Diagnostics.EventLog": "7.0.0", - "System.Security.Cryptography.ProtectedData": "7.0.0", - "System.Security.Permissions": "7.0.0" - } - }, - "System.Data.Odbc": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "siwu7NoCsfHa9bfw2a2wSeTt2c/rhk3X8I28nJln1dlxdW3KqhRp0aW87yH1XkCo9h8zO1qcIfdTHO7YvvWLEA==", - "dependencies": { - "System.Text.Encoding.CodePages": "7.0.0" - } - }, - "System.Data.OleDb": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "bhAs+5X5acgg3zQ6N4HqxqfwwmqWJzgt54BC8iwygcqa2jktxDFzxwN83GNvqgoTcTs2tenDS/jmhC+AQsmcyg==", - "dependencies": { - "System.Configuration.ConfigurationManager": "7.0.0", - "System.Diagnostics.PerformanceCounter": "7.0.0" - } - }, - "System.Data.SqlClient": { - "type": "Transitive", - "resolved": "4.8.6", - "contentHash": "2Ij/LCaTQRyAi5lAv7UUTV9R2FobC8xN9mE0fXBZohum/xLl8IZVmE98Rq5ugQHjCgTBRKqpXRb4ORulRdA6Ig==", - "dependencies": { - "Microsoft.Win32.Registry": "4.7.0", - "System.Security.Principal.Windows": "4.7.0", - "runtime.native.System.Data.SqlClient.sni": "4.7.0" - } - }, - "System.Diagnostics.DiagnosticSource": { - "type": "Transitive", - "resolved": "7.0.2", - "contentHash": "hYr3I9N9811e0Bjf2WNwAGGyTuAFbbTgX1RPLt/3Wbm68x3IGcX5Cl75CMmgT6WlNwLQ2tCCWfqYPpypjaf2xA==" - }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "eUDP47obqQm3SFJfP6z+Fx2nJ4KKTQbXB4Q9Uesnzw9SbYdhjyoGXuvDn/gEmFY6N5Z3bFFbpAQGA7m6hrYJCw==" - }, - "System.Diagnostics.PerformanceCounter": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "L+zIMEaXp1vA4wZk1KLMpk6tvU0xy94R0IfmhkmTWeC4KwShsmAfbg5I19LgjsCTYp6GVdXZ2aHluVWL0QqBdA==", - "dependencies": { - "System.Configuration.ConfigurationManager": "7.0.0" - } - }, - "System.DirectoryServices": { - "type": "Transitive", - "resolved": "7.0.1", - "contentHash": "Z4FVdUJEVXbf7/f/hU6cFZDtxN5ozUVKJMzXoHmC+GCeTcqzlxqmWtxurejxG3K+kZ6H0UKwNshoK1CYnmJ1sg==", - "dependencies": { - "System.Security.Permissions": "7.0.0" - } - }, - "System.DirectoryServices.AccountManagement": { - "type": "Transitive", - "resolved": "7.0.1", - "contentHash": "UNytHYwA5IF55WQhashsMG57ize83JUGJxD8YJlOyO9ZlMTOD4Nt7y+A6mvmrU/swDoYWaVL+TNwE6hk9lyvbA==", - "dependencies": { - "System.Configuration.ConfigurationManager": "7.0.0", - "System.DirectoryServices": "7.0.1", - "System.DirectoryServices.Protocols": "7.0.1" - } - }, - "System.DirectoryServices.Protocols": { - "type": "Transitive", - "resolved": "7.0.1", - "contentHash": "t9hsL+UYRzNs30pnT2Tdx6ngX8McFUjru0a0ekNgu/YXfkXN+dx5OvSEv0/p7H2q3pdJLH7TJPWX7e55J8QB9A==" - }, - "System.Drawing.Common": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "KIX+oBU38pxkKPxvLcLfIkOV5Ien8ReN78wro7OF5/erwcmortzeFx+iBswlh2Vz6gVne0khocQudGwaO1Ey6A==", - "dependencies": { - "Microsoft.Win32.SystemEvents": "7.0.0" - } - }, - "System.Formats.Asn1": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "+nfpV0afLmvJW8+pLlHxRjz3oZJw4fkyU9MMEaMhCsHi/SN9bGF9q79ROubDiwTiCHezmK0uCWkPP7tGFP/4yg==" - }, - "System.IO.Packaging": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "+j5ezLP7785/pd4taKQhXAWsymsIW2nTnE/U3/jpGZzcJx5lip6qkj6UrxSE7ZYZfL0GaLuymwGLqwJV/c7O7Q==" - }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "jRn6JYnNPW6xgQazROBLSfpdoczRw694vO5kKvMcNnpXuolEixUyw6IBuBs2Y2mlSX/LdLvyyWmfXhaI3ND1Yg==" - }, - "System.IO.Pipes.AccessControl": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "P0FIsXSFNL1AXlHO9zpJ9atRUzVyoPZCkcbkYGZfXXMx9xlGA2H3HOGBwIhpKhB+h0eL3hry/z0UcfJZ+yb2kQ==", - "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.IO.Ports": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "0nWQjM5IofaIGpvkifN+LLuYwBG6BHlpmphLhhOJepcW12G8qToGuNDRgBzeTVBZzp33wVsESSZ8hUOCfq+8QA==", - "dependencies": { - "runtime.native.System.IO.Ports": "7.0.0" - } - }, - "System.Management": { - "type": "Transitive", - "resolved": "7.0.2", - "contentHash": "/qEUN91mP/MUQmJnM5y5BdT7ZoPuVrtxnFlbJ8a3kBJGhe2wCzBfnPFtK2wTtEEcf3DMGR9J00GZZfg6HRI6yA==", - "dependencies": { - "System.CodeDom": "7.0.0" - } - }, - "System.Management.Automation": { - "type": "Transitive", - "resolved": "7.3.11", - "contentHash": "PvAgBxHIyGN0rAtTLRmjGYo7qIRrdaLm/KFXoomTEHM4hjzLqzxDhT+jd0d7SyA0BYmhwUNVXxlTxTP+V6+swQ==", - "dependencies": { - "Microsoft.ApplicationInsights": "2.21.0", - "Microsoft.CSharp": "4.7.0", - "Microsoft.Management.Infrastructure": "2.0.0", - "Microsoft.PowerShell.CoreCLR.Eventing": "7.3.11", - "Microsoft.PowerShell.Native": "7.3.2", - "Microsoft.Security.Extensions": "1.2.0", - "Microsoft.Win32.Registry.AccessControl": "7.0.0", - "Newtonsoft.Json": "13.0.3", - "System.Configuration.ConfigurationManager": "7.0.0", - "System.Diagnostics.DiagnosticSource": "7.0.2", - "System.DirectoryServices": "7.0.1", - "System.Management": "7.0.2", - "System.Security.AccessControl": "6.0.0", - "System.Security.Cryptography.Pkcs": "7.0.3", - "System.Security.Cryptography.ProtectedData": "7.0.1", - "System.Security.Permissions": "7.0.0", - "System.Text.Encoding.CodePages": "7.0.0" - } - }, - "System.Memory": { - "type": "Transitive", - "resolved": "4.5.5", - "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==" - }, - "System.Net.Http.WinHttpHandler": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "DJjlxpGJMHd7WxTo/WRb9q1tahjZvjer7Xo4rsOKAocrwewpA9L0YLxcKEx0nHQnruiWGgbngSzYt3YUwxc+2A==" - }, - "System.Numerics.Vectors": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" - }, - "System.Private.ServiceModel": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "BcUV7OERlLqGxDXZuIyIMMmk1PbqBblLRbAoigmzIUx/M8A+8epvyPyXRpbgoucKH7QmfYdQIev04Phx2Co08A==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "5.0.0", - "Microsoft.Extensions.ObjectPool": "5.0.10", - "System.Numerics.Vectors": "4.5.0", - "System.Reflection.DispatchProxy": "4.7.1", - "System.Security.Cryptography.Xml": "6.0.1", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Reactive": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "31kfaW4ZupZzPsI5PVe77VhnvFF55qgma7KZr/E0iFTs6fmdhhG8j0mgEx620iLTey1EynOkEfnyTjtNEpJzGw==" - }, - "System.Reflection.Context": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "rVf4vEyGQphXTITF39uXlgTcp8Ekcu2aNwxyVLU7fDyNOk0W+/PPpj9PoC2cFL4wgJZJltiss5eQptE2C4f1Sw==" - }, - "System.Reflection.DispatchProxy": { - "type": "Transitive", - "resolved": "4.7.1", - "contentHash": "C1sMLwIG6ILQ2bmOT4gh62V6oJlyF4BlHcVMrOoor49p0Ji2tA8QAoqyMcIhAdH6OHKJ8m7BU+r4LK2CUEOKqw==" - }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ==" - }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "System.Runtime.Caching": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "M0riW7Zgxca3Elp1iZVhzH7PWWT5bPSrdMFGCAGoH1n9YLuXOYE78ryui051Icf3swWWa8feBRoSxOCYwgMy8w==", - "dependencies": { - "System.Configuration.ConfigurationManager": "7.0.0" - } - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" - }, - "System.Security.AccessControl": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ==" - }, - "System.Security.Cryptography.Pkcs": { - "type": "Transitive", - "resolved": "7.0.3", - "contentHash": "yhwEHH5Gzl/VoADrXtt5XC95OFoSjNSWLHNutE7GwdOgefZVRvEXRSooSpL8HHm3qmdd9epqzsWg28UJemt22w==", - "dependencies": { - "System.Formats.Asn1": "7.0.0" - } - }, - "System.Security.Cryptography.ProtectedData": { - "type": "Transitive", - "resolved": "7.0.1", - "contentHash": "3evI3sBfKqwYSwuBcYgShbmEgtXcg8N5Qu+jExLdkBXPty2yGDXq5m1/4sx9Exb8dqdeMPUs/d9DQ0wy/9Adwg==" - }, - "System.Security.Cryptography.Xml": { - "type": "Transitive", - "resolved": "7.0.1", - "contentHash": "MCxBCtH0GrDuvU63ZODwQHQZPchb24pUAX3MfZ6b13qg246ZD10PRdOvay8C9HBPfCXkymUNwFPEegud7ax2zg==", - "dependencies": { - "System.Security.Cryptography.Pkcs": "7.0.0" - } - }, - "System.Security.Permissions": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "Vmp0iRmCEno9BWiskOW5pxJ3d9n+jUqKxvX4GhLwFhnQaySZmBN2FuC0N5gjFHgyFMUjC5sfIJ8KZfoJwkcMmA==", - "dependencies": { - "System.Windows.Extensions": "7.0.0" - } - }, - "System.Security.Principal": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", - "dependencies": { - "System.Runtime": "4.3.0" - } - }, - "System.Security.Principal.Windows": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" - }, - "System.ServiceModel.Duplex": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "IZ8ZahvTenWML7/jGUXSCm6jHlxpMbcb+Hy+h5p1WP9YVtb+Er7FHRRGizqQMINEdK6HhWpD6rzr5PdxNyusdg==", - "dependencies": { - "System.Private.ServiceModel": "4.10.3", - "System.ServiceModel.Primitives": "4.10.3" - } - }, - "System.ServiceModel.Http": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "hodkn0rPTYmoZ9EIPwcleUrOi1gZBPvU0uFvzmJbyxl1lIpVM5GxTrs/pCETStjOXCiXhBDoZQYajquOEfeW/w==", - "dependencies": { - "System.Private.ServiceModel": "4.10.3", - "System.ServiceModel.Primitives": "4.10.3" - } - }, - "System.ServiceModel.NetTcp": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "tP7GN7ehqSIQEz7yOJEtY8ziTpfavf2IQMPKa7r9KGQ75+uEW6/wSlWez7oKQwGYuAHbcGhpJvdG6WoVMKYgkw==", - "dependencies": { - "System.Private.ServiceModel": "4.10.3", - "System.ServiceModel.Primitives": "4.10.3" - } - }, - "System.ServiceModel.Primitives": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "aNcdry95wIP1J+/HcLQM/f/AA73LnBQDNc2uCoZ+c1//KpVRp8nMZv5ApMwK+eDNVdCK8G0NLInF+xG3mfQL+g==", - "dependencies": { - "System.Private.ServiceModel": "4.10.3" - } - }, - "System.ServiceModel.Security": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "vqelKb7DvP2inb6LDJ5Igi8wpOYdtLXn5luDW5qEaqkV2sYO1pKlVYBpr6g6m5SevzbdZlVNu67dQiD/H6EdGQ==", - "dependencies": { - "System.Private.ServiceModel": "4.10.3", - "System.ServiceModel.Primitives": "4.10.3" - } - }, - "System.ServiceModel.Syndication": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "V3q1Jr3KWo+i201/vUUPfg83rjJLhL5+ROh16PtPhaUJRHwoEBoGWtg0r6pFBRPaDqNY6hXvNgHktDj0gvMEpA==" - }, - "System.ServiceProcess.ServiceController": { - "type": "Transitive", - "resolved": "7.0.1", - "contentHash": "rPfXTJzYU46AmWYXRATQzQQ01hICrkl3GuUHgpAr9mnUwAVSsga5x3mBxanFPlJBV9ilzqMXbQyDLJQAbyTnSw==", - "dependencies": { - "System.Diagnostics.EventLog": "7.0.0" - } - }, - "System.Speech": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "7E0uB92Cx2sXR67HW9rMKJqDACdLuz9t3I3OwZUFDzAgwKXWuY6CYeRT/NiypHcyZO2be9+0H0w0M6fn7HQtgQ==" - }, - "System.Text.Encoding.CodePages": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "LSyCblMpvOe0N3E+8e0skHcrIhgV2huaNcjUUEa8hRtgEAm36aGkRoC8Jxlb6Ra6GSfF29ftduPNywin8XolzQ==" - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "OP6umVGxc0Z0MvZQBVigj4/U31Pw72ITihDWP9WiWDm+q5aoe0GaJivsfYGq53o6dxH7DcXWiCTl7+0o2CGdmg==" - }, - "System.Threading.AccessControl": { - "type": "Transitive", - "resolved": "7.0.1", - "contentHash": "uh6LWSk8Dlp1cavk4XQYtDHOMZpSa5KiqM0VBiflhXWGT63RGV+NhNsVxiEykL4S/0LVcgy+/AxC5ITQ9QLo8w==" - }, - "System.Threading.Channels": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" - }, - "System.Threading.Tasks.Extensions": { - "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" - }, - "System.Web.Services.Description": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "ORCkTkUo9f1o4ACG+H6SV+0XSxVZ461w3cHzYxEU41y6aKWp1CeNTMYbtdxMw1we6c6t4Hqq15PdcLVcdqno/g==" - }, - "System.Windows.Extensions": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "bR4qdCmssMMbo9Fatci49An5B1UaVJZHKNq70PRgzoLYIlitb8Tj7ns/Xt5Pz1CkERiTjcVBDU2y1AVrPBYkaw==", - "dependencies": { - "System.Drawing.Common": "7.0.0" - } - }, - "Validation": { - "type": "Transitive", - "resolved": "2.4.18", - "contentHash": "NfvWJ1QeuZ1FQCkqgXTu1cOkRkbNCfxs4Tat+abXLwom6OXbULVhRGp34BTvVB4XPxj6VIAl7KfLfStXMt/Ehw==" - }, - "xunit.abstractions": { - "type": "Transitive", - "resolved": "2.0.3", - "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" - }, - "xunit.analyzers": { - "type": "Transitive", - "resolved": "1.11.0", - "contentHash": "SCv+Ihxv+fCqotGeM8sVwLhw8nzAJ2aFRN5lcoKn9QtGdbVJ79JqDc+4u8/Ddnp2udxtmv+xYFWkHNlb/sk01w==" - }, - "xunit.assert": { - "type": "Transitive", - "resolved": "2.7.0", - "contentHash": "CCTs3bUhmIS4tDwK6Cn/IiabG3RhYzdf65eIkO7u9/grKoN9MrN780LzVED3E8v+vwmmj7b5TW3/GFuZHPAzWA==" - }, - "xunit.core": { - "type": "Transitive", - "resolved": "2.7.0", - "contentHash": "98tzqYAbtc/p/2Ba455XTNbD12Qoo8kPehjC4oDT46CAsLli5JOCU9hFF2MV3HHWMw/Y3yFUV2Vcukplbs6kuA==", - "dependencies": { - "xunit.extensibility.core": "[2.7.0]", - "xunit.extensibility.execution": "[2.7.0]" - } - }, - "xunit.extensibility.core": { - "type": "Transitive", - "resolved": "2.7.0", - "contentHash": "JLnx4PI0vn1Xr1Ust6ydrp2t/ktm2dyGPAVoDJV5gQuvBMSbd2K7WGzODa2ttiz030CeQ8nbsXl05+cvf7QNyA==", - "dependencies": { - "xunit.abstractions": "2.0.3" - } - }, - "xunit.extensibility.execution": { - "type": "Transitive", - "resolved": "2.7.0", - "contentHash": "bjY+crT1jOyxKagFjCMdEVzoenO2v66ru8+CK/0UaXvyG4U9Q3UTieJkbQXbi7/1yZIK1sGh01l5/jh2CwLJtQ==", - "dependencies": { - "xunit.extensibility.core": "[2.7.0]" - } - }, - "Microsoft.PowerShell.EditorServices": { - "type": "Project", - "dependencies": { - "Microsoft.CSharp": "[4.7.0, )", - "Microsoft.Extensions.FileSystemGlobbing": "[8.0.0, )", - "Microsoft.Extensions.Logging": "[8.0.0, )", - "OmniSharp.Extensions.DebugAdapter.Server": "[0.19.9, )", - "OmniSharp.Extensions.LanguageServer": "[0.19.9, )", - "PowerShellStandard.Library": "[5.1.1, )", - "Serilog": "[3.1.1, )", - "Serilog.Extensions.Logging": "[8.0.0, )", - "Serilog.Sinks.Async": "[1.5.0, )", - "Serilog.Sinks.File": "[5.0.0, )", - "System.IO.Pipes.AccessControl": "[5.0.0, )", - "System.Security.Principal": "[4.3.0, )", - "System.Security.Principal.Windows": "[5.0.0, )" - } - }, - "Microsoft.PowerShell.EditorServices.Test.Shared": { - "type": "Project", - "dependencies": { - "Microsoft.PowerShell.EditorServices": "[3.19.0, )" - } - } - }, - "net8.0": { - "Microsoft.NET.Test.Sdk": { - "type": "Direct", - "requested": "[17.9.0, )", - "resolved": "17.9.0", - "contentHash": "7GUNAUbJYn644jzwLm5BD3a2p9C1dmP8Hr6fDPDxgItQk9hBs1Svdxzz07KQ/UphMSmgza9AbijBJGmw5D658A==", - "dependencies": { - "Microsoft.CodeCoverage": "17.9.0", - "Microsoft.TestPlatform.TestHost": "17.9.0" - } - }, - "Microsoft.PowerShell.SDK": { - "type": "Direct", - "requested": "[7.4.1, )", - "resolved": "7.4.1", - "contentHash": "1h0KixYhgGUuRQssGWdqvMCxyHYerw8VPK0XEu2OllUj704yGNTsLb2MjUPV5m35UR/R3JSJL6l9VDx1DdG0fw==", - "dependencies": { - "Microsoft.Extensions.ObjectPool": "5.0.17", - "Microsoft.Management.Infrastructure.CimCmdlets": "7.4.1", - "Microsoft.PowerShell.Commands.Diagnostics": "7.4.1", - "Microsoft.PowerShell.Commands.Management": "7.4.1", - "Microsoft.PowerShell.Commands.Utility": "7.4.1", - "Microsoft.PowerShell.ConsoleHost": "7.4.1", - "Microsoft.PowerShell.Security": "7.4.1", - "Microsoft.WSMan.Management": "7.4.1", - "Microsoft.Windows.Compatibility": "8.0.1", - "System.Data.SqlClient": "4.8.6", - "System.IO.Packaging": "8.0.0", - "System.Management.Automation": "7.4.1", - "System.Net.Http.WinHttpHandler": "8.0.0", - "System.Private.ServiceModel": "4.10.3", - "System.ServiceModel.Duplex": "4.10.3", - "System.ServiceModel.Http": "4.10.3", - "System.ServiceModel.NetTcp": "4.10.3", - "System.ServiceModel.Primitives": "4.10.3", - "System.ServiceModel.Security": "4.10.3", - "System.Text.Encodings.Web": "8.0.0", - "System.Web.Services.Description": "4.10.3" - } - }, - "xunit": { - "type": "Direct", - "requested": "[2.7.0, )", - "resolved": "2.7.0", - "contentHash": "KcCI5zxh8zbUfQTeErc4oT7YokViVND2V0p4vDJ2VD4lhF9V5qCYMMDNixme7FdwYy3SwPHF+2xC2Dq4Z9GSlA==", - "dependencies": { - "xunit.analyzers": "1.11.0", - "xunit.assert": "2.7.0", - "xunit.core": "[2.7.0]" - } - }, - "xunit.runner.visualstudio": { - "type": "Direct", - "requested": "[2.5.7, )", - "resolved": "2.5.7", - "contentHash": "31Rl7dBJriX0DNwZfDp8gqFOPsiM0c9kqpcH/HvNi9vDp+K7Ydf42H7mVIvYT918Ywzn1ymLg1c4DDC6iU754w==" - }, - "Xunit.SkippableFact": { - "type": "Direct", - "requested": "[1.4.13, )", - "resolved": "1.4.13", - "contentHash": "IyzZNvJEtXGlXrzxDiSbtH5Lyxf4iJdRQADuyjGdDf00LjXRLJwIoezQNFhFGKTMtvk8IIgaSHxW4mAV4O7b8A==", - "dependencies": { - "Validation": "2.4.18", - "xunit.extensibility.execution": "2.4.0" - } - }, - "JetBrains.Annotations": { - "type": "Transitive", - "resolved": "2021.2.0", - "contentHash": "kKSyoVfndMriKHLfYGmr0uzQuI4jcc3TKGyww7buJFCYeHb/X0kodYBPL7n9454q7v6ASiRmDgpPGaDGerg/Hg==" - }, - "Json.More.Net": { - "type": "Transitive", - "resolved": "1.9.3", - "contentHash": "BKIsKHXR2Jq+LdLdxPo3L09Lv0ld9xs1fAMvSAe2cf2YOl3at9vw0RrMlhC2ookDi7VtrgHXzc2Et5mVBOAUdw==", - "dependencies": { - "System.Text.Json": "6.0.2" - } - }, - "JsonPointer.Net": { - "type": "Transitive", - "resolved": "3.0.3", - "contentHash": "mCGQc15lHLp1R2CVhWiipnZurHXm93+LbPPAT/vXQm5PdHt6WQuYLhaEF8VZ+aXL9P2I6bGND6pDTEfqFs6gig==", - "dependencies": { - "Json.More.Net": "1.8.0" - } - }, - "JsonSchema.Net": { - "type": "Transitive", - "resolved": "5.2.7", - "contentHash": "8un7Xq2MoKiWNo0HQtf2sPr3764W9NjNELIx3l9d3fIKEjg3tYtrZmxN+CgXKtzku4g52CqYUZuI+o0ue226vw==", - "dependencies": { - "JetBrains.Annotations": "2021.2.0", - "Json.More.Net": "1.9.0", - "JsonPointer.Net": "3.0.3" - } - }, - "Markdig.Signed": { - "type": "Transitive", - "resolved": "0.33.0", - "contentHash": "/BE/XANxmocgEqajbWB/ur4Jei+j1FkXppWH9JFmEuoq8T3xJndkQKZVCW/7lTdc9Ru6kfEAkwSXFOv30EkU2Q==" - }, - "MediatR": { - "type": "Transitive", - "resolved": "8.1.0", - "contentHash": "KJFnA0MV83bNOhvYbjIX1iDykhwFXoQu0KV7E1SVbNA/CmO2I7SAm2Baly0eS7VJ2GwlmStLajBfeiNgTpvYzQ==" - }, - "Microsoft.ApplicationInsights": { - "type": "Transitive", - "resolved": "2.21.0", - "contentHash": "btZEDWAFNo9CoYliMCriSMTX3ruRGZTtYw4mo2XyyfLlowFicYVM2Xszi5evDG95QRYV7MbbH3D2RqVwfZlJHw==", - "dependencies": { - "System.Diagnostics.DiagnosticSource": "5.0.0" - } - }, - "Microsoft.Bcl.AsyncInterfaces": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "3aeMZ1N0lJoSyzqiP03hqemtb1BijhsJADdobn/4nsMJ8V1H+CrpuduUe4hlRdx+ikBQju1VGjMD1GJ3Sk05Eg==" - }, - "Microsoft.CodeAnalysis.Analyzers": { - "type": "Transitive", - "resolved": "3.3.4", - "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==" - }, - "Microsoft.CodeAnalysis.Common": { - "type": "Transitive", - "resolved": "4.8.0", - "contentHash": "/jR+e/9aT+BApoQJABlVCKnnggGQbvGh7BKq2/wI1LamxC+LbzhcLj4Vj7gXCofl1n4E521YfF9w0WcASGg/KA==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.4", - "System.Collections.Immutable": "7.0.0", - "System.Reflection.Metadata": "7.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "Microsoft.CodeAnalysis.CSharp": { - "type": "Transitive", - "resolved": "4.8.0", - "contentHash": "+3+qfdb/aaGD8PZRCrsdobbzGs1m9u119SkkJt8e/mk3xLJz/udLtS2T6nY27OTXxBBw10HzAbC8Z9w08VyP/g==", - "dependencies": { - "Microsoft.CodeAnalysis.Common": "[4.8.0]" - } - }, - "Microsoft.CodeCoverage": { - "type": "Transitive", - "resolved": "17.9.0", - "contentHash": "RGD37ZSrratfScYXm7M0HjvxMxZyWZL4jm+XgMZbkIY1UPgjUpbNA/t+WTGj/rC/0Hm9A3IrH3ywbKZkOCnoZA==" - }, - "Microsoft.CSharp": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" - }, - "Microsoft.Extensions.Configuration": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "BUyFU9t+HzlSE7ri4B+AQN2BgTgHv/uM82s5ZkgU1BApyzWzIl48nDsG5wR1t0pniNuuyTBzG3qCW8152/NtSw==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", - "dependencies": { - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Configuration.Binder": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "V8S3bsm50ig6JSyrbcJJ8bW2b9QLGouz+G1miK3UTaOWmMtFwNNNzUf4AleyDWUmTrWMLNnFSLEQtxmxgNQnNQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "cjWrLkJXK0rs4zofsK4bSdg+jhDLTaxrkXu4gS6Y7MAlCvRyNNgwY/lJi5RDlQOnSZweHqoyvgvbdvQsRIW+hg==" - }, - "Microsoft.Extensions.FileSystemGlobbing": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OK+670i7esqlQrPjdIKRbsyMCe9g5kSLpRRQGSr4Q58AOYEe/hCnfLZprh7viNisSUUQZmMrbbuDaIrP+V1ebQ==" - }, - "Microsoft.Extensions.Logging": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "tvRkov9tAJ3xP51LCv3FJ2zINmv1P8Hi8lhhtcKGqM+ImiTCC84uOPEI4z8Cdq2C3o9e+Aa0Gw0rmrsJD77W+w==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "arDBqTgFCyS0EvRV7O3MZturChstm50OJ0y9bDJvAcmEPJm0FFpFyjU/JLYyStNGGey081DvnQYlncNX5SJJGA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" - } - }, - "Microsoft.Extensions.ObjectPool": { - "type": "Transitive", - "resolved": "5.0.17", - "contentHash": "EkIghF7cRBcogXKrfhopcCRjMs6b19THqSvACV5Oppp0nDA8oNyTLpAsfBQJ1hLgOjHfc5eNKFaFocKdg9nmnA==" - }, - "Microsoft.Extensions.Options": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "JOVOfqpnqlVLUzINQ2fox8evY2SKLYJ3BV8QDe/Jyp21u1T7r45x/R/5QdteURMR5r01GxeJSBBUOCOyaNXA3g==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Primitives": "8.0.0" - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "bXWINbTn0vC0FYc9GaQTISbxhQLAMrvtbuvD9N6JelEaIS/Pr62wUCinrq5bf1WRBGczt1v4wDhxFtVFNcMdUQ==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==" - }, - "Microsoft.Management.Infrastructure": { - "type": "Transitive", - "resolved": "3.0.0", - "contentHash": "cGZi0q5IujCTVYKo9h22Pw+UwfZDV82HXO8HTxMG2HqntPlT3Ls8jY6punLp4YzCypJNpfCAu2kae3TIyuAiJw==", - "dependencies": { - "Microsoft.Management.Infrastructure.Runtime.Unix": "3.0.0", - "Microsoft.Management.Infrastructure.Runtime.Win": "3.0.0" - } - }, - "Microsoft.Management.Infrastructure.CimCmdlets": { - "type": "Transitive", - "resolved": "7.4.1", - "contentHash": "y8ssJEx6pd+8Nsebupt8dKyyc+kLutacaaZBIRLKfUc84BE0Pv88hs6v8TF1M3c7pk2xkZDmEXMdVDCpWdJ/YQ==", - "dependencies": { - "System.Management.Automation": "7.4.1" - } - }, - "Microsoft.Management.Infrastructure.Runtime.Unix": { - "type": "Transitive", - "resolved": "3.0.0", - "contentHash": "QZE3uEDvZ0m7LabQvcmNOYHp7v1QPBVMpB/ild0WEE8zqUVAP5y9rRI5we37ImI1bQmW5pZ+3HNC70POPm0jBQ==" - }, - "Microsoft.Management.Infrastructure.Runtime.Win": { - "type": "Transitive", - "resolved": "3.0.0", - "contentHash": "uwMyWN33+iQ8Wm/n1yoPXgFoiYNd0HzJyoqSVhaQZyJfaQrJR3udgcIHjqa1qbc3lS6kvfuUMN4TrF4U4refCQ==" - }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" - }, - "Microsoft.NETCore.Targets": { - "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" - }, - "Microsoft.PowerShell.Commands.Diagnostics": { - "type": "Transitive", - "resolved": "7.4.1", - "contentHash": "TSNoWEO9xQPcQG5TYgi3puJgpwjVbMe5VesgzfZ4+lGWJurgI3y2vanXZSQoyRzlreqEtjBNggS/8TpHOO3nZA==", - "dependencies": { - "System.Management.Automation": "7.4.1" - } - }, - "Microsoft.PowerShell.Commands.Management": { - "type": "Transitive", - "resolved": "7.4.1", - "contentHash": "LtyD1q6dHsiYeVsWLEbBajP1AKy83uXYNwyvRxU6uxO3q4N3+Ntt0wHQsZmSBoS3jvEvHDJklMxmW/SHoNgSKw==", - "dependencies": { - "Microsoft.PowerShell.Security": "7.4.1", - "System.ServiceProcess.ServiceController": "8.0.0" - } - }, - "Microsoft.PowerShell.Commands.Utility": { - "type": "Transitive", - "resolved": "7.4.1", - "contentHash": "P2Fynn9+ooRiAKP5zB2e/fo0hhp/Ss81fqASAHH3mevYZPmnAPNxZMAkvMiayA8Pe6o6GVswXj3vyf5JUtN+mg==", - "dependencies": { - "Json.More.Net": "1.9.3", - "JsonSchema.Net": "5.2.7", - "Markdig.Signed": "0.33.0", - "Microsoft.CodeAnalysis.CSharp": "4.8.0", - "Microsoft.PowerShell.MarkdownRender": "7.2.1", - "System.Drawing.Common": "8.0.1", - "System.Management.Automation": "7.4.1", - "System.Text.Json": "6.0.9", - "System.Threading.AccessControl": "8.0.0" - } - }, - "Microsoft.PowerShell.ConsoleHost": { - "type": "Transitive", - "resolved": "7.4.1", - "contentHash": "IXyTckU0QE0+YdHyR7MvcUXPUQAGMQISX0M0594fV1gemkiIgRQ2Q7la3lEjE09GGwxAkDEfWFxE3Z/cDjV77w==", - "dependencies": { - "System.Management.Automation": "7.4.1" - } - }, - "Microsoft.PowerShell.CoreCLR.Eventing": { - "type": "Transitive", - "resolved": "7.4.1", - "contentHash": "uyByMNZ3XVUrJAxdHrXM/75vcKdfbs04J5iIZfDA8m9z8TJDViRMjyHNcp8K/ZXyzpT2Lua2d7g+dP47E9wAcg==", - "dependencies": { - "System.Diagnostics.EventLog": "8.0.0" - } - }, - "Microsoft.PowerShell.MarkdownRender": { - "type": "Transitive", - "resolved": "7.2.1", - "contentHash": "o5oUwL23R/KnjQPD2Oi49WAG5j4O4VLo1fPRSyM/aq0HuTrY2RnF4B3MCGk13BfcmK51p9kPlHZ1+8a/ZjO4Jg==", - "dependencies": { - "Markdig.Signed": "0.31.0" - } - }, - "Microsoft.PowerShell.Native": { - "type": "Transitive", - "resolved": "7.4.0", - "contentHash": "FlaJ3JBWhqFToYT0ycMb/Xxzoof7oTQbNyI4UikgubC7AMWt5ptBNKjIAMPvOcvEHr+ohaO9GvRWp3tiyS3sKw==" - }, - "Microsoft.PowerShell.Security": { - "type": "Transitive", - "resolved": "7.4.1", - "contentHash": "fEMvsyVqDdGFMSLjNpFHdEGo/OGO2WaQlpyqUCKgRknpnpO+MBaWZBGcLu81sidN3iDtTotClzQOQwVXMeNEVQ==", - "dependencies": { - "System.Management.Automation": "7.4.1" - } - }, - "Microsoft.Security.Extensions": { - "type": "Transitive", - "resolved": "1.2.0", - "contentHash": "GjHZBE5PHKrxPRyGujWQKwbKNjPQYds6HcAWKeV49X3KPgBfF2B1vV5uJey5UluyGQlvAO/DezL7WzEx9HlPQA==" - }, - "Microsoft.TestPlatform.ObjectModel": { - "type": "Transitive", - "resolved": "17.9.0", - "contentHash": "1ilw/8vgmjLyKU+2SKXKXaOqpYFJCQfGqGz+x0cosl981VzjrY74Sv6qAJv+neZMZ9ZMxF3ArN6kotaQ4uvEBw==", - "dependencies": { - "System.Reflection.Metadata": "1.6.0" - } - }, - "Microsoft.TestPlatform.TestHost": { - "type": "Transitive", - "resolved": "17.9.0", - "contentHash": "Spmg7Wx49Ya3SxBjyeAR+nQpjMTKZwTwpZ7KyeOTIqI/WHNPnBU4HUvl5kuHPQAwGWqMy4FGZja1HvEwvoaDiA==", - "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.9.0", - "Newtonsoft.Json": "13.0.1" - } - }, - "Microsoft.VisualStudio.Threading": { - "type": "Transitive", - "resolved": "17.6.40", - "contentHash": "hLa/0xargG7p3bF7aeq2/lRYn/bVnfZXurUWVHx+MNqxxAUjIDMKi4OIOWbYQ/DTkbn9gv8TLvgso+6EtHVQQg==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "Microsoft.VisualStudio.Threading.Analyzers": "17.6.40", - "Microsoft.VisualStudio.Validation": "17.0.71", - "Microsoft.Win32.Registry": "5.0.0", - "System.Threading.Tasks.Extensions": "4.5.4" - } - }, - "Microsoft.VisualStudio.Threading.Analyzers": { - "type": "Transitive", - "resolved": "17.6.40", - "contentHash": "uU8vYr/Nx3ldEWcsbiHiyAX1G7od3eFK1+Aga6ZvgCvU+nQkcXYVkIMcSEkIDWkFaldx1dkoVvX3KRNQD0R7dw==" - }, - "Microsoft.VisualStudio.Validation": { - "type": "Transitive", - "resolved": "17.6.11", - "contentHash": "J+9L/iac6c8cwcgVSCMuoIYOlD1Jw4mbZ8XMe1IZVj8p8+3dJ46LnnkIkTRMjK7xs9UtU9MoUp1JGhWoN6fAEw==" - }, - "Microsoft.Win32.Registry": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", - "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "Microsoft.Win32.Registry.AccessControl": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "u8PB9/v02C8mBXzl0vJ7bOyC020zOP+T1mRct+KA46DqZkB40XtsNn9pGD0QowTRsT6R4jPCghn+yAODn2UMMw==" - }, - "Microsoft.Win32.SystemEvents": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "9opKRyOKMCi2xJ7Bj7kxtZ1r9vbzosMvRrdEhVhDz8j8MoBGgB+WmC94yH839NPH+BclAjtQ/pyagvi/8gDLkw==" - }, - "Microsoft.Windows.Compatibility": { - "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "Gr6QvHy9Y5PK5/ijl+cnCnfLr9HdCVByHtbPR5CxOAPeshURdJ/SNMi1t7qbUMBFCU9zsBlXSE1q/TsOUS0u8A==", - "dependencies": { - "Microsoft.Win32.Registry.AccessControl": "8.0.0", - "Microsoft.Win32.SystemEvents": "8.0.0", - "System.CodeDom": "8.0.0", - "System.ComponentModel.Composition": "8.0.0", - "System.ComponentModel.Composition.Registration": "8.0.0", - "System.Configuration.ConfigurationManager": "8.0.0", - "System.Data.Odbc": "8.0.0", - "System.Data.OleDb": "8.0.0", - "System.Data.SqlClient": "4.8.5", - "System.Diagnostics.EventLog": "8.0.0", - "System.Diagnostics.PerformanceCounter": "8.0.0", - "System.DirectoryServices": "8.0.0", - "System.DirectoryServices.AccountManagement": "8.0.0", - "System.DirectoryServices.Protocols": "8.0.0", - "System.Drawing.Common": "8.0.1", - "System.IO.Packaging": "8.0.0", - "System.IO.Ports": "8.0.0", - "System.Management": "8.0.0", - "System.Reflection.Context": "8.0.0", - "System.Runtime.Caching": "8.0.0", - "System.Security.Cryptography.Pkcs": "8.0.0", - "System.Security.Cryptography.ProtectedData": "8.0.0", - "System.Security.Cryptography.Xml": "8.0.0", - "System.Security.Permissions": "8.0.0", - "System.ServiceModel.Duplex": "4.10.0", - "System.ServiceModel.Http": "4.10.0", - "System.ServiceModel.NetTcp": "4.10.0", - "System.ServiceModel.Primitives": "4.10.0", - "System.ServiceModel.Security": "4.10.0", - "System.ServiceModel.Syndication": "8.0.0", - "System.ServiceProcess.ServiceController": "8.0.0", - "System.Speech": "8.0.0", - "System.Text.Encoding.CodePages": "8.0.0", - "System.Threading.AccessControl": "8.0.0", - "System.Web.Services.Description": "4.10.0" - } - }, - "Microsoft.WSMan.Management": { - "type": "Transitive", - "resolved": "7.4.1", - "contentHash": "fkngCgs8WB0yk4vB+2Q3r3GQWkWq5y1X6Cn3/Y/UFxmpeSm6UFG10Tl5gi0rD2ZNvQgBP9++VVfxoQgSGqqTNQ==", - "dependencies": { - "Microsoft.WSMan.Runtime": "7.4.1", - "System.Management.Automation": "7.4.1", - "System.ServiceProcess.ServiceController": "8.0.0" - } - }, - "Microsoft.WSMan.Runtime": { - "type": "Transitive", - "resolved": "7.4.1", - "contentHash": "m7NZmuQ7WHcosiU1Fpu82VV7bfI36p4bvMmhZOp2ECCgPYy3RvxVPf/SFKJQ5y721e3Ruindb5mVXxXQZ05TaA==" - }, - "Nerdbank.Streams": { - "type": "Transitive", - "resolved": "2.10.69", - "contentHash": "YIudzeVyQRJAqytjpo1jdHkh2t+vqQqyusBqb2sFSOAOGEnyOXhcHx/rQqSuCIXUDr50a3XuZnamGRfQVBOf4g==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "7.0.0", - "Microsoft.VisualStudio.Threading": "17.6.40", - "Microsoft.VisualStudio.Validation": "17.6.11", - "System.IO.Pipelines": "7.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "Newtonsoft.Json": { - "type": "Transitive", - "resolved": "13.0.3", - "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" - }, - "OmniSharp.Extensions.DebugAdapter": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "Jy9RlVei7ay3LavvPH4F8BnIIMAo5th5EI8JnVe1RQlOxvu18H8hOyZ8fLFHtzbObs+oTONsJ9aynqeyMOErgA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.JsonRpc.Generators": "0.19.9" - } - }, - "OmniSharp.Extensions.DebugAdapter.Server": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "XRJ6EW44DaODkzjAuN1XbpnPFkciJIM2sIx4KpsvV/2Rle1CdRJY4gA6vJn+2uNh5hRr1d0SqZSieqV9Ly0utw==", - "dependencies": { - "OmniSharp.Extensions.DebugAdapter.Shared": "0.19.9" - } - }, - "OmniSharp.Extensions.DebugAdapter.Shared": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "A4psuqk+slrs585cCkZkwUO08nW0I6SVH4u7B7d8wU9lH0LLRTvQBlo3QlxrVAMxjwljPFzXaaRHv7D7X1BXbw==", - "dependencies": { - "OmniSharp.Extensions.DebugAdapter": "0.19.9", - "OmniSharp.Extensions.JsonRpc": "0.19.9" - } - }, - "OmniSharp.Extensions.JsonRpc": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "utFvrx9OYXhCS5rnfWAVeedJCrucuDLAOrKXjohf/NOjG9FFVbcp+hLqj9Ng+AxoADRD+rSJYHfBOeqGl5zW0A==", - "dependencies": { - "MediatR": "8.1.0", - "Microsoft.Extensions.DependencyInjection": "6.0.1", - "Microsoft.Extensions.Logging": "6.0.0", - "Nerdbank.Streams": "2.10.69", - "Newtonsoft.Json": "13.0.3", - "OmniSharp.Extensions.JsonRpc.Generators": "0.19.9", - "System.Collections.Immutable": "5.0.0", - "System.Reactive": "6.0.0", - "System.Threading.Channels": "6.0.0" - } - }, - "OmniSharp.Extensions.JsonRpc.Generators": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "hiWC0yGcKM+K00fgiL7KBmlvULmkKNhm40ZSzxqT+jNV21r+YZgKzEREhQe40ufb4tjcIxdYkif++IzGl/3H/Q==" - }, - "OmniSharp.Extensions.LanguageProtocol": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "d0crY6w5SyunGlERP27YeUeJnJfUjvJoALFlPMU4CHu3jovG1Y8RxLpihCPX8fKdjzgy7Ii+VjFYtIpDEEQqYQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "Microsoft.Extensions.Configuration.Binder": "6.0.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.JsonRpc.Generators": "0.19.9" - } - }, - "OmniSharp.Extensions.LanguageServer": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "g09wOOCQ/oFqtZ47Q5R9E78tz2a5ODEB+V+S65wAiiRskR7xwL78Tse4/8ToBc8G/ZgQgqLtAOPo/BSPmHNlbw==", - "dependencies": { - "Microsoft.Extensions.Configuration": "6.0.1", - "OmniSharp.Extensions.JsonRpc": "0.19.9", - "OmniSharp.Extensions.LanguageProtocol": "0.19.9", - "OmniSharp.Extensions.LanguageServer.Shared": "0.19.9" - } - }, - "OmniSharp.Extensions.LanguageServer.Shared": { - "type": "Transitive", - "resolved": "0.19.9", - "contentHash": "+p+py79MrNG3QnqRrBp5J7Wc810HFFczMH8/WLIiUqih1bqmKPFY9l/uzBvq1Ko8+YO/8tzI7BDffHvaguISEw==", - "dependencies": { - "OmniSharp.Extensions.LanguageProtocol": "0.19.9" - } - }, - "PowerShellStandard.Library": { - "type": "Transitive", - "resolved": "5.1.1", - "contentHash": "e31xJjG+Kjbv6YF3Yq6D4Dl3or8v7LrNF41k3CXrWozW6hR1zcOe5KYuZJaGSiAgLnwP8wcW+I3+IWEzMPZKXQ==" - }, - "runtime.linux-arm.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "gK720fg6HemDg8sXcfy+xCMZ9+hF78Gc7BmREbmkS4noqlu1BAr9qZtuWGhLzFjBfgecmdtl4+SYVwJ1VneZBQ==" - }, - "runtime.linux-arm64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "KYG6/3ojhEWbb3FwQAKgGWPHrY+HKUXXdVjJlrtyCLn3EMcNTaNcPadb2c0ndQzixZSmAxZKopXJr0nLwhOrpQ==" - }, - "runtime.linux-x64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "Wnw5vhA4mgGbIFoo6l9Fk3iEcwRSq49a1aKwJgXUCUtEQLCSUDjTGSxqy/oMUuOyyn7uLHsH8KgZzQ1y3lReiQ==" - }, - "runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.7.0", - "contentHash": "9kyFSIdN3T0qjDQ2R0HRXYIhS3l5psBzQi6qqhdLz+SzFyEy4sVxNOke+yyYv8Cu8rPER12c3RDjLT8wF3WBYQ==", - "dependencies": { - "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": "4.4.0", - "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": "4.4.0", - "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": "4.4.0" - } - }, - "runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "Ee7Sz5llLpTgyKIWzKI/GeuRSbFkOABgJRY00SqTY0OkTYtkB+9l5rFZfE7fxPA3c22RfytCBYkUdAkcmwMjQg==", - "dependencies": { - "runtime.linux-arm.runtime.native.System.IO.Ports": "8.0.0", - "runtime.linux-arm64.runtime.native.System.IO.Ports": "8.0.0", - "runtime.linux-x64.runtime.native.System.IO.Ports": "8.0.0", - "runtime.osx-arm64.runtime.native.System.IO.Ports": "8.0.0", - "runtime.osx-x64.runtime.native.System.IO.Ports": "8.0.0" - } - }, - "runtime.osx-arm64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "rbUBLAaFW9oVkbsb0+XSrAo2QdhBeAyzLl5KQ6Oci9L/u626uXGKInsVJG6B9Z5EO8bmplC8tsMiaHK8wOBZ+w==" - }, - "runtime.osx-x64.runtime.native.System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "IcfB4jKtM9pkzP9OpYelEcUX1MiDt0IJPBh3XYYdEISFF+6Mc+T8WWi0dr9wVh1gtcdVjubVEIBgB8BHESlGfQ==" - }, - "runtime.win-arm64.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "LbrynESTp3bm5O/+jGL8v0Qg5SJlTV08lpIpFesXjF6uGNMWqFnUQbYBJwZTeua6E/Y7FIM1C54Ey1btLWupdg==" - }, - "runtime.win-x64.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "38ugOfkYJqJoX9g6EYRlZB5U2ZJH51UP8ptxZgdpS07FgOEToV+lS11ouNK2PM12Pr6X/PpT5jK82G3DwH/SxQ==" - }, - "runtime.win-x86.runtime.native.System.Data.SqlClient.sni": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "YhEdSQUsTx+C8m8Bw7ar5/VesXvCFMItyZF7G1AUY+OM0VPZUOeAVpJ4Wl6fydBGUYZxojTDR3I6Bj/+BPkJNA==" - }, - "Serilog": { - "type": "Transitive", - "resolved": "3.1.1", - "contentHash": "P6G4/4Kt9bT635bhuwdXlJ2SCqqn2nhh4gqFqQueCOr9bK/e7W9ll/IoX1Ter948cV2Z/5+5v8pAfJYUISY03A==" - }, - "Serilog.Extensions.Logging": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "YEAMWu1UnWgf1c1KP85l1SgXGfiVo0Rz6x08pCiPOIBt2Qe18tcZLvdBUuV5o1QHvrs8FAry9wTIhgBRtjIlEg==", - "dependencies": { - "Microsoft.Extensions.Logging": "8.0.0", - "Serilog": "3.1.1" - } - }, - "Serilog.Sinks.Async": { - "type": "Transitive", - "resolved": "1.5.0", - "contentHash": "csHYIqAwI4Gy9oAhXYRwxGrQEAtBg3Ep7WaCzsnA1cZuBZjVAU0n7hWaJhItjO7hbLHh/9gRVxALCUB4Dv+gZw==", - "dependencies": { - "Serilog": "2.9.0" - } - }, - "Serilog.Sinks.File": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "uwV5hdhWPwUH1szhO8PJpFiahqXmzPzJT/sOijH/kFgUx+cyoDTMM8MHD0adw9+Iem6itoibbUXHYslzXsLEAg==", - "dependencies": { - "Serilog": "2.10.0" - } - }, - "System.CodeDom": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "WTlRjL6KWIMr/pAaq3rYqh0TJlzpouaQ/W1eelssHgtlwHAH25jXTkUphTYx9HaIIf7XA6qs/0+YhtLEQRkJ+Q==" - }, - "System.Collections.Immutable": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "dQPcs0U1IKnBdRDBkrCTi1FoajSTBzLcVTpjO4MBCMC7f4pDOIPzgBoX8JjG7X6uZRJ8EBxsi8+DR1JuwjnzOQ==" - }, - "System.ComponentModel.Composition": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "bGhUX5BTivJ9Wax0qnJy7uGq7dn/TQkEpJ2Fpu1etg8dbPwyDkUzNPc1d3I2/jUr9y4wDI3a1dkSmi8X21Pzbw==" - }, - "System.ComponentModel.Composition.Registration": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "BVMXYqX7Z0Zdq3tc94UKJL/cOWq4LF3ufexfdPuUDrDl4ekbbfwPVzsusVbx+aq6Yx60CJnmJLyHtM3V2Q7BBQ==", - "dependencies": { - "System.ComponentModel.Composition": "8.0.0", - "System.Reflection.Context": "8.0.0" - } - }, - "System.Configuration.ConfigurationManager": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "JlYi9XVvIREURRUlGMr1F6vOFLk7YSY4p1vHo4kX3tQ0AGrjqlRWHDi66ImHhy6qwXBG3BJ6Y1QlYQ+Qz6Xgww==", - "dependencies": { - "System.Diagnostics.EventLog": "8.0.0", - "System.Security.Cryptography.ProtectedData": "8.0.0" - } - }, - "System.Data.Odbc": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "c+GfnZt2/HyU+voKw2fctLZClcNjPZPWS+mnIhGvDknRMqL/fwWlREWPgA4csbp9ZkQIgB4qkufgdh/oh5Ubow==", - "dependencies": { - "System.Text.Encoding.CodePages": "8.0.0" - } - }, - "System.Data.OleDb": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FpUTcQ0E8mFvcYp8UZA3NX8wgmhmsCue56g1zfkr1xdOnT5FrYYmC5DWQ9xCw8o8zuxVBKLZvliqEGgmeoalaQ==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0", - "System.Diagnostics.PerformanceCounter": "8.0.0" - } - }, - "System.Data.SqlClient": { - "type": "Transitive", - "resolved": "4.8.6", - "contentHash": "2Ij/LCaTQRyAi5lAv7UUTV9R2FobC8xN9mE0fXBZohum/xLl8IZVmE98Rq5ugQHjCgTBRKqpXRb4ORulRdA6Ig==", - "dependencies": { - "Microsoft.Win32.Registry": "4.7.0", - "System.Security.Principal.Windows": "4.7.0", - "runtime.native.System.Data.SqlClient.sni": "4.7.0" - } - }, - "System.Diagnostics.DiagnosticSource": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "c9xLpVz6PL9lp/djOWtk5KPDZq3cSYpmXoJQY524EOtuFl5z9ZtsotpsyrDW40U1DRnQSYvcPKEUV0X//u6gkQ==" - }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "fdYxcRjQqTTacKId/2IECojlDSFvp7LP5N78+0z/xH7v/Tuw5ZAxu23Y6PTCRinqyu2ePx+Gn1098NC6jM6d+A==" - }, - "System.Diagnostics.PerformanceCounter": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "lX6DXxtJqVGWw7N/QmVoiCyVQ+Q/Xp+jVXPr3gLK1jJExSn1qmAjJQeb8gnOYeeBTG3E3PmG1nu92eYj/TEjpg==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0" - } - }, - "System.DirectoryServices": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "7nit//efUTy1OsAKco2f02PMrwsR2S234N0dVVp84udC77YcvpOQDz5znAWMtgMWBzY1aRJvUW61jo/7vQRfXg==" - }, - "System.DirectoryServices.AccountManagement": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dCT8BYeeisx0IzAf6x+FSVWK3gz2fKI9pgLV16c7dY/lckw4aodNrgXqsFqyqJN5Kfxc3oklG+SCMYkRfg1V7A==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0", - "System.DirectoryServices": "8.0.0", - "System.DirectoryServices.Protocols": "8.0.0" - } - }, - "System.DirectoryServices.Protocols": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "puwJxURHDrYLGTQdsHyeMS72ClTqYa4lDYz6LHSbkZEk5hq8H8JfsO4MyYhB5BMMxg93jsQzLUwrnCumj11UIg==" - }, - "System.Drawing.Common": { - "type": "Transitive", - "resolved": "8.0.1", - "contentHash": "x0rAZECxIGx/YVjN28YRdpqka0+H7YMN9741FUDzipXPDzesd60gef/LI0ZCOcYSDsacTLTHvMAvxHG+TjbNNQ==", - "dependencies": { - "Microsoft.Win32.SystemEvents": "8.0.0" - } - }, - "System.Formats.Asn1": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "AJukBuLoe3QeAF+mfaRKQb2dgyrvt340iMBHYv+VdBzCUM06IxGlvl0o/uPOS7lHnXPN6u8fFRHSHudx5aTi8w==" - }, - "System.IO.Packaging": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "8g1V4YRpdGAxFcK8v9OjuMdIOJSpF30Zb1JGicwVZhly3I994WFyBdV6mQEo8d3T+URQe55/M0U0eIH0Hts1bg==" - }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "jRn6JYnNPW6xgQazROBLSfpdoczRw694vO5kKvMcNnpXuolEixUyw6IBuBs2Y2mlSX/LdLvyyWmfXhaI3ND1Yg==" - }, - "System.IO.Pipes.AccessControl": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "P0FIsXSFNL1AXlHO9zpJ9atRUzVyoPZCkcbkYGZfXXMx9xlGA2H3HOGBwIhpKhB+h0eL3hry/z0UcfJZ+yb2kQ==", - "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.IO.Ports": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "MaiPbx2/QXZc62gm/DrajRrGPG1lU4m08GWMoWiymPYM+ba4kfACp2PbiYpqJ4QiFGhHD00zX3RoVDTucjWe9g==", - "dependencies": { - "runtime.native.System.IO.Ports": "8.0.0" - } - }, - "System.Management": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", - "dependencies": { - "System.CodeDom": "8.0.0" - } - }, - "System.Management.Automation": { - "type": "Transitive", - "resolved": "7.4.1", - "contentHash": "EYUMyAoYAw4Zt+cxKRMjZxzoa6gI++O4sK+cSg8HUhC1HfrJoMhD1u1Fo5CvlGv1KX3OmoJSyukgkDmRHFLQiw==", - "dependencies": { - "Microsoft.ApplicationInsights": "2.21.0", - "Microsoft.Management.Infrastructure": "3.0.0", - "Microsoft.PowerShell.CoreCLR.Eventing": "7.4.1", - "Microsoft.PowerShell.Native": "7.4.0", - "Microsoft.Security.Extensions": "1.2.0", - "Microsoft.Win32.Registry.AccessControl": "8.0.0", - "Newtonsoft.Json": "13.0.3", - "System.Configuration.ConfigurationManager": "8.0.0", - "System.Diagnostics.DiagnosticSource": "8.0.0", - "System.DirectoryServices": "8.0.0", - "System.Management": "8.0.0", - "System.Security.AccessControl": "6.0.0", - "System.Security.Cryptography.Pkcs": "8.0.0", - "System.Security.Permissions": "8.0.0", - "System.Text.Encoding.CodePages": "8.0.0" - } - }, - "System.Net.Http.WinHttpHandler": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "dAtcyQzDpi34VdR1BeEV8yCOeXVEyekYYK6lJZIzG/N5aqEGgT6AB2DsbiidMp8cB6Y7DqqcmQFZaSGUdoubvQ==" - }, - "System.Numerics.Vectors": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" - }, - "System.Private.ServiceModel": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "BcUV7OERlLqGxDXZuIyIMMmk1PbqBblLRbAoigmzIUx/M8A+8epvyPyXRpbgoucKH7QmfYdQIev04Phx2Co08A==", - "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "5.0.0", - "Microsoft.Extensions.ObjectPool": "5.0.10", - "System.Numerics.Vectors": "4.5.0", - "System.Reflection.DispatchProxy": "4.7.1", - "System.Security.Cryptography.Xml": "6.0.1", - "System.Security.Principal.Windows": "5.0.0" - } - }, - "System.Reactive": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "31kfaW4ZupZzPsI5PVe77VhnvFF55qgma7KZr/E0iFTs6fmdhhG8j0mgEx620iLTey1EynOkEfnyTjtNEpJzGw==" - }, - "System.Reflection.Context": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "k76ubeIBOeIVg7vkQ4I+LoB8sY1EzFIc3oHEtoiNLhXleb7TBLXUQu0CFZ4sPlXJzWNabRf+gn1T7lyhOBxIMA==" - }, - "System.Reflection.DispatchProxy": { - "type": "Transitive", - "resolved": "4.7.1", - "contentHash": "C1sMLwIG6ILQ2bmOT4gh62V6oJlyF4BlHcVMrOoor49p0Ji2tA8QAoqyMcIhAdH6OHKJ8m7BU+r4LK2CUEOKqw==" - }, - "System.Reflection.Metadata": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "MclTG61lsD9sYdpNz9xsKBzjsmsfCtcMZYXz/IUr2zlhaTaABonlr1ESeompTgM+Xk+IwtGYU7/voh3YWB/fWw==", - "dependencies": { - "System.Collections.Immutable": "7.0.0" - } - }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" - } - }, - "System.Runtime.Caching": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "4TmlmvGp4kzZomm7J2HJn6IIx0UUrQyhBDyb5O1XiunZlQImXW+B8b7W/sTPcXhSf9rp5NR5aDtQllwbB5elOQ==", - "dependencies": { - "System.Configuration.ConfigurationManager": "8.0.0" - } - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" - }, - "System.Security.AccessControl": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ==" - }, - "System.Security.Cryptography.Pkcs": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "ULmp3xoOwNYjOYp4JZ2NK/6NdTgiN1GQXzVVN1njQ7LOZ0d0B9vyMnhyqbIi9Qw4JXj1JgCsitkTShboHRx7Eg==", - "dependencies": { - "System.Formats.Asn1": "8.0.0" - } - }, - "System.Security.Cryptography.ProtectedData": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "+TUFINV2q2ifyXauQXRwy4CiBhqvDEDZeVJU7qfxya4aRYOKzVBpN+4acx25VcPB9ywUN6C0n8drWl110PhZEg==" - }, - "System.Security.Cryptography.Xml": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "HQSFbakswZ1OXFz2Bt3AJlC6ENDqWeVpgqhf213xqQUMDifzydOHIKVb1RV4prayobvR3ETIScMaQdDF2hwGZA==", - "dependencies": { - "System.Security.Cryptography.Pkcs": "8.0.0" - } - }, - "System.Security.Permissions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "v/BBylw7XevuAsHXoX9dDUUfmBIcUf7Lkz8K3ZXIKz3YRKpw8YftpSir4n4e/jDTKFoaK37AsC3xnk+GNFI1Ow==", - "dependencies": { - "System.Windows.Extensions": "8.0.0" - } - }, - "System.Security.Principal": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "I1tkfQlAoMM2URscUtpcRo/hX0jinXx6a/KUtEQoz3owaYwl3qwsO8cbzYVVnjxrzxjHo3nJC+62uolgeGIS9A==", - "dependencies": { - "System.Runtime": "4.3.0" - } - }, - "System.Security.Principal.Windows": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" - }, - "System.ServiceModel.Duplex": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "IZ8ZahvTenWML7/jGUXSCm6jHlxpMbcb+Hy+h5p1WP9YVtb+Er7FHRRGizqQMINEdK6HhWpD6rzr5PdxNyusdg==", - "dependencies": { - "System.Private.ServiceModel": "4.10.3", - "System.ServiceModel.Primitives": "4.10.3" - } - }, - "System.ServiceModel.Http": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "hodkn0rPTYmoZ9EIPwcleUrOi1gZBPvU0uFvzmJbyxl1lIpVM5GxTrs/pCETStjOXCiXhBDoZQYajquOEfeW/w==", - "dependencies": { - "System.Private.ServiceModel": "4.10.3", - "System.ServiceModel.Primitives": "4.10.3" - } - }, - "System.ServiceModel.NetTcp": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "tP7GN7ehqSIQEz7yOJEtY8ziTpfavf2IQMPKa7r9KGQ75+uEW6/wSlWez7oKQwGYuAHbcGhpJvdG6WoVMKYgkw==", - "dependencies": { - "System.Private.ServiceModel": "4.10.3", - "System.ServiceModel.Primitives": "4.10.3" - } - }, - "System.ServiceModel.Primitives": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "aNcdry95wIP1J+/HcLQM/f/AA73LnBQDNc2uCoZ+c1//KpVRp8nMZv5ApMwK+eDNVdCK8G0NLInF+xG3mfQL+g==", - "dependencies": { - "System.Private.ServiceModel": "4.10.3" - } - }, - "System.ServiceModel.Security": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "vqelKb7DvP2inb6LDJ5Igi8wpOYdtLXn5luDW5qEaqkV2sYO1pKlVYBpr6g6m5SevzbdZlVNu67dQiD/H6EdGQ==", - "dependencies": { - "System.Private.ServiceModel": "4.10.3", - "System.ServiceModel.Primitives": "4.10.3" - } - }, - "System.ServiceModel.Syndication": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "CJxIUwpBkMCPmIx46tFVOt0zpRrYurUHLW6tJBcmyj+MyWpKc6MMcS69B7IdlV/bgtgys073wMIHZX9QOQ1OFA==" - }, - "System.ServiceProcess.ServiceController": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "jtYVG3bpw2n/NvNnP2g/JLri0D4UtfusTvLeH6cZPNAEjJXJVGspS3wLgVvjNbm+wjaYkFgsXejMTocV1T5DIQ==", - "dependencies": { - "System.Diagnostics.EventLog": "8.0.0" - } - }, - "System.Speech": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "CNuiA6vb95Oe5PRjClZEBiaju31vwB8OIeCgeSBXyZL6+MS4RVVB2X/C11z0xCkooHE3Vy91nM2z76emIzR+sg==" - }, - "System.Text.Encoding.CodePages": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "OZIsVplFGaVY90G2SbpgU7EnCoOO5pw1t4ic21dBF3/1omrJFpAGoNAVpPyMVOC90/hvgkGG3VFqR13YgZMQfg==" - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" - }, - "System.Text.Json": { - "type": "Transitive", - "resolved": "6.0.9", - "contentHash": "2j16oUgtIzl7Xtk7demG0i/v5aU/ZvULcAnJvPb63U3ZhXJ494UYcxuEj5Fs49i3XDrk5kU/8I+6l9zRCw3cJw==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0" - } - }, - "System.Threading.AccessControl": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "cIed5+HuYz+eV9yu9TH95zPkqmm1J9Qps9wxjB335sU8tsqc2kGdlTEH9FZzZeCS8a7mNSEsN8ZkyhQp1gfdEw==" - }, - "System.Threading.Channels": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" - }, - "System.Threading.Tasks.Extensions": { - "type": "Transitive", - "resolved": "4.5.4", - "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" - }, - "System.Web.Services.Description": { - "type": "Transitive", - "resolved": "4.10.3", - "contentHash": "ORCkTkUo9f1o4ACG+H6SV+0XSxVZ461w3cHzYxEU41y6aKWp1CeNTMYbtdxMw1we6c6t4Hqq15PdcLVcdqno/g==" - }, - "System.Windows.Extensions": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" - }, - "Validation": { - "type": "Transitive", - "resolved": "2.4.18", - "contentHash": "NfvWJ1QeuZ1FQCkqgXTu1cOkRkbNCfxs4Tat+abXLwom6OXbULVhRGp34BTvVB4XPxj6VIAl7KfLfStXMt/Ehw==" - }, - "xunit.abstractions": { - "type": "Transitive", - "resolved": "2.0.3", - "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" - }, - "xunit.analyzers": { - "type": "Transitive", - "resolved": "1.11.0", - "contentHash": "SCv+Ihxv+fCqotGeM8sVwLhw8nzAJ2aFRN5lcoKn9QtGdbVJ79JqDc+4u8/Ddnp2udxtmv+xYFWkHNlb/sk01w==" - }, - "xunit.assert": { - "type": "Transitive", - "resolved": "2.7.0", - "contentHash": "CCTs3bUhmIS4tDwK6Cn/IiabG3RhYzdf65eIkO7u9/grKoN9MrN780LzVED3E8v+vwmmj7b5TW3/GFuZHPAzWA==" - }, - "xunit.core": { - "type": "Transitive", - "resolved": "2.7.0", - "contentHash": "98tzqYAbtc/p/2Ba455XTNbD12Qoo8kPehjC4oDT46CAsLli5JOCU9hFF2MV3HHWMw/Y3yFUV2Vcukplbs6kuA==", - "dependencies": { - "xunit.extensibility.core": "[2.7.0]", - "xunit.extensibility.execution": "[2.7.0]" - } - }, - "xunit.extensibility.core": { - "type": "Transitive", - "resolved": "2.7.0", - "contentHash": "JLnx4PI0vn1Xr1Ust6ydrp2t/ktm2dyGPAVoDJV5gQuvBMSbd2K7WGzODa2ttiz030CeQ8nbsXl05+cvf7QNyA==", - "dependencies": { - "xunit.abstractions": "2.0.3" - } - }, - "xunit.extensibility.execution": { - "type": "Transitive", - "resolved": "2.7.0", - "contentHash": "bjY+crT1jOyxKagFjCMdEVzoenO2v66ru8+CK/0UaXvyG4U9Q3UTieJkbQXbi7/1yZIK1sGh01l5/jh2CwLJtQ==", - "dependencies": { - "xunit.extensibility.core": "[2.7.0]" - } - }, - "Microsoft.PowerShell.EditorServices": { - "type": "Project", - "dependencies": { - "Microsoft.CSharp": "[4.7.0, )", - "Microsoft.Extensions.FileSystemGlobbing": "[8.0.0, )", - "Microsoft.Extensions.Logging": "[8.0.0, )", - "OmniSharp.Extensions.DebugAdapter.Server": "[0.19.9, )", - "OmniSharp.Extensions.LanguageServer": "[0.19.9, )", - "PowerShellStandard.Library": "[5.1.1, )", - "Serilog": "[3.1.1, )", - "Serilog.Extensions.Logging": "[8.0.0, )", - "Serilog.Sinks.Async": "[1.5.0, )", - "Serilog.Sinks.File": "[5.0.0, )", - "System.IO.Pipes.AccessControl": "[5.0.0, )", - "System.Security.Principal": "[4.3.0, )", - "System.Security.Principal.Windows": "[5.0.0, )" - } - }, - "Microsoft.PowerShell.EditorServices.Test.Shared": { - "type": "Project", - "dependencies": { - "Microsoft.PowerShell.EditorServices": "[3.19.0, )" - } - } - } - } -} \ No newline at end of file From b68e4624b3bf4d7f97517b924d80ffab80ce3827 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Wed, 1 May 2024 12:39:41 -0700 Subject: [PATCH 18/88] Update third party notices --- .gitignore | 87 +- NOTICE.txt | 3923 ++++++++++++++++++++++++++++ PowerShellEditorServices.build.ps1 | 4 +- Third Party Notices.txt | 75 - 4 files changed, 3933 insertions(+), 156 deletions(-) create mode 100644 NOTICE.txt delete mode 100644 Third Party Notices.txt diff --git a/.gitignore b/.gitignore index f73bd5823..ae0c4384b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,79 +1,8 @@ -_ReSharper* -[Bb]in -bin-nano -obj -objd -out/ -tmp/ -.tmp -App_Data -*.user -*.sln.cache -*.suo -TestResults -test/emacs-session.json -[Tt]humbs.db -buildd.* -release/ -*.log -*.bak -packages -OACRTemp/ -build_logs/ -lock -/public/inc/bldver.* -/public/inc/sources.ver -/data -/target -.corext/gen -registered_data.ini -.vs/ -.dotnet/ -module/Plaster -module/PSScriptAnalyzer -module/PSReadLine -docs/_site/ -docs/_repo/ -docs/metadata/ -*.zip - -# Generated build info file -src/PowerShellEditorServices.Hosting/BuildInfo.cs - -# quickbuild.exe -/VersionGeneratingLogs/ -QLogs -QLocal -QTestLogs - -# bad tlb/chm generators in nmake tree -*.tlb -*.chm - -# dumb silverlight -ClientBin/ - -# dump azure -*.build.csdef -csx/ - -# Don't include ScriptAnalyzer binaries -PowerShellEditorServices/** -PowerShellEditorServices.NoNano/** - -PowerShellEditorServices.sln.ide/edb.chk -PowerShellEditorServices.sln.ide/edbres00001.jrs -PowerShellEditorServices.sln.ide/storage.ide -*.jrs - -# Don't include PlatyPS generated MAML -module/PowerShellEditorServices/Commands/en-US/*-help.xml - -# Don't include Third Party Notices in module folder -module/PowerShellEditorServices/Third\ Party\ Notices.txt - -# Visual Studio for Mac generated file -*.userprefs - -# JetBrains generated file (Rider, intelliJ) -.idea/ +bin/ +obj/ +module/PowerShellEditorServices/NOTICE.txt +module/PowerShellEditorServices/Commands/en-US/ +module/Plaster/ +module/PSReadLine/ +module/PSScriptAnalyzer/ +TestResults/ diff --git a/NOTICE.txt b/NOTICE.txt new file mode 100644 index 000000000..c99a59348 --- /dev/null +++ b/NOTICE.txt @@ -0,0 +1,3923 @@ +NOTICES AND INFORMATION +Do Not Translate or Localize + +This software incorporates material from third parties. +Microsoft makes certain open source code available at https://3rdpartysource.microsoft.com, +or you may send a check or money order for US $5.00, including the product name, +the open source component name, platform, and version number, to: + +Source Code Compliance Team +Microsoft Corporation +One Microsoft Way +Redmond, WA 98052 +USA + +Notwithstanding any other terms, you may reverse engineer this software to the extent +required to debug changes to any libraries licensed under the GNU Lesser General Public License. + +--------------------------------------------------------- + +MediatR 8.1.0 - Apache-2.0 + + +Copyright Jimmy Bogard + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Serilog 3.1.1 - Apache-2.0 + + +Copyright 2013-23 Serilog +Copyright (c) 2013-23 Serilog +copyright (c) Serilog Contributors + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Serilog.Extensions.Logging 8.0.0 - Apache-2.0 + + + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Serilog.Sinks.Async 1.5.0 - Apache-2.0 + + + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Serilog.Sinks.File 5.0.0 - Apache-2.0 + + + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Bcl.AsyncInterfaces 7.0.0 - MIT + + +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2005-2020 Rich Felker +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Bcl.AsyncInterfaces 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Configuration 6.0.1 - MIT + + +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2005-2020 Rich Felker +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 1991-2020 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Configuration.Abstractions 6.0.0 - MIT + + +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2005-2020 Rich Felker +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 1991-2020 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Configuration.Binder 6.0.0 - MIT + + +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2005-2020 Rich Felker +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 1991-2020 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.DependencyInjection 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.DependencyInjection.Abstractions 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.FileSystemGlobbing 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Logging 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Logging.Abstractions 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Options 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Options.ConfigurationExtensions 6.0.0 - MIT + + +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2005-2020 Rich Felker +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 1991-2020 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Extensions.Primitives 8.0.0 - MIT + + +Copyright (c) Six Labors +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2022, Wojciech Mula +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2022, Geoff Langdale +Copyright (c) 2005-2020 Rich Felker +Copyright (c) 2012-2021 Yann Collet +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2011-2015 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2012 - present, Victor Zverovich +Copyright (c) 2006 Jb Evain (jbevain@gmail.com) +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.VisualStudio.Threading 17.6.40 - MIT + + +(c) Andrew Arnott +(c) 2019 GitHub, Inc. +(c) Microsoft Corporation +Copyright (c) Manuel Romer +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright 2012 the V8 project +Copyright 1995-2017 Mark Adler +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) Rackspace, US Inc. +Copyright James Newton-King 2008 +Copyright (c) 2013 Scott Kirkland +Copyright (c) 2014, Karlis Gangis +Copyright (c) 2015 Dennis Fischer +Copyright 2012-2017 Mehdi Khalili +Copyright (c) 2015 .NET Foundation +Copyright (c) 2015 Christian Klutz +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2005-2020 Rich Felker +Copyright (c) Microsoft Corporation +Copyright (c) Outercurve Foundation +Copyright LibGit2Sharp contributors +(c) Yoshifumi Kawai and contributors +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) James Newton-King 2008 +Copyright (c) 1991-2017 Unicode, Inc. +Copyright (c) 1991-2020 Unicode, Inc. +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2012-2014 Mehdi Khalili +Copyright (c) 2013-2014 Omar Khudeira +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) .NET Foundation xUnit.net +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) .NET Foundation 0xUnit.net +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright James Newton-King 2008 Json.NET +Copyright (c) .NET Foundation Contributors +Copyright .NET Foundation and Contributors +Copyright 1995-2017 Mark Adler +3 CScs DEFG +Copyright 2012-2016 (c) 2008 VeriSign, Inc. +Copyright (c) 2020 Mara Bos +(c) Antoine Aubry and contributors 2008 - 2019 +Copyright (c) .NET Foundation and Contributors +Copyright (c) Tunnel Vision Laboratories, LLC. +Copyright AssemblyCompany AssemblyConfiguration +Copyright (c) 2017 Yoshifumi Kawai and contributors +Copyright 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright 2012-2016 Copyright 2012-2017 Mehdi Khalili +Copyright (c) .NET Foundation xUnit.net Runner Utility +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) .NET Foundation ,xUnit.net Runner Utility +Copyright (c) .NET Foundation 1xUnit.net Runner Utility +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) .NET Foundation xUnit.net Runner Reporters +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) Antoine Aubry and contributors 2008 - 2019 +Copyright (c) .NET Foundation .xUnit.net Runner Reporters +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) Outercurve Foundation WrapNonExceptionThrows RSDS +Copyright (c) .NET Foundation and Contributors. Visual Studio 2019 +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright (c) .NET Foundation xunit.analyzers, analyzers, roslyn, xunit, xunit.net +Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014 Antoine Aubry and contributors +Copyright Tunnel Vision Laboratories, LLC 2018 1Copyright Tunnel Vision Laboratories, LLC 2018 NAn +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright 2018 Tunnel Vision Laboratories, LLC Documentation DotNetAnalyzers Roslyn Diagnostic Analyzer +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.VisualStudio.Threading.Analyzers 17.6.40 - MIT + + +(c) Andrew Arnott +(c) 2019 GitHub, Inc. +(c) Microsoft Corporation +Copyright (c) Manuel Romer +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright 2012 the V8 project +Copyright 1995-2017 Mark Adler +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) Rackspace, US Inc. +Copyright James Newton-King 2008 +Copyright (c) 2013 Scott Kirkland +Copyright (c) 2014, Karlis Gangis +Copyright (c) 2015 Dennis Fischer +Copyright 2012-2017 Mehdi Khalili +Copyright (c) 2015 .NET Foundation +Copyright (c) 2015 Christian Klutz +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2005-2020 Rich Felker +Copyright (c) Microsoft Corporation +Copyright (c) Outercurve Foundation +Copyright LibGit2Sharp contributors +(c) Yoshifumi Kawai and contributors +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) James Newton-King 2008 +Copyright (c) 1991-2017 Unicode, Inc. +Copyright (c) 1991-2020 Unicode, Inc. +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2012-2014 Mehdi Khalili +Copyright (c) 2013-2014 Omar Khudeira +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) .NET Foundation xUnit.net +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) .NET Foundation 0xUnit.net +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright James Newton-King 2008 Json.NET +Copyright (c) .NET Foundation Contributors +Copyright .NET Foundation and Contributors +Copyright 1995-2017 Mark Adler +3 CScs DEFG +Copyright 2012-2016 (c) 2008 VeriSign, Inc. +Copyright (c) 2020 Mara Bos +(c) Antoine Aubry and contributors 2008 - 2019 +Copyright (c) .NET Foundation and Contributors +Copyright (c) Tunnel Vision Laboratories, LLC. +Copyright AssemblyCompany AssemblyConfiguration +Copyright (c) 2017 Yoshifumi Kawai and contributors +Copyright 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright 2012-2016 Copyright 2012-2017 Mehdi Khalili +Copyright (c) .NET Foundation xUnit.net Runner Utility +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) .NET Foundation ,xUnit.net Runner Utility +Copyright (c) .NET Foundation 1xUnit.net Runner Utility +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) .NET Foundation xUnit.net Runner Reporters +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) Antoine Aubry and contributors 2008 - 2019 +Copyright (c) .NET Foundation .xUnit.net Runner Reporters +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) Outercurve Foundation WrapNonExceptionThrows RSDS +Copyright (c) .NET Foundation and Contributors. Visual Studio 2019 +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright (c) .NET Foundation xunit.analyzers, analyzers, roslyn, xunit, xunit.net +Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014 Antoine Aubry and contributors +Copyright Tunnel Vision Laboratories, LLC 2018 1Copyright Tunnel Vision Laboratories, LLC 2018 NAn +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright 2018 Tunnel Vision Laboratories, LLC Documentation DotNetAnalyzers Roslyn Diagnostic Analyzer +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.VisualStudio.Validation 17.6.11 - MIT + + +(c) Microsoft Corporation +Copyright (c) .NET Foundation +Copyright 1995-2017 Mark Adler +Copyright (c) Rackspace, US Inc. +Copyright James Newton-King 2008 +Copyright (c) 2014, Karlis Gangis +Copyright (c) 2015 Dennis Fischer +Copyright (c) 2015 .NET Foundation +Copyright (c) Outercurve Foundation +Copyright LibGit2Sharp contributors +Copyright (c) 2007 James Newton-King +Copyright (c) James Newton-King 2008 +Copyright (c) .NET Foundation xUnit.net +Copyright (c) .NET Foundation 0xUnit.net +Copyright James Newton-King 2008 Json.NET +Copyright 1995-2017 Mark Adler +3 CScs DEFG +Copyright (c) .NET Foundation and Contributors +Copyright (c) Tunnel Vision Laboratories, LLC. +Copyright AssemblyCompany AssemblyConfiguration +Copyright 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) .NET Foundation xUnit.net Runner Utility +Copyright (c) .NET Foundation ,xUnit.net Runner Utility +Copyright (c) .NET Foundation 1xUnit.net Runner Utility +Copyright (c) .NET Foundation xUnit.net Runner Reporters +Copyright (c) .NET Foundation .xUnit.net Runner Reporters +(c) 2004-2022 Castle Project - http://www.castleproject.org +Copyright (c) Outercurve Foundation WrapNonExceptionThrows RSDS +Copyright 2004-2021 Castle Project - http://www.castleproject.org +Copyright (c) .NET Foundation and Contributors. Visual Studio 2019 +Copyright (c) 2004-2022 Castle Project - http://www.castleproject.org +Copyright (c) .NET Foundation xunit.analyzers, analyzers, roslyn, xunit, xunit.net +Copyright (c) 2007, Clarius Consulting, Manas Technology Solutions, InSTEDD, and Contributors +Copyright Tunnel Vision Laboratories, LLC 2018 1Copyright Tunnel Vision Laboratories, LLC 2018 NAn +Copyright 2018 Tunnel Vision Laboratories, LLC Documentation DotNetAnalyzers Roslyn Diagnostic Analyzer + +NOTICES AND INFORMATION +Do Not Translate or Localize + +This software incorporates material from third parties. +Microsoft makes certain open source code available at https://3rdpartysource.microsoft.com, +or you may send a check or money order for US $5.00, including the product name, +the open source component name, platform, and version number, to: + +Source Code Compliance Team +Microsoft Corporation +One Microsoft Way +Redmond, WA 98052 +USA + +Notwithstanding any other terms, you may reverse engineer this software to the extent +required to debug changes to any libraries licensed under the GNU Lesser General Public License. + +--------------------------------------------------------- + +Castle.Core 5.1.1 - Apache-2.0 + + +(c) 2004-2022 Castle Project - http://www.castleproject.org +Copyright 2004-2021 Castle Project - http://www.castleproject.org +Copyright (c) 2004-2022 Castle Project - http://www.castleproject.org + +Copyright 2004-2021 Castle Project - http://www.castleproject.org/ + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +xunit 2.4.2 - Apache-2.0 + + +Copyright (c) .NET Foundation + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +xunit.abstractions 2.0.3 - Apache-2.0 + + +Copyright (c) Outercurve Foundation +Copyright (c) Outercurve Foundation WrapNonExceptionThrows RSDS + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +xunit.analyzers 1.0.0 - Apache-2.0 + + +Copyright (c) .NET Foundation +Copyright (c) .NET Foundation xUnit.net +Copyright (c) .NET Foundation xunit.analyzers, analyzers, roslyn, xunit, xunit.net + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +xunit.assert 2.4.2 - Apache-2.0 + + +Copyright (c) .NET Foundation +Copyright (c) .NET Foundation xUnit.net + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +xunit.core 2.4.2 - Apache-2.0 + + +Copyright (c) .NET Foundation + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +xunit.extensibility.core 2.4.2 - Apache-2.0 + + +Copyright (c) .NET Foundation +Copyright (c) .NET Foundation xUnit.net +Copyright (c) .NET Foundation 0xUnit.net +Copyright (c) .NET Foundation xUnit.net Runner Utility + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +xunit.extensibility.execution 2.4.2 - Apache-2.0 + + +Copyright (c) .NET Foundation +Copyright (c) .NET Foundation xUnit.net + +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); + +you may not use this file except in compliance with the License. + +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software + +distributed under the License is distributed on an "AS IS" BASIS, + +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + +See the License for the specific language governing permissions and + +limitations under the License. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Moq 4.18.4 - BSD-3-Clause + + +Copyright (c) 2007, Clarius Consulting, Manas Technology Solutions, InSTEDD, and Contributors + +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +CSharpIsNullAnalyzer 0.1.329 - MIT + + +Copyright (c) Andrew Arnott + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +DotNetAnalyzers.DocumentationAnalyzers 1.0.0-beta.59 - MIT + + +Copyright (c) Rackspace, US Inc. +Copyright (c) 2014, Karlis Gangis +Copyright (c) 2015 Dennis Fischer +Copyright (c) Tunnel Vision Laboratories, LLC. +Copyright 2018 Tunnel Vision Laboratories, LLC Documentation DotNetAnalyzers Roslyn Diagnostic Analyzer + +The MIT License (MIT) + +Copyright (c) Tunnel Vision Laboratories, LLC + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +DotNetAnalyzers.DocumentationAnalyzers.Unstable 1.0.0.59 - MIT + + +Copyright (c) Rackspace, US Inc. +Copyright (c) 2014, Karlis Gangis +Copyright (c) 2015 Dennis Fischer +Copyright (c) Tunnel Vision Laboratories, LLC. +Copyright Tunnel Vision Laboratories, LLC 2018 +1Copyright Tunnel Vision Laboratories, LLC 2018 NAn +Copyright 2018 Tunnel Vision Laboratories, LLC Documentation DotNetAnalyzers Roslyn Diagnostic Analyzer + +The MIT License (MIT) + +Copyright (c) Tunnel Vision Laboratories, LLC + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.Build.Tasks.Git 1.1.1 - MIT + + +(c) Microsoft Corporation. + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.SourceLink.Common 1.1.1 - MIT + + +(c) Microsoft Corporation. + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Microsoft.SourceLink.GitHub 1.1.1 - MIT + + +(c) Microsoft Corporation. + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Nerdbank.GitVersioning 3.5.119 - MIT + + +Copyright 1995-2017 Mark Adler +Copyright James Newton-King 2008 +Copyright LibGit2Sharp contributors +Copyright James Newton-King 2008 Json.NET +Copyright 1995-2017 Mark Adler +3 CScs DEFG +Copyright (c) .NET Foundation and Contributors +Copyright AssemblyCompany AssemblyConfiguration +Copyright 1995-2017 Jean-loup Gailly and Mark Adler + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Newtonsoft.Json 13.0.1 - MIT + + +Copyright James Newton-King 2008 +Copyright (c) 2007 James Newton-King +Copyright (c) James Newton-King 2008 +Copyright James Newton-King 2008 Json.NET + +The MIT License (MIT) + +Copyright (c) 2007 James Newton-King + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Nullable 1.3.1 - MIT + + +Copyright (c) Manuel Römer + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +StyleCop.Analyzers.Unstable 1.2.0.435 - MIT + + + +MIT License + +Copyright (c) Tunnel Vision Laboratories, LLC + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +xunit.runner.visualstudio 2.4.5 - MIT + + +Copyright (c) .NET Foundation +Copyright (c) 2015 .NET Foundation +Copyright (c) Outercurve Foundation +Copyright (c) .NET Foundation and Contributors +Copyright (c) .NET Foundation xUnit.net Runner Utility +Copyright (c) .NET Foundation ,xUnit.net Runner Utility +Copyright (c) .NET Foundation 1xUnit.net Runner Utility +Copyright (c) .NET Foundation xUnit.net Runner Reporters +Copyright (c) .NET Foundation .xUnit.net Runner Reporters +Copyright (c) Outercurve Foundation WrapNonExceptionThrows RSDS +Copyright (c) .NET Foundation and Contributors. Visual Studio 2019 + +Unless otherwise noted, the source code here is covered by the following license: + + Copyright (c) .NET Foundation and Contributors + All Rights Reserved + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +----------------------- + +The code in src/xunit.runner.visualstudio/Utility/AssemblyResolution/Microsoft.DotNet.PlatformAbstractions was imported from: + https://github.com/dotnet/core-setup/tree/v2.0.1/src/managed/Microsoft.DotNet.PlatformAbstractions + +The code in src/xunit.runner.visualstudio/Utility/AssemblyResolution/Microsoft.DotNet.PlatformAbstractions was imported from: + https://github.com/dotnet/core-setup/tree/v2.0.1/src/managed/Microsoft.Extensions.DependencyModel + +Both sets of code are covered by the following license: + + The MIT License (MIT) + + Copyright (c) 2015 .NET Foundation + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Procdump 0.0.1 + + + +--------------------------------------------------------- + + + +--------------------------------------------------------- + +--------------------------------------------------------- + +Nerdbank.Streams 2.10.69 - MIT + + +(c) Andrew Arnott +Copyright (c) .NET Foundation and Contributors + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +Newtonsoft.Json 13.0.3 - MIT + + +Copyright James Newton-King 2008 +Copyright (c) 2007 James Newton-King +Copyright (c) James Newton-King 2008 +Copyright James Newton-King 2008 Json.NET + +The MIT License (MIT) + +Copyright (c) 2007 James Newton-King + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +OmniSharp.Extensions.DebugAdapter 0.19.9 - MIT + + +(c) Microsoft 2023 +Copyright OmniSharp and contributors +Copyright OmniSharp and contributors (c) 2018 +Copyright (c) .NET Foundation and Contributors + +MIT License + +Copyright (c) .NET Foundation and Contributors +All Rights Reserved + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +OmniSharp.Extensions.DebugAdapter.Client 0.19.9 - MIT + + +(c) Microsoft 2023 +Copyright OmniSharp and contributors +Copyright OmniSharp and contributors (c) 2018 +Copyright (c) .NET Foundation and Contributors + +MIT License + +Copyright (c) .NET Foundation and Contributors +All Rights Reserved + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +OmniSharp.Extensions.DebugAdapter.Server 0.19.9 - MIT + + + +MIT License + +Copyright (c) .NET Foundation and Contributors +All Rights Reserved + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +OmniSharp.Extensions.DebugAdapter.Shared 0.19.9 - MIT + + +(c) Microsoft 2023 +Copyright OmniSharp and contributors +Copyright OmniSharp and contributors (c) 2018 +Copyright (c) .NET Foundation and Contributors + +MIT License + +Copyright (c) .NET Foundation and Contributors +All Rights Reserved + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +OmniSharp.Extensions.JsonRpc 0.19.9 - MIT + + +(c) Microsoft 2023 +Copyright OmniSharp and contributors +Copyright OmniSharp and contributors (c) 2018 +Copyright (c) .NET Foundation and Contributors + +MIT License + +Copyright (c) .NET Foundation and Contributors +All Rights Reserved + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +OmniSharp.Extensions.JsonRpc.Generators 0.19.9 - MIT + + +(c) Microsoft 2023 +Copyright OmniSharp and contributors +Copyright OmniSharp and contributors (c) 2018 +Copyright (c) .NET Foundation and Contributors + +MIT License + +Copyright (c) .NET Foundation and Contributors +All Rights Reserved + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +OmniSharp.Extensions.LanguageClient 0.19.9 - MIT + + +(c) Microsoft 2023 +Copyright OmniSharp and contributors +Copyright OmniSharp and contributors (c) 2018 +Copyright (c) .NET Foundation and Contributors + +MIT License + +Copyright (c) .NET Foundation and Contributors +All Rights Reserved + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +OmniSharp.Extensions.LanguageProtocol 0.19.9 - MIT + + +(c) Microsoft 2023 +Copyright OmniSharp and contributors +Copyright OmniSharp and contributors (c) 2018 +Copyright (c) .NET Foundation and Contributors + +MIT License + +Copyright (c) .NET Foundation and Contributors +All Rights Reserved + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +OmniSharp.Extensions.LanguageServer 0.19.9 - MIT + + +(c) Microsoft 2023 +Copyright OmniSharp and contributors +Copyright OmniSharp and contributors (c) 2018 +Copyright (c) .NET Foundation and Contributors + +MIT License + +Copyright (c) .NET Foundation and Contributors +All Rights Reserved + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +OmniSharp.Extensions.LanguageServer.Shared 0.19.9 - MIT + + +(c) Microsoft 2023 +Copyright OmniSharp and contributors +Copyright OmniSharp and contributors (c) 2018 +Copyright (c) .NET Foundation and Contributors + +MIT License + +Copyright (c) .NET Foundation and Contributors +All Rights Reserved + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.IO.Pipelines 7.0.0 - MIT + + +(c) Microsoft Corporation +Copyright (c) Andrew Arnott +Copyright 2019 LLVM Project +Copyright 2018 Daniel Lemire +Copyright (c) .NET Foundation +Copyright (c) 2011, Google Inc. +Copyright (c) 2020 Dan Shechter +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1998 Microsoft. To +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) 2005-2020 Rich Felker +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 1991-2022 Unicode, Inc. +Copyright (c) 2013-2017, Alfred Klomp +Copyright 2012 the V8 project authors +Copyright (c) 1999 Lucent Technologies +Copyright (c) 2008-2016, Wojciech Mula +Copyright (c) 2011-2020 Microsoft Corp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2021 csFastFloat authors +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2015 The Chromium Authors +Copyright (c) 2018 Alexander Chermyanin +Copyright (c) The Internet Society 1997 +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) The Internet Society (2003) +Copyright (c) .NET Foundation Contributors +Copyright (c) 2020 Mara Bos +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2008-2020 Advanced Micro Devices, Inc. +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2022 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip +Copyright (c) 1980, 1986, 1993 The Regents of the University of California +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.IO.Pipes.AccessControl 5.0.0 - MIT + + +(c) Microsoft Corporation. +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright 2012 the V8 project +Copyright (c) .NET Foundation. +Copyright (c) 2011, Google Inc. +Copyright (c) 1998 Microsoft. To +(c) 1997-2005 Sean Eron Anderson. +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2018 Alexander Chermyanin +Portions (c) International Organization +Copyright (c) 2015 The Chromium Authors. +Copyright (c) The Internet Society 1997. +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) .NET Foundation Contributors +Copyright (c) The Internet Society (2003). +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Memory 4.5.5 - MIT + + +(c) 2022 GitHub, Inc. +(c) Microsoft Corporation +Copyright (c) 2011, Google Inc. +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1991-2017 Unicode, Inc. +Copyright (c) 2015 The Chromium Authors +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) .NET Foundation Contributors +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Reactive 6.0.0 - MIT + + +Copyright (c) .NET Foundation and Contributors +Copyright (c) .NET Foundation and Contributors. Rx Reactive Extensions Observable LINQ Events + +MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Runtime.CompilerServices.Unsafe 6.0.0 - MIT + + +(c) Microsoft Corporation. +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright 2012 the V8 project +Copyright (c) .NET Foundation. +Copyright (c) 2011, Google Inc. +Copyright (c) 1998 Microsoft. To +(c) 1997-2005 Sean Eron Anderson. +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2018 Alexander Chermyanin +Portions (c) International Organization +Copyright (c) 2015 The Chromium Authors. +Copyright (c) The Internet Society 1997. +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) .NET Foundation Contributors +Copyright (c) The Internet Society (2003). +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Security.AccessControl 5.0.0 - MIT + + +(c) Microsoft Corporation. +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright 2012 the V8 project +Copyright (c) .NET Foundation. +Copyright (c) 2011, Google Inc. +Copyright (c) 1998 Microsoft. To +(c) 1997-2005 Sean Eron Anderson. +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2018 Alexander Chermyanin +Portions (c) International Organization +Copyright (c) 2015 The Chromium Authors. +Copyright (c) The Internet Society 1997. +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) .NET Foundation Contributors +Copyright (c) The Internet Society (2003). +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.Threading.Channels 6.0.0 - MIT + + +(c) Microsoft Corporation. +Copyright (c) Andrew Arnott +Copyright 2018 Daniel Lemire +Copyright 2012 the V8 project +Copyright (c) .NET Foundation. +Copyright (c) 2011, Google Inc. +Copyright (c) 1998 Microsoft. To +(c) 1997-2005 Sean Eron Anderson. +Copyright (c) 2017 Yoshifumi Kawai +Copyright (c) Microsoft Corporation +Copyright (c) 2007 James Newton-King +Copyright (c) 2012-2014, Yann Collet +Copyright (c) 2013-2017, Alfred Klomp +Copyright (c) 2015-2017, Wojciech Mula +Copyright (c) 2005-2007, Nick Galbreath +Copyright (c) 2018 Alexander Chermyanin +Portions (c) International Organization +Copyright (c) 2015 The Chromium Authors. +Copyright (c) The Internet Society 1997. +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) 2013-2017, Milosz Krajewski +Copyright (c) 2016-2017, Matthieu Darbois +Copyright (c) .NET Foundation Contributors +Copyright (c) The Internet Society (2003). +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2019 Microsoft Corporation, Daan Leijen +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. +Copyright (c) 2014 Ryan Juckett http://www.ryanjuckett.com +Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc. +Copyright (c) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS +Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the University of California. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. +Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. & Digital Equipment Corporation, Maynard, Mass. To + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- + +--------------------------------------------------------- + +System.ValueTuple 4.5.0 - MIT + + +(c) 2023 GitHub, Inc. +(c) Microsoft Corporation +Copyright (c) 2011, Google Inc. +(c) 1997-2005 Sean Eron Anderson +Copyright (c) 1991-2017 Unicode, Inc. +Copyright (c) 2015 The Chromium Authors +Portions (c) International Organization +Copyright (c) 2004-2006 Intel Corporation +Copyright (c) .NET Foundation Contributors +Copyright (c) .NET Foundation and Contributors +Copyright (c) 2011 Novell, Inc (http://www.novell.com) +Copyright (c) 1995-2017 Jean-loup Gailly and Mark Adler +Copyright (c) 2015 Xamarin, Inc (http://www.xamarin.com) +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers + +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +--------------------------------------------------------- diff --git a/PowerShellEditorServices.build.ps1 b/PowerShellEditorServices.build.ps1 index 7c0319a95..fecc39a01 100644 --- a/PowerShellEditorServices.build.ps1 +++ b/PowerShellEditorServices.build.ps1 @@ -296,8 +296,8 @@ Task LayoutModule -After Build { New-Item -Force -Path $dir -ItemType Directory | Out-Null } - # Copy Third Party Notices.txt to module folder - Copy-Item -Force -Path "$PSScriptRoot\Third Party Notices.txt" -Destination $psesOutputPath + # Copy third party notices to module folder + Copy-Item -Force -Path "$PSScriptRoot\NOTICE.txt" -Destination $psesOutputPath # Assemble PSES module diff --git a/Third Party Notices.txt b/Third Party Notices.txt deleted file mode 100644 index 7a16849ba..000000000 --- a/Third Party Notices.txt +++ /dev/null @@ -1,75 +0,0 @@ -Do Not Translate or Localize - -This file is based on or incorporates material from the projects listed below (Third Party IP). The original copyright notice and the license under which Microsoft received such Third Party IP, are set forth below. Such licenses and notices are provided for informational purposes only. Microsoft licenses the Third Party IP to you under the licensing terms for the Microsoft product. Microsoft reserves all other rights not expressly granted under this agreement, whether by implication, estoppel or otherwise. - ---- - -Serilog - -Copyright 2013-2015 Serilog Contributors - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - ---- - -Serilog.Sinks.Async - -Copyright 2013-2015 Serilog Contributors - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - ---- - -Serilog.Sinks.File - -Copyright 2013-2015 Serilog Contributors - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - ---- - -Serilog.Sinks.Console - -Copyright 2013-2015 Serilog Contributors - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. From bacb1221a0b8dd0fdfeccd141dfc40fd523506f7 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Thu, 2 May 2024 09:36:46 -0700 Subject: [PATCH 19/88] Enable `dotnet` telemetry in CI --- .github/workflows/ci-test.yml | 3 --- .github/workflows/codeql-analysis.yml | 1 - .github/workflows/emacs-test.yml | 1 - .github/workflows/vim-test.yml | 1 - .pipelines/PowerShellEditorServices-Official.yml | 1 - 5 files changed, 7 deletions(-) diff --git a/.github/workflows/ci-test.yml b/.github/workflows/ci-test.yml index df7032bbc..ceec61b37 100644 --- a/.github/workflows/ci-test.yml +++ b/.github/workflows/ci-test.yml @@ -4,9 +4,7 @@ on: push: branches: [ main ] pull_request: - # The branches below must be a subset of the branches above branches: [ main ] - paths-ignore: [ '**/*.md' ] merge_group: types: [ checks_requested ] schedule: @@ -22,7 +20,6 @@ jobs: runs-on: ${{ matrix.os }} env: DOTNET_NOLOGO: true - DOTNET_CLI_TELEMETRY_OPTOUT: true DOTNET_GENERATE_ASPNET_CERTIFICATE: false steps: - name: Checkout repository diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 9475151aa..81deb8c41 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -24,7 +24,6 @@ jobs: security-events: write env: DOTNET_NOLOGO: true - DOTNET_CLI_TELEMETRY_OPTOUT: true DOTNET_GENERATE_ASPNET_CERTIFICATE: false steps: - name: Checkout repository diff --git a/.github/workflows/emacs-test.yml b/.github/workflows/emacs-test.yml index 3f3ec37a9..351b233f9 100644 --- a/.github/workflows/emacs-test.yml +++ b/.github/workflows/emacs-test.yml @@ -16,7 +16,6 @@ jobs: runs-on: ubuntu-latest env: DOTNET_NOLOGO: true - DOTNET_CLI_TELEMETRY_OPTOUT: true DOTNET_GENERATE_ASPNET_CERTIFICATE: false steps: - name: Checkout repository diff --git a/.github/workflows/vim-test.yml b/.github/workflows/vim-test.yml index 88e0d4f03..90898830d 100644 --- a/.github/workflows/vim-test.yml +++ b/.github/workflows/vim-test.yml @@ -16,7 +16,6 @@ jobs: runs-on: ubuntu-latest env: DOTNET_NOLOGO: true - DOTNET_CLI_TELEMETRY_OPTOUT: true DOTNET_GENERATE_ASPNET_CERTIFICATE: false steps: - name: Checkout repository diff --git a/.pipelines/PowerShellEditorServices-Official.yml b/.pipelines/PowerShellEditorServices-Official.yml index f37bc0239..4e9a8743a 100644 --- a/.pipelines/PowerShellEditorServices-Official.yml +++ b/.pipelines/PowerShellEditorServices-Official.yml @@ -21,7 +21,6 @@ variables: BuildConfiguration: Release WindowsContainerImage: onebranch.azurecr.io/windows/ltsc2019/vse2022:latest DOTNET_NOLOGO: true - DOTNET_CLI_TELEMETRY_OPTOUT: true DOTNET_GENERATE_ASPNET_CERTIFICATE: false resources: From 677f42ca38996f5f212a5f0e79b61995afc1e388 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Fri, 3 May 2024 15:25:49 -0700 Subject: [PATCH 20/88] v3.20.1: Update third-party notices --- CHANGELOG.md | 7 +++++++ PowerShellEditorServices.Common.props | 2 +- .../PowerShellEditorServices/PowerShellEditorServices.psd1 | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b50ec8ab7..e9dffa950 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # PowerShell Editor Services Release History +## v3.20.1 +### Friday, May 03, 2024 + +See more details at the GitHub Release for [v3.20.1](https://github.com/PowerShell/PowerShellEditorServices/releases/tag/v3.20.1). + +Update third-party notices. + ## v3.20.0 ### Tuesday, April 16, 2024 diff --git a/PowerShellEditorServices.Common.props b/PowerShellEditorServices.Common.props index a362992a8..0abe50b0f 100644 --- a/PowerShellEditorServices.Common.props +++ b/PowerShellEditorServices.Common.props @@ -1,6 +1,6 @@ - 3.20.0 + 3.20.1 Microsoft © Microsoft Corporation. diff --git a/module/PowerShellEditorServices/PowerShellEditorServices.psd1 b/module/PowerShellEditorServices/PowerShellEditorServices.psd1 index 4637aec33..7aab2416a 100644 --- a/module/PowerShellEditorServices/PowerShellEditorServices.psd1 +++ b/module/PowerShellEditorServices/PowerShellEditorServices.psd1 @@ -19,7 +19,7 @@ RootModule = if ($PSEdition -eq 'Core') } # Version number of this module. -ModuleVersion = '3.20.0' +ModuleVersion = '3.20.1' # ID used to uniquely identify this module GUID = '9ca15887-53a2-479a-9cda-48d26bcb6c47' From 349a62dd563e780fa99357509e7d5bfd0cf25c35 Mon Sep 17 00:00:00 2001 From: Luis Calle <53507599+TheLeoP@users.noreply.github.com> Date: Thu, 9 May 2024 13:01:10 -0500 Subject: [PATCH 21/88] Add a NeoVim LSP/DAP plugin to readme (#2162) --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 614f81096..9c54ca76b 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ The functionality in PowerShell Editor Services is available in the following ed - [lsp-pwsh](https://github.com/emacs-lsp/lsp-mode/blob/master/clients/lsp-pwsh.el), an Emacs PowerShell plugin - [intellij-powershell](https://github.com/ant-druha/intellij-powershell), adds PowerShell language support to IntelliJ-based IDEs - [coc-powershell](https://github.com/yatli/coc-powershell), a Vim and Neovim plugin +- [powershell.nvim](https://github.com/TheLeoP/powershell.nvim) a Neovim plugin Please note that other than PowerShell for Visual Studio Code, these clients are community maintained and may be very out of date. It is recommended that you simply use an LSP plugin for your editor and configure it as demonstrated [below](#Usage). @@ -55,7 +56,7 @@ The start script, `Start-EditorServices.ps1`, is found in the `PowerShellEditorS The session details (which named pipes were created) will be written to the given session details path, and the client needs to point to these in order to connect. -The Visual Studio Code, Vim, and IntelliJ extensions use named pipes. +The Visual Studio Code, Vim, Neovim, and IntelliJ extensions use named pipes. ### Standard Input and Output @@ -130,6 +131,7 @@ The debugging functionality in PowerShell Editor Services is available in the fo - [PowerShell for Visual Studio Code](https://github.com/PowerShell/vscode-powershell) - [nvim-dap-powershell for Neovim](https://github.com/Willem-J-an/nvim-dap-powershell) +- [powershell.nvim for Neovim](https://github.com/TheLeoP/powershell.nvim) ## API Usage @@ -190,7 +192,7 @@ Open the PowerShellEditorServices folder that you cloned locally and press ## Contributions Welcome -We would love to incorporate community contributions into this project. If you would like to +We would love to incorporate community contributions into this project. If you would like to contribute code, documentation, tests, or bug reports, please read our [Contribution Guide](https://github.com/PowerShell/PowerShellEditorServices/blob/main/CONTRIBUTING.md) to learn more. ## Maintainers From a56a361cdd8a4cf837797ab81a6f5ded6d1dd995 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Thu, 16 May 2024 14:39:45 -0700 Subject: [PATCH 22/88] Update CODE_OF_CONDUCT.md --- CODE_OF_CONDUCT.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index dddfa22df..686e5e7a0 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,8 +1,10 @@ -# Code of Conduct +# Microsoft Open Source Code of Conduct -This project has adopted the [Microsoft Open Source Code of Conduct][conduct-code]. -For more information see the [Code of Conduct FAQ][conduct-FAQ] or contact [opencode@microsoft.com][conduct-email] with any additional questions or comments. +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). -[conduct-code]: http://opensource.microsoft.com/codeofconduct/ -[conduct-FAQ]: http://opensource.microsoft.com/codeofconduct/faq/ -[conduct-email]: mailto:opencode@microsoft.com +Resources: + +- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) +- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) +- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns +- Employees can reach out at [aka.ms/opensource/moderation-support](https://aka.ms/opensource/moderation-support) From c33b8ecf4785aaffb13401de0fdf6d81549aac4e Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Wed, 22 May 2024 12:03:17 -0700 Subject: [PATCH 23/88] Disable Dependabot It's having weird bugs and we're giving up on it. --- .github/dependabot.yml | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index e3a2fb57f..000000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,21 +0,0 @@ -version: 2 -updates: -- package-ecosystem: nuget - directory: "/" - labels: [ ] - schedule: - interval: weekly - open-pull-requests-limit: 10 - groups: - OmniSharp: - patterns: - - "OmniSharp.Extensions.*" - xUnit: - patterns: - - "xunit" - - "xunit.*" -- package-ecosystem: github-actions - directory: "/" - labels: [ ] - schedule: - interval: weekly From 5a8ba0bd0772e96e38195283127d41cbe639f8c9 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Thu, 6 Jun 2024 16:10:48 -0700 Subject: [PATCH 24/88] Add SECURITY.md --- SECURITY.md | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000..f941d308b --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,41 @@ + + +## Security + +Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin) and [PowerShell](https://github.com/PowerShell). + +If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/security.md/definition), please report it to us as described below. + +## Reporting Security Issues + +**Please do not report security vulnerabilities through public GitHub issues.** + +Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/security.md/msrc/create-report). + +If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/security.md/msrc/pgp). + +You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc). + +Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: + + * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) + * Full paths of source file(s) related to the manifestation of the issue + * The location of the affected source code (tag/branch/commit or direct URL) + * Any special configuration required to reproduce the issue + * Step-by-step instructions to reproduce the issue + * Proof-of-concept or exploit code (if possible) + * Impact of the issue, including how an attacker might exploit the issue + +This information will help us triage your report more quickly. + +If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/security.md/msrc/bounty) page for more details about our active programs. + +## Preferred Languages + +We prefer all communications to be in English. + +## Policy + +Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/security.md/cvd). + + From bd1b8aa5864af42fae12e548353b0e1e267dc7c6 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Thu, 6 Jun 2024 16:16:09 -0700 Subject: [PATCH 25/88] Update README.md --- README.md | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 9c54ca76b..d09331f89 100644 --- a/README.md +++ b/README.md @@ -190,33 +190,34 @@ PS C:\path\to\PowerShellEditorServices> Invoke-Build Build Open the PowerShellEditorServices folder that you cloned locally and press Ctrl+Shift+B (or Cmd+Shift+B on macOS). +## Code of Conduct + +Please see our [Code of Conduct](CODE_OF_CONDUCT.md) before participating in this project. + ## Contributions Welcome We would love to incorporate community contributions into this project. If you would like to -contribute code, documentation, tests, or bug reports, please read our [Contribution Guide](https://github.com/PowerShell/PowerShellEditorServices/blob/main/CONTRIBUTING.md) to learn more. +contribute code, documentation, tests, or bug reports, please read our [Contribution Guide](CONTRIBUTING.md) to learn more. + +## Security Note + +For any security issues, please see [here](SECURITY.md). ## Maintainers -- [Justin Grote](https://github.com/JustinGrote) - [@JustinWGrote](https://twitter.com/justinwgrote) -- [Patrick Meinecke](https://github.com/SeeminglyScience) - [@SeeminglyScienc](http://twitter.com/SeeminglyScienc) -- [Andy Jordan](https://github.com/andschwa) - [andyleejordan.com](https://andyleejordan.com/) +- Andy Jordan - [@andyleejordan](https://github.com/andyleejordan) +- Patrick Meinecke - [@SeeminglyScience](https://github.com/SeeminglyScience) +- Sydney Smith - [@SydneyhSmith](https://github.com/SydneyhSmith) +- Justin Grote - [@JustinGrote](https://github.com/JustinGrote) ### Emeriti -- [Rob Holt](https://github.com/rjmholt) - [@rjmholt](https://twitter.com/rjmholt) -- [Tyler Leonhardt](https://github.com/TylerLeonhardt) - [tylerleonhardt.com](https://tylerleonhardt.com) -- [David Wilson](https://github.com/daviwil) - [@daviwil](https://twitter.com/daviwil) +- Rob Holt - [@rjmholt](https://github.com/rjmholt) +- Tyler Leonhardt - [@TylerLeonhardt](https://github.com/TylerLeonhardt) +- David Wilson - [@daviwil](https://github.com/daviwil) ## License -This project is [licensed under the MIT License](LICENSE). - -## [Code of Conduct][conduct-md] - -This project has adopted the [Microsoft Open Source Code of Conduct][conduct-code]. -For more information, see the [Code of Conduct FAQ][conduct-FAQ] or contact [opencode@microsoft.com][conduct-email] with any additional questions or comments. - -[conduct-code]: http://opensource.microsoft.com/codeofconduct/ -[conduct-FAQ]: http://opensource.microsoft.com/codeofconduct/faq/ -[conduct-email]: mailto:opencode@microsoft.com -[conduct-md]: https://github.com/PowerShell/PowerShellEditorServices/blob/main/CODE_OF_CONDUCT.md +This project is [licensed under the MIT License](LICENSE). Please see the +[third-party notices](NOTICE.txt) file for details on the third-party +binaries that we include with releases of this project. From 117de607f5f80ba3c85b6905ab0b99c5d42e0165 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Wed, 19 Jun 2024 12:07:01 -0700 Subject: [PATCH 26/88] Enable all workflows regardless of files Otherwise PR gates get stuck on documentation changes. --- .github/workflows/codeql-analysis.yml | 1 - .github/workflows/emacs-test.yml | 1 - .github/workflows/vim-test.yml | 1 - 3 files changed, 3 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 81deb8c41..d36681fbe 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -6,7 +6,6 @@ on: pull_request: # The branches below must be a subset of the branches above branches: [ main ] - paths-ignore: [ '**/*.md' ] schedule: - cron: '35 13 * * 4' diff --git a/.github/workflows/emacs-test.yml b/.github/workflows/emacs-test.yml index 351b233f9..b7ac6da9f 100644 --- a/.github/workflows/emacs-test.yml +++ b/.github/workflows/emacs-test.yml @@ -6,7 +6,6 @@ on: pull_request: # The branches below must be a subset of the branches above branches: [ main ] - paths-ignore: [ '**/*.md' ] merge_group: types: [ checks_requested ] diff --git a/.github/workflows/vim-test.yml b/.github/workflows/vim-test.yml index 90898830d..ff9d15810 100644 --- a/.github/workflows/vim-test.yml +++ b/.github/workflows/vim-test.yml @@ -6,7 +6,6 @@ on: pull_request: # The branches below must be a subset of the branches above branches: [ main ] - paths-ignore: [ '**/*.md' ] merge_group: types: [ checks_requested ] From e6575bfce7fe684aebfc84781cb3a2c75aa4cf0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Etienne=20Prud=E2=80=99homme?= Date: Tue, 21 May 2024 13:24:58 -0400 Subject: [PATCH 27/88] Fix typo in README.md Fix bad file name for vim-simple-test.vim --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d09331f89..57b18d298 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ This is because because these two features require their own IO streams and stdi Please see the [emacs-simple-test.el](test/emacs-simple-test.el), [emacs-test.el](test/emacs-test.el), -[vim-simple-test.el](test/vim-simple-test.vim) and [vim-test.vim](test/vim-test.vim) for examples of end-to-end tested configurations. +[vim-simple-test.vim](test/vim-simple-test.vim) and [vim-test.vim](test/vim-test.vim) for examples of end-to-end tested configurations. They use [eglot for Emacs](https://github.com/joaotavora/eglot) and [LanguageClient-neovim](https://github.com/autozimu/LanguageClient-neovim). ### Advanced Usage From f494617cbea6b7234e0304355bcefb1c481c470e Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Thu, 20 Jun 2024 11:45:34 -0700 Subject: [PATCH 28/88] Enable CodeQL in OneBranch And rely on GitHub's automatic action. --- .github/workflows/codeql-analysis.yml | 53 ------------------- .../PowerShellEditorServices-Official.yml | 9 ++++ 2 files changed, 9 insertions(+), 53 deletions(-) delete mode 100644 .github/workflows/codeql-analysis.yml diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml deleted file mode 100644 index d36681fbe..000000000 --- a/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: CodeQL Analysis - -on: - push: - branches: [ main ] - pull_request: - # The branches below must be a subset of the branches above - branches: [ main ] - schedule: - - cron: '35 13 * * 4' - -jobs: - analyze: - name: analyze - strategy: - fail-fast: false - matrix: - language: [ csharp ] - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - env: - DOTNET_NOLOGO: true - DOTNET_GENERATE_ASPNET_CERTIFICATE: false - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Install dotnet - uses: actions/setup-dotnet@v4 - with: - cache: true - cache-dependency-path: '**/*.csproj' - - - name: Initialize CodeQL - uses: github/codeql-action/init@v3 - with: - languages: ${{ matrix.language }} - - - name: Install PSResources - shell: pwsh - run: tools/installPSResources.ps1 - - - name: Build - shell: pwsh - run: Invoke-Build Build - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 - with: - category: '/language:${{matrix.language}}' diff --git a/.pipelines/PowerShellEditorServices-Official.yml b/.pipelines/PowerShellEditorServices-Official.yml index 4e9a8743a..3e111a2d3 100644 --- a/.pipelines/PowerShellEditorServices-Official.yml +++ b/.pipelines/PowerShellEditorServices-Official.yml @@ -10,6 +10,14 @@ trigger: none +schedules: +- cron: '35 13 * * 4' + displayName: Weekly CodeQL + branches: + include: + - main + always: true + parameters: - name: debug displayName: Enable debug output @@ -125,6 +133,7 @@ extends: **/System.Reactive.dll; - stage: release dependsOn: build + condition: ne(variables['Build.Reason'], 'Schedule') variables: version: $[ stageDependencies.build.main.outputs['package.version'] ] prerelease: $[ stageDependencies.build.main.outputs['package.prerelease'] ] From bc2a41a7a0134fa3a19925a19f51aa171fcfd3d7 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Fri, 12 Jul 2024 16:42:28 -0700 Subject: [PATCH 29/88] Update build info task Differentiate Azure DevOps from GitHub Actions. --- PowerShellEditorServices.build.ps1 | 36 ++++++++++-------------------- 1 file changed, 12 insertions(+), 24 deletions(-) diff --git a/PowerShellEditorServices.build.ps1 b/PowerShellEditorServices.build.ps1 index fecc39a01..59e1dede7 100644 --- a/PowerShellEditorServices.build.ps1 +++ b/PowerShellEditorServices.build.ps1 @@ -97,36 +97,24 @@ Task Clean FindDotNet, BinClean, { } Task CreateBuildInfo { - $buildVersion = "" $buildOrigin = "Development" $buildCommit = git rev-parse HEAD - # Set build info fields on build platforms - if ($env:TF_BUILD) { - if ($env:BUILD_BUILDNUMBER -like "PR-*") { - $buildOrigin = "PR" - } elseif ($env:BUILD_DEFINITIONNAME -like "*-CI") { - $buildOrigin = "CI" - } else { - $buildOrigin = "Release" - } + [xml]$xml = Get-Content "$PSScriptRoot/PowerShellEditorServices.Common.props" + $buildVersion = $xml.Project.PropertyGroup.VersionPrefix + $prerelease = $xml.Project.PropertyGroup.VersionSuffix + if ($prerelease) { $buildVersion += "-$prerelease" } - $propsXml = [xml](Get-Content -Raw -LiteralPath "$PSScriptRoot/PowerShellEditorServices.Common.props") - $propsBody = $propsXml.Project.PropertyGroup - $buildVersion = $propsBody.VersionPrefix - if ($propsBody.VersionSuffix) { - $buildVersion += '-' + $propsBody.VersionSuffix + # Set build info fields on build platforms + if ($env:TF_BUILD) { # Azure DevOps AKA OneBranch + if ($env:BUILD_REASON -like "Manual") { + $buildOrigin = "Release" + } else { + $buildOrigin = "AzureDevOps-CI" } - } - - # Allow override of build info fields (except date) - if ($env:PSES_BUILD_VERSION) { - $buildVersion = $env:PSES_BUILD_VERSION - } - - if ($env:PSES_BUILD_ORIGIN) { - $buildOrigin = $env:PSES_BUILD_ORIGIN + } elseif ($env:GITHUB_ACTIONS) { + $buildOrigin = "GitHub-CI" } [string]$buildTime = [datetime]::Today.ToString("s", [System.Globalization.CultureInfo]::InvariantCulture) From 41fce39f491d5d351b4ac5864e89857ec070e107 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Fri, 12 Jul 2024 16:53:25 -0700 Subject: [PATCH 30/88] Update packages --- .../PowerShellEditorServices.csproj | 6 +++--- .../PowerShellEditorServices.Test.E2E.csproj | 6 +++--- .../PowerShellEditorServices.Test.csproj | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/PowerShellEditorServices/PowerShellEditorServices.csproj b/src/PowerShellEditorServices/PowerShellEditorServices.csproj index 8581053ff..03e11b7fb 100644 --- a/src/PowerShellEditorServices/PowerShellEditorServices.csproj +++ b/src/PowerShellEditorServices/PowerShellEditorServices.csproj @@ -36,10 +36,10 @@ - + - - + + diff --git a/test/PowerShellEditorServices.Test.E2E/PowerShellEditorServices.Test.E2E.csproj b/test/PowerShellEditorServices.Test.E2E/PowerShellEditorServices.Test.E2E.csproj index ec30df02e..e7a7e6480 100644 --- a/test/PowerShellEditorServices.Test.E2E/PowerShellEditorServices.Test.E2E.csproj +++ b/test/PowerShellEditorServices.Test.E2E/PowerShellEditorServices.Test.E2E.csproj @@ -7,10 +7,10 @@ - + - - + + diff --git a/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj b/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj index 548f36c3e..5c6bba34d 100644 --- a/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj +++ b/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj @@ -18,7 +18,7 @@ - + @@ -37,7 +37,7 @@ - + From 29c8d0f5e72f071417954d5d0d7df1e075c2f668 Mon Sep 17 00:00:00 2001 From: Friedrich von Never Date: Fri, 23 Aug 2024 22:57:14 +0200 Subject: [PATCH 31/88] Docs: mention debugging support in intellij-powershell --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 57b18d298..6dec799a5 100644 --- a/README.md +++ b/README.md @@ -132,6 +132,7 @@ The debugging functionality in PowerShell Editor Services is available in the fo - [PowerShell for Visual Studio Code](https://github.com/PowerShell/vscode-powershell) - [nvim-dap-powershell for Neovim](https://github.com/Willem-J-an/nvim-dap-powershell) - [powershell.nvim for Neovim](https://github.com/TheLeoP/powershell.nvim) +- [intellij-powershell](https://github.com/ant-druha/intellij-powershell) ## API Usage From a99180d4ce0594d59ff6577e340c97f7666e42c3 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Fri, 23 Aug 2024 16:36:28 -0700 Subject: [PATCH 32/88] Update build to support CFS for PowerShell modules And a bunch of clean-ups to the build script, updated SDKs, removal of PowerShell 7.3 (EOL), and testing PowerShell daily on merge. --- .github/workflows/ci-test.yml | 9 +- .gitignore | 1 - .../PowerShellEditorServices-Official.yml | 22 +- PowerShellEditorServices.build.ps1 | 275 +++++++----------- modules.json | 10 - .../PowerShellEditorServices.Test.csproj | 11 +- tools/installPSResources.ps1 | 12 +- 7 files changed, 121 insertions(+), 219 deletions(-) delete mode 100644 modules.json diff --git a/.github/workflows/ci-test.yml b/.github/workflows/ci-test.yml index ceec61b37..482c8c003 100644 --- a/.github/workflows/ci-test.yml +++ b/.github/workflows/ci-test.yml @@ -47,14 +47,19 @@ jobs: sparse-checkout: tools/install-powershell.ps1 sparse-checkout-cone-mode: false + - name: Install daily + if: ${{ github.event_name == 'schedule' || github.event_name == 'merge_group' }} + shell: pwsh + run: ./pwsh/tools/install-powershell.ps1 -Daily + - name: Build and test shell: pwsh run: Invoke-Build -Configuration Release ${{ github.event_name == 'merge_group' && 'TestFull' || 'Test' }} - - name: Test with daily + - name: Test daily if: ${{ github.event_name == 'schedule' }} shell: pwsh - run: ./pwsh/tools/install-powershell.ps1 -Daily && Invoke-Build -Configuration Release TestE2EDaily + run: Invoke-Build -Configuration Release TestE2EDaily - name: Upload build artifacts if: always() diff --git a/.gitignore b/.gitignore index ae0c4384b..1b97c3908 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ bin/ obj/ module/PowerShellEditorServices/NOTICE.txt module/PowerShellEditorServices/Commands/en-US/ -module/Plaster/ module/PSReadLine/ module/PSScriptAnalyzer/ TestResults/ diff --git a/.pipelines/PowerShellEditorServices-Official.yml b/.pipelines/PowerShellEditorServices-Official.yml index 3e111a2d3..b01b57203 100644 --- a/.pipelines/PowerShellEditorServices-Official.yml +++ b/.pipelines/PowerShellEditorServices-Official.yml @@ -27,7 +27,7 @@ parameters: variables: system.debug: ${{ parameters.debug }} BuildConfiguration: Release - WindowsContainerImage: onebranch.azurecr.io/windows/ltsc2019/vse2022:latest + WindowsContainerImage: onebranch.azurecr.io/windows/ltsc2022/vse2022:latest DOTNET_NOLOGO: true DOTNET_GENERATE_ASPNET_CERTIFICATE: false @@ -46,6 +46,10 @@ extends: asyncSdl: enabled: true forStages: [build] + featureFlags: + WindowsHostVersion: + Version: 2022 + Network: Netlock stages: - stage: build jobs: @@ -75,22 +79,16 @@ extends: inputs: packageType: sdk version: 8.x - - task: UseDotNet@2 - displayName: Use .NET 7.x runtime (for tests) - inputs: - packageType: runtime - version: 7.x - task: UseDotNet@2 displayName: Use .NET 6.x runtime (for tests) inputs: packageType: runtime version: 6.x - - task: PowerShell@2 - displayName: Install PSResources - inputs: - pwsh: true - filePath: tools/installPSResources.ps1 - - pwsh: Invoke-Build TestFull -Configuration $(BuildConfiguration) + - pwsh: | + Register-PSRepository -Name CFS -SourceLocation "https://pkgs.dev.azure.com/powershell/PowerShell/_packaging/powershell/nuget/v2" -InstallationPolicy Trusted + Install-Module -Repository CFS -Name InvokeBuild -RequiredVersion 5.11.3 + Install-Module -Repository CFS -Name platyPS -RequiredVersion 0.14.2 + Invoke-Build TestFull -Configuration $(BuildConfiguration) -PSRepository CFS displayName: Build and test - task: PublishTestResults@2 displayName: Publish test results diff --git a/PowerShellEditorServices.build.ps1 b/PowerShellEditorServices.build.ps1 index 59e1dede7..cdd71ef57 100644 --- a/PowerShellEditorServices.build.ps1 +++ b/PowerShellEditorServices.build.ps1 @@ -7,11 +7,7 @@ param( [switch]$LocalOmniSharp, - [string]$PsesSubmodulePath = "$PSScriptRoot/module", - - [string]$ModulesJsonPath = "$PSScriptRoot/modules.json", - - [string]$DefaultModuleRepository = "PSGallery", + [string]$PSRepository = "PSGallery", [string]$Verbosity = "minimal", @@ -22,8 +18,8 @@ param( [string[]]$TestArgs = @("--logger", "console;verbosity=minimal", "--logger", "trx") ) -#Requires -Modules @{ModuleName="InvokeBuild"; ModuleVersion="5.0.0"} -#Requires -Modules @{ModuleName="platyPS"; ModuleVersion="0.14.0"} +#Requires -Modules @{ModuleName = "InvokeBuild"; ModuleVersion = "5.0.0"} +#Requires -Modules @{ModuleName = "platyPS"; ModuleVersion = "0.14.2"} $script:dotnetBuildArgs = @( "--verbosity" @@ -40,29 +36,22 @@ $script:dotnetTestArgs = @("test") + $script:dotnetBuildArgs + $TestArgs + @( ) $script:IsNix = $IsLinux -or $IsMacOS -# For Apple M1, pwsh might be getting emulated, in which case we need to check -# for the proc_translated flag, otherwise we can check the architecture. -$script:IsAppleM1 = $IsMacOS -and ((sysctl -n sysctl.proc_translated 2> $null) -eq 1 -or - [System.Runtime.InteropServices.RuntimeInformation]::ProcessArchitecture -eq "Arm64") -$script:IsArm64 = -not $script:IsNix -and @("ARM64") -contains $env:PROCESSOR_ARCHITECTURE -$script:BuildInfoPath = [System.IO.Path]::Combine($PSScriptRoot, "src", "PowerShellEditorServices.Hosting", "BuildInfo.cs") -$script:PsesCommonProps = [xml](Get-Content -Raw "$PSScriptRoot/PowerShellEditorServices.Common.props") +$script:BuildInfoPath = "src/PowerShellEditorServices.Hosting/BuildInfo.cs" $script:NetFramework = @{ PS51 = 'net462' PS72 = 'net6.0' - PS73 = 'net7.0' PS74 = 'net8.0' Standard = 'netstandard2.0' } -$script:HostCoreOutput = "$PSScriptRoot/src/PowerShellEditorServices.Hosting/bin/$Configuration/$($script:NetFramework.PS72)/publish" -$script:HostDeskOutput = "$PSScriptRoot/src/PowerShellEditorServices.Hosting/bin/$Configuration/$($script:NetFramework.PS51)/publish" -$script:PsesOutput = "$PSScriptRoot/src/PowerShellEditorServices/bin/$Configuration/$($script:NetFramework.Standard)/publish" +$script:HostCoreOutput = "src/PowerShellEditorServices.Hosting/bin/$Configuration/$($script:NetFramework.PS72)/publish" +$script:HostDeskOutput = "src/PowerShellEditorServices.Hosting/bin/$Configuration/$($script:NetFramework.PS51)/publish" +$script:PsesOutput = "src/PowerShellEditorServices/bin/$Configuration/$($script:NetFramework.Standard)/publish" if (Get-Command git -ErrorAction SilentlyContinue) { # ignore changes to this file - git update-index --assume-unchanged "$PSScriptRoot/src/PowerShellEditorServices.Hosting/BuildInfo.cs" + git update-index --assume-unchanged $script:BuildInfoPath } Task FindDotNet { @@ -72,40 +61,27 @@ Task FindDotNet { [Version]$existingVersion, $null = (dotnet --version) -split " " -split "-" Assert ($existingVersion -ge [Version]("8.0")) ".NET SDK 8.0 or higher is required, please update it: https://aka.ms/dotnet-cli" - Write-Host "Using dotnet v$(dotnet --version) at path $((Get-Command dotnet).Source)" -ForegroundColor Green -} - -Task BinClean { - Remove-BuildItem $PSScriptRoot\.tmp - Remove-BuildItem $PSScriptRoot\module\PowerShellEditorServices\bin + Write-Build DarkGreen "Using dotnet v$(dotnet --version) at path $((Get-Command dotnet).Source)" } -Task Clean FindDotNet, BinClean, { +Task Clean FindDotNet, { + Write-Build DarkMagenta "Cleaning PowerShellEditorServices" Invoke-BuildExec { & dotnet clean --verbosity $Verbosity } - Remove-BuildItem $PSScriptRoot\src\*.nupkg - Remove-BuildItem $PSScriptRoot\PowerShellEditorServices*.zip - Remove-BuildItem $PSScriptRoot\module\PowerShellEditorServices\Commands\en-US\*-help.xml - - # Remove bundled component modules - $moduleJsonPath = "$PSScriptRoot\modules.json" - if (Test-Path $moduleJsonPath) { - Get-Content -Raw $moduleJsonPath | - ConvertFrom-Json | - ForEach-Object { $_.PSObject.Properties.Name } | - ForEach-Object { Remove-BuildItem -Path "$PSScriptRoot/module/$_" } - } + Remove-BuildItem module/PowerShellEditorServices/bin + Remove-BuildItem module/PowerShellEditorServices/Commands/en-US/*-help.xml + Remove-BuildItem module/PSReadLine + Remove-BuildItem module/PSScriptAnalyzer } Task CreateBuildInfo { $buildOrigin = "Development" $buildCommit = git rev-parse HEAD - [xml]$xml = Get-Content "$PSScriptRoot/PowerShellEditorServices.Common.props" + [xml]$xml = Get-Content "PowerShellEditorServices.Common.props" $buildVersion = $xml.Project.PropertyGroup.VersionPrefix $prerelease = $xml.Project.PropertyGroup.VersionSuffix if ($prerelease) { $buildVersion += "-$prerelease" } - # Set build info fields on build platforms if ($env:TF_BUILD) { # Azure DevOps AKA OneBranch if ($env:BUILD_REASON -like "Manual") { @@ -138,49 +114,98 @@ namespace Microsoft.PowerShell.EditorServices.Hosting "@ if (Compare-Object $buildInfoContents.Split([Environment]::NewLine) (Get-Content $script:BuildInfoPath)) { - Write-Host "Updating build info." + Write-Build DarkMagenta "Updating build info" Set-Content -LiteralPath $script:BuildInfoPath -Value $buildInfoContents -Force } } -Task SetupHelpForTests { - # TODO: Check if it must be updated in a compatible way! - Write-Host "Updating help for tests." - Update-Help -Module Microsoft.PowerShell.Management,Microsoft.PowerShell.Utility -Force -Scope CurrentUser -UICulture en-US +task RestorePsesModules -If (-not (Test-Path "module/PSReadLine") -or -not (Test-Path "module/PSScriptAnalyzer")) { + Write-Build DarkMagenta "Restoring bundled modules" + Save-Module -Path module -Repository $PSRepository -Name PSScriptAnalyzer -RequiredVersion "1.22.0" -Verbose + Save-Module -Path module -Repository $PSRepository -Name PSReadLine -RequiredVersion "2.4.0-beta0" -AllowPrerelease -Verbose } -Task Build FindDotNet, CreateBuildInfo, { - Invoke-BuildExec { & dotnet publish $script:dotnetBuildArgs .\src\PowerShellEditorServices\PowerShellEditorServices.csproj -f $script:NetFramework.Standard } - Invoke-BuildExec { & dotnet publish $script:dotnetBuildArgs .\src\PowerShellEditorServices.Hosting\PowerShellEditorServices.Hosting.csproj -f $script:NetFramework.PS72 } +Task Build FindDotNet, CreateBuildInfo, RestorePsesModules, { + Write-Build DarkGreen "Building PowerShellEditorServices" + Invoke-BuildExec { & dotnet publish $script:dotnetBuildArgs ./src/PowerShellEditorServices/PowerShellEditorServices.csproj -f $script:NetFramework.Standard } + Invoke-BuildExec { & dotnet publish $script:dotnetBuildArgs ./src/PowerShellEditorServices.Hosting/PowerShellEditorServices.Hosting.csproj -f $script:NetFramework.PS72 } if (-not $script:IsNix) { - Invoke-BuildExec { & dotnet publish $script:dotnetBuildArgs .\src\PowerShellEditorServices.Hosting\PowerShellEditorServices.Hosting.csproj -f $script:NetFramework.PS51 } + Invoke-BuildExec { & dotnet publish $script:dotnetBuildArgs ./src/PowerShellEditorServices.Hosting/PowerShellEditorServices.Hosting.csproj -f $script:NetFramework.PS51 } } } -# The concise set of tests (for pull requests) -Task Test TestPS74, TestE2EPwsh, TestPS51, TestE2EPowerShell +Task AssembleModule -After Build { + Write-Build DarkGreen "Assembling PowerShellEditorServices module" + $psesOutputPath = "./module/PowerShellEditorServices" + $psesBinOutputPath = "$psesOutputPath/bin" + $psesDepsPath = "$psesBinOutputPath/Common" + $psesCoreHostPath = "$psesBinOutputPath/Core" + $psesDeskHostPath = "$psesBinOutputPath/Desktop" -# Every combination of tests (for main branch) -Task TestFull Test, TestPS73, TestPS72, TestE2EPwshCLM, TestE2EPowerShellCLM + foreach ($dir in $psesDepsPath, $psesCoreHostPath, $psesDeskHostPath) { + New-Item -Force -Path $dir -ItemType Directory | Out-Null + } -Task TestPS74 Build, SetupHelpForTests, { - Set-Location .\test\PowerShellEditorServices.Test\ - Invoke-BuildExec { & dotnet $script:dotnetTestArgs $script:NetFramework.PS74 } + # Copy third party notices to module folder + Copy-Item -Force -Path "NOTICE.txt" -Destination $psesOutputPath + + # Assemble PSES module + $includedDlls = [System.Collections.Generic.HashSet[string]]::new() + [void]$includedDlls.Add('System.Management.Automation.dll') + + # PSES/bin/Common + foreach ($psesComponent in Get-ChildItem $script:PsesOutput) { + if ($psesComponent.Name -eq 'System.Management.Automation.dll' -or + $psesComponent.Name -eq 'System.Runtime.InteropServices.RuntimeInformation.dll') { + continue + } + + if ($psesComponent.Extension) { + [void]$includedDlls.Add($psesComponent.Name) + Copy-Item -Path $psesComponent.FullName -Destination $psesDepsPath -Force + } + } + + # PSES/bin/Core + foreach ($hostComponent in Get-ChildItem $script:HostCoreOutput) { + if (-not $includedDlls.Contains($hostComponent.Name)) { + Copy-Item -Path $hostComponent.FullName -Destination $psesCoreHostPath -Force + } + } + + # PSES/bin/Desktop + if (-not $script:IsNix) { + foreach ($hostComponent in Get-ChildItem $script:HostDeskOutput) { + if (-not $includedDlls.Contains($hostComponent.Name)) { + Copy-Item -Path $hostComponent.FullName -Destination $psesDeskHostPath -Force + } + } + } } -Task TestPS73 Build, SetupHelpForTests, { - Set-Location .\test\PowerShellEditorServices.Test\ - Invoke-BuildExec { & dotnet $script:dotnetTestArgs $script:NetFramework.PS73 } +Task BuildCmdletHelp -After AssembleModule { + Write-Build DarkGreen "Building cmdlet help" + New-ExternalHelp -Path ./module/docs -OutputPath ./module/PowerShellEditorServices/Commands/en-US -Force +} + +Task SetupHelpForTests { + Write-Build DarkMagenta "Updating help (for tests)" + Update-Help -Module Microsoft.PowerShell.Management,Microsoft.PowerShell.Utility -Force -Scope CurrentUser -UICulture en-US +} + +Task TestPS74 Build, SetupHelpForTests, { + Set-Location ./test/PowerShellEditorServices.Test/ + Invoke-BuildExec { & dotnet $script:dotnetTestArgs $script:NetFramework.PS74 } } Task TestPS72 Build, SetupHelpForTests, { - Set-Location .\test\PowerShellEditorServices.Test\ + Set-Location ./test/PowerShellEditorServices.Test/ Invoke-BuildExec { & dotnet $script:dotnetTestArgs $script:NetFramework.PS72 } } Task TestPS51 -If (-not $script:IsNix) Build, SetupHelpForTests, { - Set-Location .\test\PowerShellEditorServices.Test\ + Set-Location ./test/PowerShellEditorServices.Test/ # TODO: See https://github.com/dotnet/sdk/issues/18353 for x64 test host # that is debuggable! If architecture is added, the assembly path gets an # additional folder, necessitating fixes to find the commands definition @@ -199,7 +224,7 @@ Task TestPS51 -If (-not $script:IsNix) Build, SetupHelpForTests, { # NOTE: The framework for the E2E tests applies to the mock client, and so # should just be the latest supported framework. Task TestE2EPwsh Build, SetupHelpForTests, { - Set-Location .\test\PowerShellEditorServices.Test.E2E\ + Set-Location ./test/PowerShellEditorServices.Test.E2E/ $env:PWSH_EXE_NAME = "pwsh" Invoke-BuildExec { & dotnet $script:dotnetTestArgs $script:NetFramework.PS74 } } @@ -207,18 +232,18 @@ Task TestE2EPwsh Build, SetupHelpForTests, { $PwshDaily = if ($script:IsNix) { "$HOME/.powershell-daily/pwsh" } else { - "$env:LOCALAPPDATA\Microsoft\powershell-daily\pwsh.exe" + "$env:LOCALAPPDATA/Microsoft/powershell-daily/pwsh.exe" } Task TestE2EDaily -If (Test-Path $PwshDaily) Build, SetupHelpForTests, { - Set-Location .\test\PowerShellEditorServices.Test.E2E\ + Set-Location ./test/PowerShellEditorServices.Test.E2E/ $env:PWSH_EXE_NAME = $PwshDaily - Write-Host "Running end-to-end tests with: $(& $PwshDaily --version)" + Write-Build DarkGreen "Running end-to-end tests with: $(& $PwshDaily --version)" Invoke-BuildExec { & dotnet $script:dotnetTestArgs $script:NetFramework.PS74 } } Task TestE2EPowerShell -If (-not $script:IsNix) Build, SetupHelpForTests, { - Set-Location .\test\PowerShellEditorServices.Test.E2E\ + Set-Location ./test/PowerShellEditorServices.Test.E2E/ $env:PWSH_EXE_NAME = "powershell" try { # TODO: See https://github.com/PowerShell/vscode-powershell/issues/3886 @@ -232,16 +257,16 @@ Task TestE2EPowerShell -If (-not $script:IsNix) Build, SetupHelpForTests, { } Task TestE2EPwshCLM -If (-not $script:IsNix) Build, SetupHelpForTests, { - Set-Location .\test\PowerShellEditorServices.Test.E2E\ + Set-Location ./test/PowerShellEditorServices.Test.E2E/ $env:PWSH_EXE_NAME = "pwsh" if (-not [Security.Principal.WindowsIdentity]::GetCurrent().Owner.IsWellKnown("BuiltInAdministratorsSid")) { - Write-Warning "Skipping Constrained Language Mode tests as they must be ran in an elevated process." + Write-Build DarkRed "Skipping Constrained Language Mode tests as they must be ran in an elevated process" return } try { - Write-Host "Running end-to-end tests in Constrained Language Mode." + Write-Build DarkGreen "Running end-to-end tests in Constrained Language Mode" [System.Environment]::SetEnvironmentVariable("__PSLockdownPolicy", "0x80000007", [System.EnvironmentVariableTarget]::Machine) Invoke-BuildExec { & dotnet $script:dotnetTestArgs $script:NetFramework.PS74 } } finally { @@ -250,16 +275,16 @@ Task TestE2EPwshCLM -If (-not $script:IsNix) Build, SetupHelpForTests, { } Task TestE2EPowerShellCLM -If (-not $script:IsNix) Build, SetupHelpForTests, { - Set-Location .\test\PowerShellEditorServices.Test.E2E\ + Set-Location ./test/PowerShellEditorServices.Test.E2E/ $env:PWSH_EXE_NAME = "powershell" if (-not [Security.Principal.WindowsIdentity]::GetCurrent().Owner.IsWellKnown("BuiltInAdministratorsSid")) { - Write-Warning "Skipping Constrained Language Mode tests as they must be ran in an elevated process." + Write-Build DarkRed "Skipping Constrained Language Mode tests as they must be ran in an elevated process" return } try { - Write-Host "Running end-to-end tests in Constrained Language Mode." + Write-Build DarkGreen "Running end-to-end tests in Constrained Language Mode" [System.Environment]::SetEnvironmentVariable("__PSLockdownPolicy", "0x80000007", [System.EnvironmentVariableTarget]::Machine) # TODO: See https://github.com/PowerShell/vscode-powershell/issues/3886 # Inheriting the module path for powershell.exe breaks things! @@ -272,110 +297,8 @@ Task TestE2EPowerShellCLM -If (-not $script:IsNix) Build, SetupHelpForTests, { } } -Task LayoutModule -After Build { - $modulesDir = "$PSScriptRoot/module" - $psesOutputPath = "$modulesDir/PowerShellEditorServices" - $psesBinOutputPath = "$PSScriptRoot/module/PowerShellEditorServices/bin" - $psesDepsPath = "$psesBinOutputPath/Common" - $psesCoreHostPath = "$psesBinOutputPath/Core" - $psesDeskHostPath = "$psesBinOutputPath/Desktop" +Task Test TestPS72, TestPS74, TestE2EPwsh, TestPS51, TestE2EPowerShell - foreach ($dir in $psesDepsPath, $psesCoreHostPath, $psesDeskHostPath) { - New-Item -Force -Path $dir -ItemType Directory | Out-Null - } - - # Copy third party notices to module folder - Copy-Item -Force -Path "$PSScriptRoot\NOTICE.txt" -Destination $psesOutputPath - - # Assemble PSES module - - $includedDlls = [System.Collections.Generic.HashSet[string]]::new() - [void]$includedDlls.Add('System.Management.Automation.dll') - - # PSES/bin/Common - foreach ($psesComponent in Get-ChildItem $script:PsesOutput) { - if ($psesComponent.Name -eq 'System.Management.Automation.dll' -or - $psesComponent.Name -eq 'System.Runtime.InteropServices.RuntimeInformation.dll') { - continue - } - - if ($psesComponent.Extension) { - [void]$includedDlls.Add($psesComponent.Name) - Copy-Item -Path $psesComponent.FullName -Destination $psesDepsPath -Force - } - } - - # PSES/bin/Core - foreach ($hostComponent in Get-ChildItem $script:HostCoreOutput) { - if (-not $includedDlls.Contains($hostComponent.Name)) { - Copy-Item -Path $hostComponent.FullName -Destination $psesCoreHostPath -Force - } - } - - # PSES/bin/Desktop - if (-not $script:IsNix) { - foreach ($hostComponent in Get-ChildItem $script:HostDeskOutput) { - if (-not $includedDlls.Contains($hostComponent.Name)) { - Copy-Item -Path $hostComponent.FullName -Destination $psesDeskHostPath -Force - } - } - } -} - -task RestorePsesModules -After Build { - $submodulePath = (Resolve-Path $PsesSubmodulePath).Path + [IO.Path]::DirectorySeparatorChar - Write-Host "Restoring EditorServices modules..." - - # Read in the modules.json file as a hashtable so it can be splatted - $moduleInfos = @{} - - (Get-Content -Raw $ModulesJsonPath | ConvertFrom-Json).PSObject.Properties | ForEach-Object { - $name = $_.Name - $body = @{ - Name = $name - Version = $_.Value.Version - AllowPrerelease = $_.Value.AllowPrerelease - Repository = if ($_.Value.Repository) { $_.Value.Repository } else { $DefaultModuleRepository } - Path = $submodulePath - } - - if (-not $name) { - throw "EditorServices module listed without name in '$ModulesJsonPath'" - } - - $moduleInfos.Add($name, $body) - } - - # Save each module in the modules.json file - foreach ($moduleName in $moduleInfos.Keys) { - if (Test-Path -Path (Join-Path -Path $submodulePath -ChildPath $moduleName)) { - Write-Host "`tModule '${moduleName}' already detected, skipping!" - continue - } - - $moduleInstallDetails = $moduleInfos[$moduleName] - - $splatParameters = @{ - Name = $moduleName - RequiredVersion = $moduleInstallDetails.Version - Repository = if ($moduleInstallDetails.Repository) { $moduleInstallDetails.Repository } else { $DefaultModuleRepository } - Path = $submodulePath - } - - # There's a bug in PowerShell get where this argument isn't correctly translated when it's false. - if ($moduleInstallDetails.AllowPrerelease) { - $splatParameters["AllowPrerelease"] = $moduleInstallDetails.AllowPrerelease - } - - Write-Host "`tInstalling module: ${moduleName} with arguments $(ConvertTo-Json $splatParameters)" - - Save-Module @splatParameters - } -} - -Task BuildCmdletHelp -After LayoutModule { - New-ExternalHelp -Path $PSScriptRoot\module\docs -OutputPath $PSScriptRoot\module\PowerShellEditorServices\Commands\en-US -Force | Out-Null -} +Task TestFull Test, TestE2EDaily, TestE2EPwshCLM, TestE2EPowerShellCLM -# The default task is to run the entire CI build Task . Clean, Build, Test diff --git a/modules.json b/modules.json deleted file mode 100644 index f72a38714..000000000 --- a/modules.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "PSScriptAnalyzer": { - "Version": "1.22.0", - "AllowPrerelease": false - }, - "PSReadLine": { - "Version": "2.4.0-beta0", - "AllowPrerelease": true - } -} diff --git a/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj b/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj index 5c6bba34d..e004a0efe 100644 --- a/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj +++ b/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj @@ -2,7 +2,7 @@ - net8.0;net7.0;net6.0;net462 + net8.0;net6.0;net462 Microsoft.PowerShell.EditorServices.Test x64 @@ -18,17 +18,12 @@ - - - - - - + - + diff --git a/tools/installPSResources.ps1 b/tools/installPSResources.ps1 index a7b4b041f..5456cac13 100644 --- a/tools/installPSResources.ps1 +++ b/tools/installPSResources.ps1 @@ -1,13 +1,5 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. -$ErrorActionPreference = 'Stop' - -Set-PSRepository -Name PSGallery -InstallationPolicy Trusted | Out-Null -if ($PSVersionTable.PSVersion.Major -lt 6) { - throw "The build script requires PowerShell 7!" -} - -# TODO: Switch to Install-PSResource when CI uses PowerShell 7.4 -Install-Module -Name InvokeBuild -Scope CurrentUser -Install-Module -Name platyPS -Scope CurrentUser +Install-PSResource -TrustRepository -Name InvokeBuild -Scope CurrentUser +Install-PSResource -TrustRepository -Name platyPS -Scope CurrentUser From 22c1fc8bdd6d8bed5e29055fb436eb5ecbd0d202 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Mon, 23 Sep 2024 15:05:29 -0700 Subject: [PATCH 33/88] Allow release stage only on manual build So pushes can trigger the pipeline automatically. --- .pipelines/PowerShellEditorServices-Official.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.pipelines/PowerShellEditorServices-Official.yml b/.pipelines/PowerShellEditorServices-Official.yml index b01b57203..faab0c375 100644 --- a/.pipelines/PowerShellEditorServices-Official.yml +++ b/.pipelines/PowerShellEditorServices-Official.yml @@ -8,7 +8,8 @@ # Support: https://aka.ms/onebranchsup # ################################################################################# -trigger: none +trigger: +- main schedules: - cron: '35 13 * * 4' @@ -131,7 +132,7 @@ extends: **/System.Reactive.dll; - stage: release dependsOn: build - condition: ne(variables['Build.Reason'], 'Schedule') + condition: eq(variables['Build.Reason'], 'Manual') variables: version: $[ stageDependencies.build.main.outputs['package.version'] ] prerelease: $[ stageDependencies.build.main.outputs['package.prerelease'] ] From 791039d14dac602fde326754da33012f38156ba7 Mon Sep 17 00:00:00 2001 From: Justin Grote Date: Mon, 7 Oct 2024 15:23:53 -0700 Subject: [PATCH 34/88] Change VIM in Test to nightly (#2183) --- .github/workflows/vim-test.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/vim-test.yml b/.github/workflows/vim-test.yml index ff9d15810..982049e6f 100644 --- a/.github/workflows/vim-test.yml +++ b/.github/workflows/vim-test.yml @@ -35,7 +35,10 @@ jobs: run: Invoke-Build Build - name: Install Vim + id: vim uses: rhysd/action-setup-vim@v1 + with: + version: nightly - name: Checkout vim-ps1 uses: actions/checkout@v4 @@ -59,6 +62,9 @@ jobs: repository: thinca/vim-themis path: vim-themis + # - name: Debug if run with debugging enabled + # uses: lhotari/action-upterm@v1 + - name: Run Themis with full CLI env: THEMIS_VIM: ${{ steps.vim.outputs.executable }} From f4e09729324fc42ac08733f8595291872abde546 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Tue, 8 Oct 2024 13:49:35 -0700 Subject: [PATCH 35/88] Pull suggested updates --- .pipelines/PowerShellEditorServices-Official.yml | 1 + global.json | 2 +- .../PowerShellEditorServices.csproj | 7 ------- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/.pipelines/PowerShellEditorServices-Official.yml b/.pipelines/PowerShellEditorServices-Official.yml index faab0c375..aae8d3943 100644 --- a/.pipelines/PowerShellEditorServices-Official.yml +++ b/.pipelines/PowerShellEditorServices-Official.yml @@ -48,6 +48,7 @@ extends: enabled: true forStages: [build] featureFlags: + EnableCDPxPAT: false WindowsHostVersion: Version: 2022 Network: Netlock diff --git a/global.json b/global.json index 4c4c3ae5e..892db14b0 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "8.0.100", + "version": "8.0.110", "rollForward": "latestFeature", "allowPrerelease": false } diff --git a/src/PowerShellEditorServices/PowerShellEditorServices.csproj b/src/PowerShellEditorServices/PowerShellEditorServices.csproj index 03e11b7fb..7b1246d1c 100644 --- a/src/PowerShellEditorServices/PowerShellEditorServices.csproj +++ b/src/PowerShellEditorServices/PowerShellEditorServices.csproj @@ -59,11 +59,4 @@ - - - - - - - From 51b8d071d14bba2a6c822898821c29acec41288a Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Tue, 8 Oct 2024 14:03:52 -0700 Subject: [PATCH 36/88] Enable NuGet Central Package Management --- Directory.Build.props | 5 ++++ Directory.Packages.props | 29 +++++++++++++++++++ .../PowerShellEditorServices.Hosting.csproj | 10 +++---- .../PowerShellEditorServices.csproj | 26 ++++++++--------- .../PowerShellEditorServices.Test.E2E.csproj | 14 ++++----- .../PowerShellEditorServices.Test.csproj | 14 ++++----- 6 files changed, 66 insertions(+), 32 deletions(-) create mode 100644 Directory.Build.props create mode 100644 Directory.Packages.props diff --git a/Directory.Build.props b/Directory.Build.props new file mode 100644 index 000000000..193280892 --- /dev/null +++ b/Directory.Build.props @@ -0,0 +1,5 @@ + + + true + + diff --git a/Directory.Packages.props b/Directory.Packages.props new file mode 100644 index 000000000..b4b5d0cea --- /dev/null +++ b/Directory.Packages.props @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/PowerShellEditorServices.Hosting/PowerShellEditorServices.Hosting.csproj b/src/PowerShellEditorServices.Hosting/PowerShellEditorServices.Hosting.csproj index 5c31f0758..68a203da5 100644 --- a/src/PowerShellEditorServices.Hosting/PowerShellEditorServices.Hosting.csproj +++ b/src/PowerShellEditorServices.Hosting/PowerShellEditorServices.Hosting.csproj @@ -11,10 +11,10 @@ - - - - + + + + @@ -22,7 +22,7 @@ - + diff --git a/src/PowerShellEditorServices/PowerShellEditorServices.csproj b/src/PowerShellEditorServices/PowerShellEditorServices.csproj index 7b1246d1c..9a1771500 100644 --- a/src/PowerShellEditorServices/PowerShellEditorServices.csproj +++ b/src/PowerShellEditorServices/PowerShellEditorServices.csproj @@ -32,17 +32,17 @@ - - - - - - - - - - - + + + + + + + + + + + @@ -54,8 +54,8 @@ - - + + diff --git a/test/PowerShellEditorServices.Test.E2E/PowerShellEditorServices.Test.E2E.csproj b/test/PowerShellEditorServices.Test.E2E/PowerShellEditorServices.Test.E2E.csproj index e7a7e6480..3756f071d 100644 --- a/test/PowerShellEditorServices.Test.E2E/PowerShellEditorServices.Test.E2E.csproj +++ b/test/PowerShellEditorServices.Test.E2E/PowerShellEditorServices.Test.E2E.csproj @@ -7,11 +7,11 @@ - - - - - + + + + + @@ -23,8 +23,8 @@ - - + + diff --git a/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj b/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj index e004a0efe..65d3d1b6c 100644 --- a/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj +++ b/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj @@ -18,24 +18,24 @@ - + - + - + - - - - + + + + From 75cff4c98499e45cbcf1fc3512d22b022919e4dc Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Tue, 8 Oct 2024 14:09:41 -0700 Subject: [PATCH 37/88] Remove NETStandard.Library package reference As it's implicit and now dotnet errors if you duplicate it. --- Directory.Packages.props | 9 ++++----- .../PowerShellEditorServices.Hosting.csproj | 1 - 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index b4b5d0cea..ccd3e5cd8 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -1,12 +1,11 @@ - - + + - @@ -25,5 +24,5 @@ - - + + diff --git a/src/PowerShellEditorServices.Hosting/PowerShellEditorServices.Hosting.csproj b/src/PowerShellEditorServices.Hosting/PowerShellEditorServices.Hosting.csproj index 68a203da5..8233ead02 100644 --- a/src/PowerShellEditorServices.Hosting/PowerShellEditorServices.Hosting.csproj +++ b/src/PowerShellEditorServices.Hosting/PowerShellEditorServices.Hosting.csproj @@ -11,7 +11,6 @@ - From b5411e185e801f8259498dca429aebabcb95dd30 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Tue, 8 Oct 2024 14:15:53 -0700 Subject: [PATCH 38/88] Use `global.json` in CI --- .github/workflows/ci-test.yml | 6 ++---- .pipelines/PowerShellEditorServices-Official.yml | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci-test.yml b/.github/workflows/ci-test.yml index 482c8c003..fc118c0ee 100644 --- a/.github/workflows/ci-test.yml +++ b/.github/workflows/ci-test.yml @@ -30,10 +30,8 @@ jobs: with: cache: true cache-dependency-path: '**/*.csproj' - dotnet-version: | - 6.0.x - 7.0.x - 8.0.x + dotnet-version: 6.0.x + global-json-file: "./global.json" - name: Install PSResources shell: pwsh diff --git a/.pipelines/PowerShellEditorServices-Official.yml b/.pipelines/PowerShellEditorServices-Official.yml index aae8d3943..5c8fe0655 100644 --- a/.pipelines/PowerShellEditorServices-Official.yml +++ b/.pipelines/PowerShellEditorServices-Official.yml @@ -80,7 +80,7 @@ extends: displayName: Use .NET 8.x SDK inputs: packageType: sdk - version: 8.x + useGlobalJson: true - task: UseDotNet@2 displayName: Use .NET 6.x runtime (for tests) inputs: From a1e354d701a78df1d55e4ae35458d75a52c90df7 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Tue, 8 Oct 2024 14:19:34 -0700 Subject: [PATCH 39/88] Don't make temp test files in bin directory --- PowerShellEditorServices.sln | 160 ------------------ .../DebugAdapterProtocolMessageTests.cs | 8 +- .../Language/SymbolsServiceTests.cs | 2 +- 3 files changed, 3 insertions(+), 167 deletions(-) delete mode 100644 PowerShellEditorServices.sln diff --git a/PowerShellEditorServices.sln b/PowerShellEditorServices.sln deleted file mode 100644 index c41d92df0..000000000 --- a/PowerShellEditorServices.sln +++ /dev/null @@ -1,160 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.31903.59 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{F594E7FD-1E72-4E51-A496-B019C2BA3180}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{422E561A-8118-4BE7-A54F-9309E4F03AAE}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PowerShellEditorServices.Test", "test\PowerShellEditorServices.Test\PowerShellEditorServices.Test.csproj", "{8ED116F4-9DDF-4C49-AB96-AE462E3D64C3}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PowerShellEditorServices.Test.Shared", "test\PowerShellEditorServices.Test.Shared\PowerShellEditorServices.Test.Shared.csproj", "{6A20B9E9-DE66-456E-B4F5-ACFD1A95C3CA}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "scripts", "scripts", "{E2316F5C-A551-4A8D-8103-E42CA6D757E2}" - ProjectSection(SolutionItems) = preProject - scripts\AddCopyrightHeaders.ps1 = scripts\AddCopyrightHeaders.ps1 - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PowerShellEditorServices", "src\PowerShellEditorServices\PowerShellEditorServices.csproj", "{29EEDF03-0990-45F4-846E-2616970D1FA2}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PowerShellEditorServices.Test.E2E", "test\PowerShellEditorServices.Test.E2E\PowerShellEditorServices.Test.E2E.csproj", "{2561F253-8F72-436A-BCC3-AA63AB82EDC0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PowerShellEditorServices.Hosting", "src\PowerShellEditorServices.Hosting\PowerShellEditorServices.Hosting.csproj", "{3CC791E7-6FC9-4DDE-B4A2-547266977E4E}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - CoreCLR|Any CPU = CoreCLR|Any CPU - CoreCLR|x64 = CoreCLR|x64 - CoreCLR|x86 = CoreCLR|x86 - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {8ED116F4-9DDF-4C49-AB96-AE462E3D64C3}.CoreCLR|Any CPU.ActiveCfg = Release|Any CPU - {8ED116F4-9DDF-4C49-AB96-AE462E3D64C3}.CoreCLR|Any CPU.Build.0 = Release|Any CPU - {8ED116F4-9DDF-4C49-AB96-AE462E3D64C3}.CoreCLR|x64.ActiveCfg = Release|Any CPU - {8ED116F4-9DDF-4C49-AB96-AE462E3D64C3}.CoreCLR|x64.Build.0 = Release|Any CPU - {8ED116F4-9DDF-4C49-AB96-AE462E3D64C3}.CoreCLR|x86.ActiveCfg = Release|Any CPU - {8ED116F4-9DDF-4C49-AB96-AE462E3D64C3}.CoreCLR|x86.Build.0 = Release|Any CPU - {8ED116F4-9DDF-4C49-AB96-AE462E3D64C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8ED116F4-9DDF-4C49-AB96-AE462E3D64C3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8ED116F4-9DDF-4C49-AB96-AE462E3D64C3}.Debug|x64.ActiveCfg = Debug|Any CPU - {8ED116F4-9DDF-4C49-AB96-AE462E3D64C3}.Debug|x64.Build.0 = Debug|Any CPU - {8ED116F4-9DDF-4C49-AB96-AE462E3D64C3}.Debug|x86.ActiveCfg = Debug|Any CPU - {8ED116F4-9DDF-4C49-AB96-AE462E3D64C3}.Debug|x86.Build.0 = Debug|Any CPU - {8ED116F4-9DDF-4C49-AB96-AE462E3D64C3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8ED116F4-9DDF-4C49-AB96-AE462E3D64C3}.Release|Any CPU.Build.0 = Release|Any CPU - {8ED116F4-9DDF-4C49-AB96-AE462E3D64C3}.Release|x64.ActiveCfg = Release|Any CPU - {8ED116F4-9DDF-4C49-AB96-AE462E3D64C3}.Release|x64.Build.0 = Release|Any CPU - {8ED116F4-9DDF-4C49-AB96-AE462E3D64C3}.Release|x86.ActiveCfg = Release|Any CPU - {8ED116F4-9DDF-4C49-AB96-AE462E3D64C3}.Release|x86.Build.0 = Release|Any CPU - {6A20B9E9-DE66-456E-B4F5-ACFD1A95C3CA}.CoreCLR|Any CPU.ActiveCfg = Release|Any CPU - {6A20B9E9-DE66-456E-B4F5-ACFD1A95C3CA}.CoreCLR|Any CPU.Build.0 = Release|Any CPU - {6A20B9E9-DE66-456E-B4F5-ACFD1A95C3CA}.CoreCLR|x64.ActiveCfg = Release|Any CPU - {6A20B9E9-DE66-456E-B4F5-ACFD1A95C3CA}.CoreCLR|x64.Build.0 = Release|Any CPU - {6A20B9E9-DE66-456E-B4F5-ACFD1A95C3CA}.CoreCLR|x86.ActiveCfg = Release|Any CPU - {6A20B9E9-DE66-456E-B4F5-ACFD1A95C3CA}.CoreCLR|x86.Build.0 = Release|Any CPU - {6A20B9E9-DE66-456E-B4F5-ACFD1A95C3CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6A20B9E9-DE66-456E-B4F5-ACFD1A95C3CA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6A20B9E9-DE66-456E-B4F5-ACFD1A95C3CA}.Debug|x64.ActiveCfg = Debug|Any CPU - {6A20B9E9-DE66-456E-B4F5-ACFD1A95C3CA}.Debug|x64.Build.0 = Debug|Any CPU - {6A20B9E9-DE66-456E-B4F5-ACFD1A95C3CA}.Debug|x86.ActiveCfg = Debug|Any CPU - {6A20B9E9-DE66-456E-B4F5-ACFD1A95C3CA}.Debug|x86.Build.0 = Debug|Any CPU - {6A20B9E9-DE66-456E-B4F5-ACFD1A95C3CA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6A20B9E9-DE66-456E-B4F5-ACFD1A95C3CA}.Release|Any CPU.Build.0 = Release|Any CPU - {6A20B9E9-DE66-456E-B4F5-ACFD1A95C3CA}.Release|x64.ActiveCfg = Release|Any CPU - {6A20B9E9-DE66-456E-B4F5-ACFD1A95C3CA}.Release|x64.Build.0 = Release|Any CPU - {6A20B9E9-DE66-456E-B4F5-ACFD1A95C3CA}.Release|x86.ActiveCfg = Release|Any CPU - {6A20B9E9-DE66-456E-B4F5-ACFD1A95C3CA}.Release|x86.Build.0 = Release|Any CPU - {3B38E8DA-8BFF-4264-AF16-47929E6398A3}.CoreCLR|Any CPU.ActiveCfg = CoreCLR|Any CPU - {3B38E8DA-8BFF-4264-AF16-47929E6398A3}.CoreCLR|Any CPU.Build.0 = CoreCLR|Any CPU - {3B38E8DA-8BFF-4264-AF16-47929E6398A3}.CoreCLR|x64.ActiveCfg = CoreCLR|Any CPU - {3B38E8DA-8BFF-4264-AF16-47929E6398A3}.CoreCLR|x64.Build.0 = CoreCLR|Any CPU - {3B38E8DA-8BFF-4264-AF16-47929E6398A3}.CoreCLR|x86.ActiveCfg = CoreCLR|Any CPU - {3B38E8DA-8BFF-4264-AF16-47929E6398A3}.CoreCLR|x86.Build.0 = CoreCLR|Any CPU - {3B38E8DA-8BFF-4264-AF16-47929E6398A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3B38E8DA-8BFF-4264-AF16-47929E6398A3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3B38E8DA-8BFF-4264-AF16-47929E6398A3}.Debug|x64.ActiveCfg = Debug|Any CPU - {3B38E8DA-8BFF-4264-AF16-47929E6398A3}.Debug|x64.Build.0 = Debug|Any CPU - {3B38E8DA-8BFF-4264-AF16-47929E6398A3}.Debug|x86.ActiveCfg = Debug|Any CPU - {3B38E8DA-8BFF-4264-AF16-47929E6398A3}.Debug|x86.Build.0 = Debug|Any CPU - {3B38E8DA-8BFF-4264-AF16-47929E6398A3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3B38E8DA-8BFF-4264-AF16-47929E6398A3}.Release|Any CPU.Build.0 = Release|Any CPU - {3B38E8DA-8BFF-4264-AF16-47929E6398A3}.Release|x64.ActiveCfg = Release|Any CPU - {3B38E8DA-8BFF-4264-AF16-47929E6398A3}.Release|x64.Build.0 = Release|Any CPU - {3B38E8DA-8BFF-4264-AF16-47929E6398A3}.Release|x86.ActiveCfg = Release|Any CPU - {3B38E8DA-8BFF-4264-AF16-47929E6398A3}.Release|x86.Build.0 = Release|Any CPU - {29EEDF03-0990-45F4-846E-2616970D1FA2}.CoreCLR|Any CPU.ActiveCfg = Release|Any CPU - {29EEDF03-0990-45F4-846E-2616970D1FA2}.CoreCLR|Any CPU.Build.0 = Release|Any CPU - {29EEDF03-0990-45F4-846E-2616970D1FA2}.CoreCLR|x64.ActiveCfg = Release|Any CPU - {29EEDF03-0990-45F4-846E-2616970D1FA2}.CoreCLR|x64.Build.0 = Release|Any CPU - {29EEDF03-0990-45F4-846E-2616970D1FA2}.CoreCLR|x86.ActiveCfg = Release|Any CPU - {29EEDF03-0990-45F4-846E-2616970D1FA2}.CoreCLR|x86.Build.0 = Release|Any CPU - {29EEDF03-0990-45F4-846E-2616970D1FA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {29EEDF03-0990-45F4-846E-2616970D1FA2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {29EEDF03-0990-45F4-846E-2616970D1FA2}.Debug|x64.ActiveCfg = Debug|Any CPU - {29EEDF03-0990-45F4-846E-2616970D1FA2}.Debug|x64.Build.0 = Debug|Any CPU - {29EEDF03-0990-45F4-846E-2616970D1FA2}.Debug|x86.ActiveCfg = Debug|Any CPU - {29EEDF03-0990-45F4-846E-2616970D1FA2}.Debug|x86.Build.0 = Debug|Any CPU - {29EEDF03-0990-45F4-846E-2616970D1FA2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {29EEDF03-0990-45F4-846E-2616970D1FA2}.Release|Any CPU.Build.0 = Release|Any CPU - {29EEDF03-0990-45F4-846E-2616970D1FA2}.Release|x64.ActiveCfg = Release|Any CPU - {29EEDF03-0990-45F4-846E-2616970D1FA2}.Release|x64.Build.0 = Release|Any CPU - {29EEDF03-0990-45F4-846E-2616970D1FA2}.Release|x86.ActiveCfg = Release|Any CPU - {29EEDF03-0990-45F4-846E-2616970D1FA2}.Release|x86.Build.0 = Release|Any CPU - {2561F253-8F72-436A-BCC3-AA63AB82EDC0}.CoreCLR|Any CPU.ActiveCfg = Release|Any CPU - {2561F253-8F72-436A-BCC3-AA63AB82EDC0}.CoreCLR|Any CPU.Build.0 = Release|Any CPU - {2561F253-8F72-436A-BCC3-AA63AB82EDC0}.CoreCLR|x64.ActiveCfg = Release|Any CPU - {2561F253-8F72-436A-BCC3-AA63AB82EDC0}.CoreCLR|x64.Build.0 = Release|Any CPU - {2561F253-8F72-436A-BCC3-AA63AB82EDC0}.CoreCLR|x86.ActiveCfg = Release|Any CPU - {2561F253-8F72-436A-BCC3-AA63AB82EDC0}.CoreCLR|x86.Build.0 = Release|Any CPU - {2561F253-8F72-436A-BCC3-AA63AB82EDC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2561F253-8F72-436A-BCC3-AA63AB82EDC0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2561F253-8F72-436A-BCC3-AA63AB82EDC0}.Debug|x64.ActiveCfg = Debug|Any CPU - {2561F253-8F72-436A-BCC3-AA63AB82EDC0}.Debug|x64.Build.0 = Debug|Any CPU - {2561F253-8F72-436A-BCC3-AA63AB82EDC0}.Debug|x86.ActiveCfg = Debug|Any CPU - {2561F253-8F72-436A-BCC3-AA63AB82EDC0}.Debug|x86.Build.0 = Debug|Any CPU - {2561F253-8F72-436A-BCC3-AA63AB82EDC0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2561F253-8F72-436A-BCC3-AA63AB82EDC0}.Release|Any CPU.Build.0 = Release|Any CPU - {2561F253-8F72-436A-BCC3-AA63AB82EDC0}.Release|x64.ActiveCfg = Release|Any CPU - {2561F253-8F72-436A-BCC3-AA63AB82EDC0}.Release|x64.Build.0 = Release|Any CPU - {2561F253-8F72-436A-BCC3-AA63AB82EDC0}.Release|x86.ActiveCfg = Release|Any CPU - {2561F253-8F72-436A-BCC3-AA63AB82EDC0}.Release|x86.Build.0 = Release|Any CPU - {3CC791E7-6FC9-4DDE-B4A2-547266977E4E}.CoreCLR|Any CPU.ActiveCfg = Release|Any CPU - {3CC791E7-6FC9-4DDE-B4A2-547266977E4E}.CoreCLR|Any CPU.Build.0 = Release|Any CPU - {3CC791E7-6FC9-4DDE-B4A2-547266977E4E}.CoreCLR|x64.ActiveCfg = Release|Any CPU - {3CC791E7-6FC9-4DDE-B4A2-547266977E4E}.CoreCLR|x64.Build.0 = Release|Any CPU - {3CC791E7-6FC9-4DDE-B4A2-547266977E4E}.CoreCLR|x86.ActiveCfg = Release|Any CPU - {3CC791E7-6FC9-4DDE-B4A2-547266977E4E}.CoreCLR|x86.Build.0 = Release|Any CPU - {3CC791E7-6FC9-4DDE-B4A2-547266977E4E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3CC791E7-6FC9-4DDE-B4A2-547266977E4E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3CC791E7-6FC9-4DDE-B4A2-547266977E4E}.Debug|x64.ActiveCfg = Debug|Any CPU - {3CC791E7-6FC9-4DDE-B4A2-547266977E4E}.Debug|x64.Build.0 = Debug|Any CPU - {3CC791E7-6FC9-4DDE-B4A2-547266977E4E}.Debug|x86.ActiveCfg = Debug|Any CPU - {3CC791E7-6FC9-4DDE-B4A2-547266977E4E}.Debug|x86.Build.0 = Debug|Any CPU - {3CC791E7-6FC9-4DDE-B4A2-547266977E4E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3CC791E7-6FC9-4DDE-B4A2-547266977E4E}.Release|Any CPU.Build.0 = Release|Any CPU - {3CC791E7-6FC9-4DDE-B4A2-547266977E4E}.Release|x64.ActiveCfg = Release|Any CPU - {3CC791E7-6FC9-4DDE-B4A2-547266977E4E}.Release|x64.Build.0 = Release|Any CPU - {3CC791E7-6FC9-4DDE-B4A2-547266977E4E}.Release|x86.ActiveCfg = Release|Any CPU - {3CC791E7-6FC9-4DDE-B4A2-547266977E4E}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {8ED116F4-9DDF-4C49-AB96-AE462E3D64C3} = {422E561A-8118-4BE7-A54F-9309E4F03AAE} - {6A20B9E9-DE66-456E-B4F5-ACFD1A95C3CA} = {422E561A-8118-4BE7-A54F-9309E4F03AAE} - {29EEDF03-0990-45F4-846E-2616970D1FA2} = {F594E7FD-1E72-4E51-A496-B019C2BA3180} - {2561F253-8F72-436A-BCC3-AA63AB82EDC0} = {422E561A-8118-4BE7-A54F-9309E4F03AAE} - {3CC791E7-6FC9-4DDE-B4A2-547266977E4E} = {F594E7FD-1E72-4E51-A496-B019C2BA3180} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {3B9E8987-D4AC-426B-86F6-889126243A9A} - EndGlobalSection -EndGlobal diff --git a/test/PowerShellEditorServices.Test.E2E/DebugAdapterProtocolMessageTests.cs b/test/PowerShellEditorServices.Test.E2E/DebugAdapterProtocolMessageTests.cs index bc1ac3435..05b10ca5b 100644 --- a/test/PowerShellEditorServices.Test.E2E/DebugAdapterProtocolMessageTests.cs +++ b/test/PowerShellEditorServices.Test.E2E/DebugAdapterProtocolMessageTests.cs @@ -4,7 +4,6 @@ using System; using System.IO; using System.Linq; -using System.Reflection; using System.Runtime.InteropServices; using System.Text; using System.Threading; @@ -21,11 +20,8 @@ namespace PowerShellEditorServices.Test.E2E [Trait("Category", "DAP")] public class DebugAdapterProtocolMessageTests : IAsyncLifetime, IDisposable { - private const string TestOutputFileName = "__dapTestOutputFile.txt"; private static readonly bool s_isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); - private static readonly string s_binDir = - Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); - private static readonly string s_testOutputPath = Path.Combine(s_binDir, TestOutputFileName); + private static readonly string s_testOutputPath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); private readonly ITestOutputHelper _output; private DebugAdapterClient PsesDebugAdapterClient; @@ -116,7 +112,7 @@ public void Dispose() private static string NewTestFile(string script, bool isPester = false) { string fileExt = isPester ? ".Tests.ps1" : ".ps1"; - string filePath = Path.Combine(s_binDir, Path.GetRandomFileName() + fileExt); + string filePath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName() + fileExt); File.WriteAllText(filePath, script); return filePath; diff --git a/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs b/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs index 630c8a018..359a424f8 100644 --- a/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs +++ b/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs @@ -832,7 +832,7 @@ public void FindsSymbolsInFile() Assert.True(symbol.IsDeclaration); // There should be no region symbols unless the provider has been registered. - Assert.Empty(symbols.Where(i => i.Type == SymbolType.Region)); + Assert.DoesNotContain(symbols, i => i.Type == SymbolType.Region); } [Fact] From bbf627b597011a8c43379abe025d60df15449087 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Thu, 10 Oct 2024 10:43:33 -0700 Subject: [PATCH 40/88] Rereate solution file for C# extension * `dotnet new sln` * `find . -name "*.csproj" | xargs dotnet sln PowerShellEditorServices.sln add` --- PowerShellEditorServices.sln | 57 ++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 PowerShellEditorServices.sln diff --git a/PowerShellEditorServices.sln b/PowerShellEditorServices.sln new file mode 100644 index 000000000..754851233 --- /dev/null +++ b/PowerShellEditorServices.sln @@ -0,0 +1,57 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{F46EF430-95AA-4386-9259-292A443AB715}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PowerShellEditorServices.Test.Shared", "test\PowerShellEditorServices.Test.Shared\PowerShellEditorServices.Test.Shared.csproj", "{9D307AF9-D1F7-4185-AE9B-2DD3F178832C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PowerShellEditorServices.Test", "test\PowerShellEditorServices.Test\PowerShellEditorServices.Test.csproj", "{DFD3C9C2-F9E6-4EE3-B614-A8EA7D1E1A98}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PowerShellEditorServices.Test.E2E", "test\PowerShellEditorServices.Test.E2E\PowerShellEditorServices.Test.E2E.csproj", "{AA007633-5178-4D73-A262-CCE7247BDE93}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{F40C4EC9-AE86-4A26-974F-95381888DCDC}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PowerShellEditorServices", "src\PowerShellEditorServices\PowerShellEditorServices.csproj", "{B4431254-9A2F-43DE-A998-12B22A1593CE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PowerShellEditorServices.Hosting", "src\PowerShellEditorServices.Hosting\PowerShellEditorServices.Hosting.csproj", "{983D05F2-3C77-4B51-9A28-A8C6595911BA}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9D307AF9-D1F7-4185-AE9B-2DD3F178832C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9D307AF9-D1F7-4185-AE9B-2DD3F178832C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9D307AF9-D1F7-4185-AE9B-2DD3F178832C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9D307AF9-D1F7-4185-AE9B-2DD3F178832C}.Release|Any CPU.Build.0 = Release|Any CPU + {DFD3C9C2-F9E6-4EE3-B614-A8EA7D1E1A98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DFD3C9C2-F9E6-4EE3-B614-A8EA7D1E1A98}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DFD3C9C2-F9E6-4EE3-B614-A8EA7D1E1A98}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DFD3C9C2-F9E6-4EE3-B614-A8EA7D1E1A98}.Release|Any CPU.Build.0 = Release|Any CPU + {AA007633-5178-4D73-A262-CCE7247BDE93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AA007633-5178-4D73-A262-CCE7247BDE93}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AA007633-5178-4D73-A262-CCE7247BDE93}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AA007633-5178-4D73-A262-CCE7247BDE93}.Release|Any CPU.Build.0 = Release|Any CPU + {B4431254-9A2F-43DE-A998-12B22A1593CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B4431254-9A2F-43DE-A998-12B22A1593CE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B4431254-9A2F-43DE-A998-12B22A1593CE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B4431254-9A2F-43DE-A998-12B22A1593CE}.Release|Any CPU.Build.0 = Release|Any CPU + {983D05F2-3C77-4B51-9A28-A8C6595911BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {983D05F2-3C77-4B51-9A28-A8C6595911BA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {983D05F2-3C77-4B51-9A28-A8C6595911BA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {983D05F2-3C77-4B51-9A28-A8C6595911BA}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {9D307AF9-D1F7-4185-AE9B-2DD3F178832C} = {F46EF430-95AA-4386-9259-292A443AB715} + {DFD3C9C2-F9E6-4EE3-B614-A8EA7D1E1A98} = {F46EF430-95AA-4386-9259-292A443AB715} + {AA007633-5178-4D73-A262-CCE7247BDE93} = {F46EF430-95AA-4386-9259-292A443AB715} + {B4431254-9A2F-43DE-A998-12B22A1593CE} = {F40C4EC9-AE86-4A26-974F-95381888DCDC} + {983D05F2-3C77-4B51-9A28-A8C6595911BA} = {F40C4EC9-AE86-4A26-974F-95381888DCDC} + EndGlobalSection +EndGlobal From 9cda0ebcbd87a1fe155513991f2128661c6d0262 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Thu, 10 Oct 2024 11:45:08 -0700 Subject: [PATCH 41/88] Allow daily PowerShell test to fail Really, it's the installation that's failing because literally the upstream posting of new daily PowerShell builds is broken. If it succeeds, TestFull and the daily schedule will run it. If it doesn't, they'll ignore it because the build script will skip it. --- .github/workflows/ci-test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci-test.yml b/.github/workflows/ci-test.yml index fc118c0ee..6a6b0936f 100644 --- a/.github/workflows/ci-test.yml +++ b/.github/workflows/ci-test.yml @@ -47,6 +47,7 @@ jobs: - name: Install daily if: ${{ github.event_name == 'schedule' || github.event_name == 'merge_group' }} + continue-on-error: true shell: pwsh run: ./pwsh/tools/install-powershell.ps1 -Daily From 6b4fb45085309f05ccef2cf8c93bb75f8c439e86 Mon Sep 17 00:00:00 2001 From: LucasArona Date: Mon, 9 Sep 2024 22:33:56 +0200 Subject: [PATCH 42/88] Add the ability to use the Call operator instead of the DotSource operator With a unit test! --- .../Services/DebugAdapter/DebugStateService.cs | 2 ++ .../Handlers/ConfigurationDoneHandler.cs | 6 ++++-- .../Handlers/LaunchAndAttachHandler.cs | 6 ++++++ .../Utility/PSCommandExtensions.cs | 6 ++++-- .../DebugAdapterClientExtensions.cs | 14 +++++--------- .../DebugAdapterProtocolMessageTests.cs | 11 +++++++++++ 6 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/PowerShellEditorServices/Services/DebugAdapter/DebugStateService.cs b/src/PowerShellEditorServices/Services/DebugAdapter/DebugStateService.cs index f1bf3199e..9736b3e85 100644 --- a/src/PowerShellEditorServices/Services/DebugAdapter/DebugStateService.cs +++ b/src/PowerShellEditorServices/Services/DebugAdapter/DebugStateService.cs @@ -34,6 +34,8 @@ internal class DebugStateService internal bool IsUsingTempIntegratedConsole { get; set; } + internal string ExecuteMode { get; set; } + // This gets set at the end of the Launch/Attach handler which set debug state. internal TaskCompletionSource ServerStarted { get; set; } diff --git a/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/ConfigurationDoneHandler.cs b/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/ConfigurationDoneHandler.cs index df8165319..038f61955 100644 --- a/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/ConfigurationDoneHandler.cs +++ b/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/ConfigurationDoneHandler.cs @@ -110,9 +110,11 @@ internal async Task LaunchScriptAsync(string scriptToLaunch) PSCommand command; if (System.IO.File.Exists(scriptToLaunch)) { - // For a saved file we just execute its path (after escaping it). + // For a saved file we just execute its path (after escaping it), with the configured operator + // (which can't be called that because it's a reserved keyword in C#). + string executeMode = _debugStateService?.ExecuteMode == "Call" ? "&" : "."; command = PSCommandHelpers.BuildDotSourceCommandWithArguments( - PSCommandHelpers.EscapeScriptFilePath(scriptToLaunch), _debugStateService?.Arguments); + PSCommandHelpers.EscapeScriptFilePath(scriptToLaunch), _debugStateService?.Arguments, executeMode); } else // It's a URI to an untitled script, or a raw script. { diff --git a/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/LaunchAndAttachHandler.cs b/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/LaunchAndAttachHandler.cs index 1ec1557ed..97bd6cca7 100644 --- a/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/LaunchAndAttachHandler.cs +++ b/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/LaunchAndAttachHandler.cs @@ -65,6 +65,11 @@ internal record PsesLaunchRequestArguments : LaunchRequestArguments /// public string[] RuntimeArgs { get; set; } + /// + /// Gets or sets the script execution mode, either "DotSource" or "Call". + /// + public string ExecuteMode { get; set; } + /// /// Gets or sets optional environment variables to pass to the debuggee. The string valued /// properties of the 'environmentVariables' are used as key/value pairs. @@ -186,6 +191,7 @@ public async Task Handle(PsesLaunchRequestArguments request, Can _debugStateService.ScriptToLaunch = request.Script; _debugStateService.Arguments = request.Args; _debugStateService.IsUsingTempIntegratedConsole = request.CreateTemporaryIntegratedConsole; + _debugStateService.ExecuteMode = request.ExecuteMode; if (request.CreateTemporaryIntegratedConsole && !string.IsNullOrEmpty(request.Script) diff --git a/src/PowerShellEditorServices/Utility/PSCommandExtensions.cs b/src/PowerShellEditorServices/Utility/PSCommandExtensions.cs index b16129af9..4fe298424 100644 --- a/src/PowerShellEditorServices/Utility/PSCommandExtensions.cs +++ b/src/PowerShellEditorServices/Utility/PSCommandExtensions.cs @@ -94,10 +94,12 @@ private static StringBuilder AddCommandText(this StringBuilder sb, Command comma public static string EscapeScriptFilePath(string f) => string.Concat("'", f.Replace("'", "''"), "'"); - public static PSCommand BuildDotSourceCommandWithArguments(string command, IEnumerable arguments) + // Operator defaults to dot-source but could also be call (ampersand). + // It can't be called that because it's a reserved keyword in C#. + public static PSCommand BuildDotSourceCommandWithArguments(string command, IEnumerable arguments, string executeMode = ".") { string args = string.Join(" ", arguments ?? Array.Empty()); - string script = string.Concat(". ", command, string.IsNullOrEmpty(args) ? "" : " ", args); + string script = string.Concat(executeMode, " ", command, string.IsNullOrEmpty(args) ? "" : " ", args); // HACK: We use AddScript instead of AddArgument/AddParameter to reuse Powershell parameter binding logic. return new PSCommand().AddScript(script); } diff --git a/test/PowerShellEditorServices.Test.E2E/DebugAdapterClientExtensions.cs b/test/PowerShellEditorServices.Test.E2E/DebugAdapterClientExtensions.cs index bdf785ede..dfcb0bbc7 100644 --- a/test/PowerShellEditorServices.Test.E2E/DebugAdapterClientExtensions.cs +++ b/test/PowerShellEditorServices.Test.E2E/DebugAdapterClientExtensions.cs @@ -11,21 +11,17 @@ namespace PowerShellEditorServices.Test.E2E { public static class DebugAdapterClientExtensions { - public static async Task LaunchScript(this DebugAdapterClient debugAdapterClient, string script, TaskCompletionSource started) + public static async Task LaunchScript(this DebugAdapterClient debugAdapterClient, string script, TaskCompletionSource started, string executeMode = "DotSource") { - LaunchResponse launchResponse = await debugAdapterClient.Launch( + _ = await debugAdapterClient.Launch( new PsesLaunchRequestArguments { NoDebug = false, Script = script, Cwd = "", - CreateTemporaryIntegratedConsole = false - }); - - if (launchResponse is null) - { - throw new Exception("Launch response was null."); - } + CreateTemporaryIntegratedConsole = false, + ExecuteMode = executeMode, + }) ?? throw new Exception("Launch response was null."); // This will check to see if we received the Initialized event from the server. await started.Task; diff --git a/test/PowerShellEditorServices.Test.E2E/DebugAdapterProtocolMessageTests.cs b/test/PowerShellEditorServices.Test.E2E/DebugAdapterProtocolMessageTests.cs index 05b10ca5b..654001da7 100644 --- a/test/PowerShellEditorServices.Test.E2E/DebugAdapterProtocolMessageTests.cs +++ b/test/PowerShellEditorServices.Test.E2E/DebugAdapterProtocolMessageTests.cs @@ -189,6 +189,17 @@ public async Task UsesDotSourceOperatorAndQuotesAsync() (i) => Assert.StartsWith(". '", i)); } + [Fact] + public async Task UsesCallOperatorWithSettingAsync() + { + string filePath = NewTestFile(GenerateScriptFromLoggingStatements("$($MyInvocation.Line)")); + await PsesDebugAdapterClient.LaunchScript(filePath, Started, executeMode: "Call"); + ConfigurationDoneResponse configDoneResponse = await PsesDebugAdapterClient.RequestConfigurationDone(new ConfigurationDoneArguments()); + Assert.NotNull(configDoneResponse); + Assert.Collection(await GetLog(), + (i) => Assert.StartsWith("& '", i)); + } + [Fact] public async Task CanLaunchScriptWithNoBreakpointsAsync() { From 09080fece17616697b87374f130c3f2aa4e08c95 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Thu, 10 Oct 2024 12:17:06 -0700 Subject: [PATCH 43/88] Update PSScriptAnalyzer to 1.23.0 --- PowerShellEditorServices.build.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PowerShellEditorServices.build.ps1 b/PowerShellEditorServices.build.ps1 index cdd71ef57..72648411d 100644 --- a/PowerShellEditorServices.build.ps1 +++ b/PowerShellEditorServices.build.ps1 @@ -121,7 +121,7 @@ namespace Microsoft.PowerShell.EditorServices.Hosting task RestorePsesModules -If (-not (Test-Path "module/PSReadLine") -or -not (Test-Path "module/PSScriptAnalyzer")) { Write-Build DarkMagenta "Restoring bundled modules" - Save-Module -Path module -Repository $PSRepository -Name PSScriptAnalyzer -RequiredVersion "1.22.0" -Verbose + Save-Module -Path module -Repository $PSRepository -Name PSScriptAnalyzer -RequiredVersion "1.23.0" -Verbose Save-Module -Path module -Repository $PSRepository -Name PSReadLine -RequiredVersion "2.4.0-beta0" -AllowPrerelease -Verbose } From b6e107d0ddce84d52b61c5a984fdb12c164b6525 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Tue, 29 Oct 2024 11:47:52 -0700 Subject: [PATCH 44/88] Fix unit test broken by GitHub Action image update Which now includes an AWS module with a conflicting completion. --- .../Completion/CompleteCommandInFile.cs | 14 +++++++------- .../Completion/CompletionExamples.psm1 | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/test/PowerShellEditorServices.Test.Shared/Completion/CompleteCommandInFile.cs b/test/PowerShellEditorServices.Test.Shared/Completion/CompleteCommandInFile.cs index 80a1cc906..f84a44a11 100644 --- a/test/PowerShellEditorServices.Test.Shared/Completion/CompleteCommandInFile.cs +++ b/test/PowerShellEditorServices.Test.Shared/Completion/CompleteCommandInFile.cs @@ -12,7 +12,7 @@ internal static class CompleteCommandInFile file: TestUtilities.NormalizePath("Completion/CompletionExamples.psm1"), text: string.Empty, startLineNumber: 8, - startColumnNumber: 7, + startColumnNumber: 10, startOffset: 0, endLineNumber: 0, endColumnNumber: 0, @@ -22,17 +22,17 @@ internal static class CompleteCommandInFile { Kind = CompletionItemKind.Function, Detail = "", - FilterText = "Get-Something", - InsertText = "Get-Something", - Label = "Get-Something", - SortText = "0001Get-Something", + FilterText = "Get-XYZSomething", + InsertText = "Get-XYZSomething", + Label = "Get-XYZSomething", + SortText = "0001Get-XYZSomething", TextEdit = new TextEdit { - NewText = "Get-Something", + NewText = "Get-XYZSomething", Range = new Range { Start = new Position { Line = 7, Character = 0 }, - End = new Position { Line = 7, Character = 6 } + End = new Position { Line = 7, Character = 9 } } } }; diff --git a/test/PowerShellEditorServices.Test.Shared/Completion/CompletionExamples.psm1 b/test/PowerShellEditorServices.Test.Shared/Completion/CompletionExamples.psm1 index a4ce41222..b8427615e 100644 --- a/test/PowerShellEditorServices.Test.Shared/Completion/CompletionExamples.psm1 +++ b/test/PowerShellEditorServices.Test.Shared/Completion/CompletionExamples.psm1 @@ -1,11 +1,11 @@ -function Get-Something +function Get-XYZSomething { $testVar2 = "Shouldn't find this variable" } $testVar1 = "Should find this variable" -Get-So +Get-XYZSo $testVar From 809e95891ddb213ae53e1df03d5eb40275ffe514 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Thu, 10 Oct 2024 15:03:00 -0700 Subject: [PATCH 45/88] Migrate to DeployBox for release stage --- .github/workflows/ci-test.yml | 1 + .gitignore | 5 +-- .../PowerShellEditorServices-Official.yml | 42 ++++++++++--------- PowerShellEditorServices.build.ps1 | 6 ++- tools/installPSResources.ps1 | 12 +++++- 5 files changed, 39 insertions(+), 27 deletions(-) diff --git a/.github/workflows/ci-test.yml b/.github/workflows/ci-test.yml index 6a6b0936f..2c504a075 100644 --- a/.github/workflows/ci-test.yml +++ b/.github/workflows/ci-test.yml @@ -38,6 +38,7 @@ jobs: run: ./tools/installPSResources.ps1 - name: Download daily install script + if: ${{ github.event_name == 'schedule' || github.event_name == 'merge_group' }} uses: actions/checkout@v4 with: repository: PowerShell/PowerShell diff --git a/.gitignore b/.gitignore index 1b97c3908..d8c2d5b16 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,4 @@ bin/ obj/ -module/PowerShellEditorServices/NOTICE.txt -module/PowerShellEditorServices/Commands/en-US/ -module/PSReadLine/ -module/PSScriptAnalyzer/ +module/ TestResults/ diff --git a/.pipelines/PowerShellEditorServices-Official.yml b/.pipelines/PowerShellEditorServices-Official.yml index 5c8fe0655..79e2a85a3 100644 --- a/.pipelines/PowerShellEditorServices-Official.yml +++ b/.pipelines/PowerShellEditorServices-Official.yml @@ -51,7 +51,9 @@ extends: EnableCDPxPAT: false WindowsHostVersion: Version: 2022 - Network: Netlock + Network: KS3 + release: + category: NonAzure stages: - stage: build jobs: @@ -60,7 +62,7 @@ extends: pool: type: windows variables: - ob_outputDirectory: $(Build.SourcesDirectory)/module + ob_outputDirectory: $(Build.SourcesDirectory)/out steps: - pwsh: | [xml]$xml = Get-Content PowerShellEditorServices.Common.props @@ -88,9 +90,10 @@ extends: version: 6.x - pwsh: | Register-PSRepository -Name CFS -SourceLocation "https://pkgs.dev.azure.com/powershell/PowerShell/_packaging/powershell/nuget/v2" -InstallationPolicy Trusted - Install-Module -Repository CFS -Name InvokeBuild -RequiredVersion 5.11.3 - Install-Module -Repository CFS -Name platyPS -RequiredVersion 0.14.2 - Invoke-Build TestFull -Configuration $(BuildConfiguration) -PSRepository CFS + Install-Module -Repository CFS -Name Microsoft.PowerShell.PSResourceGet + ./tools/installPSResources.ps1 -PSRepository CFS + displayName: Install PSResources + - pwsh: Invoke-Build TestFull -Configuration $(BuildConfiguration) -PSRepository CFS displayName: Build and test - task: PublishTestResults@2 displayName: Publish test results @@ -131,36 +134,37 @@ extends: **/OmniSharp.Extensions*.dll; **/Serilog*.dll; **/System.Reactive.dll; + - task: ArchiveFiles@2 + displayName: Zip signed artifacts + inputs: + rootFolderOrFile: $(Build.SourcesDirectory)/module + includeRootFolder: false + archiveType: zip + archiveFile: out/PowerShellEditorServices.zip - stage: release dependsOn: build condition: eq(variables['Build.Reason'], 'Manual') variables: + ob_release_environment: Production version: $[ stageDependencies.build.main.outputs['package.version'] ] prerelease: $[ stageDependencies.build.main.outputs['package.prerelease'] ] - drop: $(Pipeline.Workspace)/drop_build_main jobs: - job: github displayName: Publish draft to GitHub pool: - type: windows - variables: - ob_outputDirectory: $(Build.SourcesDirectory)/out - steps: - - download: current - displayName: Download artifacts - - task: ArchiveFiles@2 - displayName: Zip signed artifacts + type: release + templateContext: inputs: - rootFolderOrFile: $(drop) - includeRootFolder: false - archiveType: zip - archiveFile: out/PowerShellEditorServices.zip + - input: pipelineArtifact + artifactName: drop_build_main + steps: - task: GitHubRelease@1 displayName: Create GitHub release inputs: gitHubConnection: GitHub repositoryName: PowerShell/PowerShellEditorServices - assets: out/PowerShellEditorServices.zip + target: main + assets: $(Pipeline.Workspace)/PowerShellEditorServices.zip tagSource: userSpecifiedTag tag: v$(version) isDraft: true diff --git a/PowerShellEditorServices.build.ps1 b/PowerShellEditorServices.build.ps1 index 72648411d..02a5d6436 100644 --- a/PowerShellEditorServices.build.ps1 +++ b/PowerShellEditorServices.build.ps1 @@ -147,8 +147,10 @@ Task AssembleModule -After Build { New-Item -Force -Path $dir -ItemType Directory | Out-Null } - # Copy third party notices to module folder - Copy-Item -Force -Path "NOTICE.txt" -Destination $psesOutputPath + # Copy documents to module root + foreach ($document in @("LICENSE", "NOTICE.txt", "README.md", "SECURITY.md")) { + Copy-Item -Force -Path $document -Destination "./module" + } # Assemble PSES module $includedDlls = [System.Collections.Generic.HashSet[string]]::new() diff --git a/tools/installPSResources.ps1 b/tools/installPSResources.ps1 index 5456cac13..e98910d70 100644 --- a/tools/installPSResources.ps1 +++ b/tools/installPSResources.ps1 @@ -1,5 +1,13 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. +param( + [ValidateSet("PSGallery", "CFS")] + [string]$PSRepository = "PSGallery" +) -Install-PSResource -TrustRepository -Name InvokeBuild -Scope CurrentUser -Install-PSResource -TrustRepository -Name platyPS -Scope CurrentUser +if ($PSRepository -eq "CFS" -and -not (Get-PSResourceRepository -Name CFS -ErrorAction SilentlyContinue)) { + Register-PSResourceRepository -Name CFS -Uri "https://pkgs.dev.azure.com/powershell/PowerShell/_packaging/powershell/nuget/v3/index.json" +} + +Install-PSResource -Repository $PSRepository -TrustRepository -Name InvokeBuild +Install-PSResource -Repository $PSRepository -TrustRepository -Name platyPS From a20e119bb2595c4369630cc74e72a358ded7d33a Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Tue, 29 Oct 2024 11:47:09 -0700 Subject: [PATCH 46/88] Bump packages for component governance --- Directory.Packages.props | 2 +- .../PowerShellEditorServices.Test.csproj | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index ccd3e5cd8..92a025bed 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -5,7 +5,7 @@ - + diff --git a/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj b/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj index 65d3d1b6c..01c23bcee 100644 --- a/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj +++ b/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj @@ -18,12 +18,12 @@ - + - + From 5fb353cce7db90a50c32911df5e1e20e09fc82b8 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Wed, 30 Oct 2024 11:32:45 -0700 Subject: [PATCH 47/88] v3.21.0: Updates to PSScriptAnalyzer and Call-operator support --- CHANGELOG.md | 7 +++++++ PowerShellEditorServices.Common.props | 2 +- .../PowerShellEditorServices/PowerShellEditorServices.psd1 | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e9dffa950..b44fa94b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # PowerShell Editor Services Release History +## v3.21.0 +### Wednesday, October 30, 2024 + +See more details at the GitHub Release for [v3.21.0](https://github.com/PowerShell/PowerShellEditorServices/releases/tag/v3.21.0). + +Updates to PSScriptAnalyzer and Call-operator support + ## v3.20.1 ### Friday, May 03, 2024 diff --git a/PowerShellEditorServices.Common.props b/PowerShellEditorServices.Common.props index 0abe50b0f..cc0dc7531 100644 --- a/PowerShellEditorServices.Common.props +++ b/PowerShellEditorServices.Common.props @@ -1,6 +1,6 @@ - 3.20.1 + 3.21.0 Microsoft © Microsoft Corporation. diff --git a/module/PowerShellEditorServices/PowerShellEditorServices.psd1 b/module/PowerShellEditorServices/PowerShellEditorServices.psd1 index 7aab2416a..02e3385b6 100644 --- a/module/PowerShellEditorServices/PowerShellEditorServices.psd1 +++ b/module/PowerShellEditorServices/PowerShellEditorServices.psd1 @@ -19,7 +19,7 @@ RootModule = if ($PSEdition -eq 'Core') } # Version number of this module. -ModuleVersion = '3.20.1' +ModuleVersion = '3.21.0' # ID used to uniquely identify this module GUID = '9ca15887-53a2-479a-9cda-48d26bcb6c47' From 7318898ff2f639494460f9306626a7d8f5706173 Mon Sep 17 00:00:00 2001 From: MartinGC94 Date: Mon, 22 Jul 2024 23:04:45 +0200 Subject: [PATCH 48/88] Add new Decorator and Label semantic tokens for attributes and loop labels. Also removes the incorrect Generic -> Function mapping. --- .../TextDocument/Handlers/PsesSemanticTokensHandler.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/PowerShellEditorServices/Services/TextDocument/Handlers/PsesSemanticTokensHandler.cs b/src/PowerShellEditorServices/Services/TextDocument/Handlers/PsesSemanticTokensHandler.cs index e5e69e60f..494843bb5 100644 --- a/src/PowerShellEditorServices/Services/TextDocument/Handlers/PsesSemanticTokensHandler.cs +++ b/src/PowerShellEditorServices/Services/TextDocument/Handlers/PsesSemanticTokensHandler.cs @@ -108,6 +108,11 @@ private static SemanticTokenType MapSemanticTokenType(Token token) return SemanticTokenType.Operator; } + if ((token.TokenFlags & TokenFlags.AttributeName) != 0) + { + return SemanticTokenType.Decorator; + } + if ((token.TokenFlags & TokenFlags.TypeName) != 0) { return SemanticTokenType.Type; @@ -142,8 +147,8 @@ private static SemanticTokenType MapSemanticTokenType(Token token) case TokenKind.Number: return SemanticTokenType.Number; - case TokenKind.Generic: - return SemanticTokenType.Function; + case TokenKind.Label: + return SemanticTokenType.Label; } return null; From 2c24b96e472bd3047196f852e896ada2bf349cc7 Mon Sep 17 00:00:00 2001 From: MartinGC94 Date: Sat, 7 Sep 2024 15:15:07 +0200 Subject: [PATCH 49/88] Update test --- .../Language/SemanticTokenTest.cs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/test/PowerShellEditorServices.Test/Language/SemanticTokenTest.cs b/test/PowerShellEditorServices.Test/Language/SemanticTokenTest.cs index c9f3c01d4..c34336342 100644 --- a/test/PowerShellEditorServices.Test/Language/SemanticTokenTest.cs +++ b/test/PowerShellEditorServices.Test/Language/SemanticTokenTest.cs @@ -20,7 +20,8 @@ public void TokenizesFunctionElements() { const string text = @" function Get-Sum { - param( [int]$a, [int]$b ) + param( [parameter()] [int]$a, [int]$b ) + :loopLabel while (0) {break loopLabel} return $a + $b } "; @@ -38,10 +39,21 @@ function Get-Sum { case "function": case "param": case "return": + case "while": + case "break": Assert.Single(mappedTokens, sToken => SemanticTokenType.Keyword == sToken.Type); break; - case "Get-Sum": - Assert.Single(mappedTokens, sToken => SemanticTokenType.Function == sToken.Type); + case "parameter": + Assert.Single(mappedTokens, sToken => SemanticTokenType.Decorator == sToken.Type); + break; + case "0": + Assert.Single(mappedTokens, sToken => SemanticTokenType.Number == sToken.Type); + break; + case ":loopLabel": + Assert.Single(mappedTokens, sToken => SemanticTokenType.Label == sToken.Type); + break; + case "loopLabel": + Assert.Single(mappedTokens, sToken => SemanticTokenType.Property == sToken.Type); break; case "$a": case "$b": @@ -74,7 +86,6 @@ public void TokenizesStringExpansion() Token stringExpandableToken = scriptFile.ScriptTokens[1]; mappedTokens = new List(PsesSemanticTokensHandler.ConvertToSemanticTokens(stringExpandableToken)); Assert.Collection(mappedTokens, - sToken => Assert.Equal(SemanticTokenType.Function, sToken.Type), sToken => Assert.Equal(SemanticTokenType.Function, sToken.Type), sToken => Assert.Equal(SemanticTokenType.Function, sToken.Type) ); From 7e2d8649302ffe0a6dfc4338713f3eb86cf1b507 Mon Sep 17 00:00:00 2001 From: MartinGC94 Date: Sun, 29 Sep 2024 21:44:11 +0200 Subject: [PATCH 50/88] Fix test --- .../Language/SemanticTokenTest.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/PowerShellEditorServices.Test/Language/SemanticTokenTest.cs b/test/PowerShellEditorServices.Test/Language/SemanticTokenTest.cs index c34336342..196fa9ca6 100644 --- a/test/PowerShellEditorServices.Test/Language/SemanticTokenTest.cs +++ b/test/PowerShellEditorServices.Test/Language/SemanticTokenTest.cs @@ -114,7 +114,11 @@ function Get-A*A { Assert.Single(mappedTokens, sToken => SemanticTokenType.Keyword == sToken.Type); break; case "Get-A*A": - Assert.Single(mappedTokens, sToken => SemanticTokenType.Function == sToken.Type); + if (t.TokenFlags.HasFlag(TokenFlags.CommandName)) + { + Assert.Single(mappedTokens, sToken => SemanticTokenType.Function == sToken.Type); + } + break; } } From 253e942f8cf4dbaa9706fd5ad4e3d59aafb42643 Mon Sep 17 00:00:00 2001 From: Justin Grote Date: Wed, 13 Nov 2024 22:22:28 -0800 Subject: [PATCH 51/88] Remove Serilog and adjust factor for HostLogger injection --- .../PowerShellEditorServices-Official.yml | 1 - Directory.Packages.props | 5 +- NOTICE.txt | 427 ------------------ .../Commands/StartEditorServicesCommand.cs | 1 - .../Configuration/HostLogger.cs | 5 +- .../Internal/EditorServicesRunner.cs | 2 +- .../Hosting/EditorServicesServerFactory.cs | 91 +--- .../Hosting/HostStartupInfo.cs | 5 +- .../Logging/HostLoggerAdapter.cs | 13 +- .../PowerShellEditorServices.csproj | 4 - .../Server/PsesDebugServer.cs | 13 +- .../Server/PsesLanguageServer.cs | 28 +- .../DebugAdapterProtocolMessageTests.cs | 12 +- .../PowerShellEditorServices.Test.E2E.csproj | 1 + .../Processes/ServerProcess.cs | 4 +- 15 files changed, 63 insertions(+), 549 deletions(-) diff --git a/.pipelines/PowerShellEditorServices-Official.yml b/.pipelines/PowerShellEditorServices-Official.yml index 79e2a85a3..729b95e10 100644 --- a/.pipelines/PowerShellEditorServices-Official.yml +++ b/.pipelines/PowerShellEditorServices-Official.yml @@ -132,7 +132,6 @@ extends: **/Nerdbank.Streams.dll; **/Newtonsoft.Json.dll; **/OmniSharp.Extensions*.dll; - **/Serilog*.dll; **/System.Reactive.dll; - task: ArchiveFiles@2 displayName: Zip signed artifacts diff --git a/Directory.Packages.props b/Directory.Packages.props index 92a025bed..834130581 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -3,6 +3,7 @@ + @@ -12,10 +13,6 @@ - - - - diff --git a/NOTICE.txt b/NOTICE.txt index c99a59348..aabad504f 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -68,433 +68,6 @@ http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND - "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - - (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); - -you may not use this file except in compliance with the License. - -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software - -distributed under the License is distributed on an "AS IS" BASIS, - -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -See the License for the specific language governing permissions and - -limitations under the License. - ---------------------------------------------------------- - ---------------------------------------------------------- - -Serilog 3.1.1 - Apache-2.0 - - -Copyright 2013-23 Serilog -Copyright (c) 2013-23 Serilog -copyright (c) Serilog Contributors - -Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - - - "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - - - - "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - - - - "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - - - - "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - - - - "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - - - - "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - - - - "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - - - - "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - - - - "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - - - - "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - - (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); - -you may not use this file except in compliance with the License. - -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software - -distributed under the License is distributed on an "AS IS" BASIS, - -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -See the License for the specific language governing permissions and - -limitations under the License. - ---------------------------------------------------------- - ---------------------------------------------------------- - -Serilog.Extensions.Logging 8.0.0 - Apache-2.0 - - - -Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - - - "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - - - - "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - - - - "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - - - - "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - - - - "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - - - - "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - - - - "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - - - - "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - - - - "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - - - - "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - - (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); - -you may not use this file except in compliance with the License. - -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software - -distributed under the License is distributed on an "AS IS" BASIS, - -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -See the License for the specific language governing permissions and - -limitations under the License. - ---------------------------------------------------------- - ---------------------------------------------------------- - -Serilog.Sinks.Async 1.5.0 - Apache-2.0 - - - -Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - - - "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - - - - "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - - - - "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - - - - "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - - - - "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - - - - "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - - - - "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - - - - "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - - - - "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - - - - "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - - (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); - -you may not use this file except in compliance with the License. - -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software - -distributed under the License is distributed on an "AS IS" BASIS, - -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - -See the License for the specific language governing permissions and - -limitations under the License. - ---------------------------------------------------------- - ---------------------------------------------------------- - -Serilog.Sinks.File 5.0.0 - Apache-2.0 - - - -Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - - - "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - - - - "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - - - - "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - - - - "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - - - - "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - - - - "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - - - - "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - - - - "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - - - - "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - - - "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. diff --git a/src/PowerShellEditorServices.Hosting/Commands/StartEditorServicesCommand.cs b/src/PowerShellEditorServices.Hosting/Commands/StartEditorServicesCommand.cs index 69aa7b97f..e74ca572c 100644 --- a/src/PowerShellEditorServices.Hosting/Commands/StartEditorServicesCommand.cs +++ b/src/PowerShellEditorServices.Hosting/Commands/StartEditorServicesCommand.cs @@ -219,7 +219,6 @@ protected override void BeginProcessing() protected override void EndProcessing() { _logger.Log(PsesLogLevel.Diagnostic, "Beginning EndProcessing block"); - try { // First try to remove PSReadLine to decomplicate startup diff --git a/src/PowerShellEditorServices.Hosting/Configuration/HostLogger.cs b/src/PowerShellEditorServices.Hosting/Configuration/HostLogger.cs index 7ce6f66a9..37893bce1 100644 --- a/src/PowerShellEditorServices.Hosting/Configuration/HostLogger.cs +++ b/src/PowerShellEditorServices.Hosting/Configuration/HostLogger.cs @@ -15,9 +15,8 @@ namespace Microsoft.PowerShell.EditorServices.Hosting /// User-facing log level for editor services configuration. /// /// - /// The underlying values of this enum attempt to align to both - /// and - /// . + /// The underlying values of this enum attempt to align to + /// /// public enum PsesLogLevel { diff --git a/src/PowerShellEditorServices.Hosting/Internal/EditorServicesRunner.cs b/src/PowerShellEditorServices.Hosting/Internal/EditorServicesRunner.cs index 0f47bdad8..040a9ec78 100644 --- a/src/PowerShellEditorServices.Hosting/Internal/EditorServicesRunner.cs +++ b/src/PowerShellEditorServices.Hosting/Internal/EditorServicesRunner.cs @@ -42,7 +42,7 @@ public EditorServicesRunner( _config = config; _sessionFileWriter = sessionFileWriter; // NOTE: This factory helps to isolate `Microsoft.Extensions.Logging/DependencyInjection`. - _serverFactory = EditorServicesServerFactory.Create(_config.LogPath, (int)_config.LogLevel, logger); + _serverFactory = new(logger); _alreadySubscribedDebug = false; _loggersToUnsubscribe = loggersToUnsubscribe; } diff --git a/src/PowerShellEditorServices/Hosting/EditorServicesServerFactory.cs b/src/PowerShellEditorServices/Hosting/EditorServicesServerFactory.cs index a9bbab38e..b981ea450 100644 --- a/src/PowerShellEditorServices/Hosting/EditorServicesServerFactory.cs +++ b/src/PowerShellEditorServices/Hosting/EditorServicesServerFactory.cs @@ -2,81 +2,30 @@ // Licensed under the MIT License. using System; -using System.Diagnostics; using System.IO; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; -using Microsoft.PowerShell.EditorServices.Logging; using Microsoft.PowerShell.EditorServices.Server; -using Serilog; -using Serilog.Events; using OmniSharp.Extensions.LanguageServer.Protocol.Server; using Microsoft.PowerShell.EditorServices.Services.Extension; -#if DEBUG -using Serilog.Debugging; -#endif +// The HostLogger type isn't directly referenced from this assembly, however it uses a common IObservable interface and this alias helps make it more clear the purpose. We can use Microsoft.Extensions.Logging from this point because the ALC should be loaded, but we need to only expose the IObservable to the Hosting assembly so it doesn't try to load MEL before the ALC is ready. +using HostLogger = System.IObservable<(int logLevel, string message)>; namespace Microsoft.PowerShell.EditorServices.Hosting { /// - /// Factory class for hiding dependencies of Editor Services. + /// Factory for creating the LSP server and debug server instances. /// - /// - /// Dependency injection and logging are wrapped by factory methods on this class so that the - /// host assembly can construct the LSP and debug servers without directly depending on and . - /// internal sealed class EditorServicesServerFactory : IDisposable { + private readonly HostLogger _hostLogger; + /// - /// Create a new Editor Services factory. This method will instantiate logging. + /// Creates a loggerfactory for this instance /// - /// - /// - /// This can only be called once because it sets global state (the logger) and that call is - /// in . - /// - /// - /// TODO: Why is this a static function wrapping a constructor instead of just a - /// constructor? In the end it returns an instance (albeit a "singleton"). - /// - /// - /// The path of the log file to use. - /// The minimum log level to use. - /// The host logger? - public static EditorServicesServerFactory Create(string logDirectoryPath, int minimumLogLevel, IObservable<(int logLevel, string message)> hostLogger) - { - // NOTE: Ignore the suggestion to use Environment.ProcessId as it doesn't work for - // .NET 4.6.2 (for Windows PowerShell), and this won't be caught in CI. - int currentPID = Process.GetCurrentProcess().Id; - string logPath = Path.Combine(logDirectoryPath, $"PowerShellEditorServices-{currentPID}.log"); - Log.Logger = new LoggerConfiguration() - .Enrich.FromLogContext() - .WriteTo.Async(config => config.File(logPath)) - .MinimumLevel.Is((LogEventLevel)minimumLogLevel) - .CreateLogger(); - -#if DEBUG - SelfLog.Enable(msg => Debug.WriteLine(msg)); -#endif - - LoggerFactory loggerFactory = new(); - loggerFactory.AddSerilog(); - - // Hook up logging from the host so that its recorded in the log file - hostLogger.Subscribe(new HostLoggerAdapter(loggerFactory)); - - return new EditorServicesServerFactory(loggerFactory); - } - - // TODO: Can we somehow refactor this member so the language and debug servers can be - // instantiated using their constructors instead of tying them to this factory with `Create` - // methods? - private readonly ILoggerFactory _loggerFactory; - - private EditorServicesServerFactory(ILoggerFactory loggerFactory) => _loggerFactory = loggerFactory; + /// The hostLogger that will be provided to the language services for logging handoff + internal EditorServicesServerFactory(HostLogger hostLogger) => _hostLogger = hostLogger; /// /// Create the LSP server. @@ -92,7 +41,7 @@ public static EditorServicesServerFactory Create(string logDirectoryPath, int mi public PsesLanguageServer CreateLanguageServer( Stream inputStream, Stream outputStream, - HostStartupInfo hostStartupInfo) => new(_loggerFactory, inputStream, outputStream, hostStartupInfo); + HostStartupInfo hostStartupInfo) => new(_hostLogger, inputStream, outputStream, hostStartupInfo); /// /// Create the debug server given a language server instance. @@ -110,7 +59,7 @@ public PsesDebugServer CreateDebugServerWithLanguageServer( PsesLanguageServer languageServer) { return new PsesDebugServer( - _loggerFactory, + _hostLogger, inputStream, outputStream, languageServer.LanguageServer.Services); @@ -132,7 +81,7 @@ public PsesDebugServer RecreateDebugServer( PsesDebugServer debugServer) { return new PsesDebugServer( - _loggerFactory, + _hostLogger, inputStream, outputStream, debugServer.ServiceProvider); @@ -153,7 +102,6 @@ public PsesDebugServer CreateDebugServerForTempSession( ServiceProvider serviceProvider = new ServiceCollection() .AddLogging(builder => builder .ClearProviders() - .AddSerilog() .SetMinimumLevel(LogLevel.Trace)) // TODO: Why randomly set to trace? .AddSingleton(_ => null) // TODO: Why add these for a debug server?! @@ -171,25 +119,14 @@ public PsesDebugServer CreateDebugServerForTempSession( serviceProvider.GetService(); return new PsesDebugServer( - _loggerFactory, + _hostLogger, inputStream, outputStream, serviceProvider, isTemp: true); } - /// - /// TODO: This class probably should not be as the primary - /// intention of that interface is to provide cleanup of unmanaged resources, which the - /// logger certainly is not. Nor is this class used with a . Instead, - /// this class should call in a finalizer. This - /// could potentially even be done with by passing dispose=true. - /// - public void Dispose() - { - Log.CloseAndFlush(); - _loggerFactory.Dispose(); - } + // TODO: Clean up host logger? Shouldn't matter since we start a new process after shutdown. + public void Dispose() { } } } diff --git a/src/PowerShellEditorServices/Hosting/HostStartupInfo.cs b/src/PowerShellEditorServices/Hosting/HostStartupInfo.cs index 964509626..d1f1b27db 100644 --- a/src/PowerShellEditorServices/Hosting/HostStartupInfo.cs +++ b/src/PowerShellEditorServices/Hosting/HostStartupInfo.cs @@ -107,9 +107,8 @@ public sealed class HostStartupInfo /// The minimum log level of log events to be logged. /// /// - /// This is cast to all of , , and , hence it is an int. + /// This primitive maps to and /// public int LogLevel { get; } diff --git a/src/PowerShellEditorServices/Logging/HostLoggerAdapter.cs b/src/PowerShellEditorServices/Logging/HostLoggerAdapter.cs index 3290b2b78..0c10980dd 100644 --- a/src/PowerShellEditorServices/Logging/HostLoggerAdapter.cs +++ b/src/PowerShellEditorServices/Logging/HostLoggerAdapter.cs @@ -9,23 +9,16 @@ namespace Microsoft.PowerShell.EditorServices.Logging /// /// Adapter class to allow logging events sent by the host to be recorded by PSES' logging infrastructure. /// - internal class HostLoggerAdapter : IObserver<(int logLevel, string message)> + internal class HostLoggerAdapter(ILogger logger) : IObserver<(int logLevel, string message)> { - private readonly ILogger _logger; + public void OnError(Exception error) => logger.LogError(error, "Error in host logger"); - /// - /// Create a new host logger adapter. - /// - /// Factory to create logger instances with. - public HostLoggerAdapter(ILoggerFactory loggerFactory) => _logger = loggerFactory.CreateLogger("HostLogs"); + public void OnNext((int logLevel, string message) value) => logger.Log((LogLevel)value.logLevel, value.message); public void OnCompleted() { // Nothing to do; we simply don't send more log messages } - public void OnError(Exception error) => _logger.LogError(error, "Error in host logger"); - - public void OnNext((int logLevel, string message) value) => _logger.Log((LogLevel)value.logLevel, value.message); } } diff --git a/src/PowerShellEditorServices/PowerShellEditorServices.csproj b/src/PowerShellEditorServices/PowerShellEditorServices.csproj index 9a1771500..bf90a93ae 100644 --- a/src/PowerShellEditorServices/PowerShellEditorServices.csproj +++ b/src/PowerShellEditorServices/PowerShellEditorServices.csproj @@ -36,10 +36,6 @@ - - - - diff --git a/src/PowerShellEditorServices/Server/PsesDebugServer.cs b/src/PowerShellEditorServices/Server/PsesDebugServer.cs index 6aca82e04..31f6a988f 100644 --- a/src/PowerShellEditorServices/Server/PsesDebugServer.cs +++ b/src/PowerShellEditorServices/Server/PsesDebugServer.cs @@ -5,13 +5,15 @@ using System.IO; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; using Microsoft.PowerShell.EditorServices.Handlers; using Microsoft.PowerShell.EditorServices.Services; using Microsoft.PowerShell.EditorServices.Services.PowerShell.Host; using OmniSharp.Extensions.DebugAdapter.Server; using OmniSharp.Extensions.LanguageServer.Server; +// See EditorServicesServerFactory.cs for the explanation of this alias. +using HostLogger = System.IObservable<(int logLevel, string message)>; + namespace Microsoft.PowerShell.EditorServices.Server { /// @@ -26,16 +28,17 @@ internal class PsesDebugServer : IDisposable private PsesInternalHost _psesHost; private bool _startedPses; private readonly bool _isTemp; - protected readonly ILoggerFactory _loggerFactory; + // FIXME: This was never actually used in the debug server. Since we never have a debug server without an LSP, we could probably remove this and either reuse the MEL from the LSP, or create a new one here. It is probably best to only use this for exceptions that we can't reasonably send via the DAP protocol, which should only be anything before the initialize request. + protected readonly HostLogger _hostLogger; public PsesDebugServer( - ILoggerFactory factory, + HostLogger hostLogger, Stream inputStream, Stream outputStream, IServiceProvider serviceProvider, bool isTemp = false) { - _loggerFactory = factory; + _hostLogger = hostLogger; _inputStream = inputStream; _outputStream = outputStream; ServiceProvider = serviceProvider; @@ -63,7 +66,6 @@ public async Task StartAsync() .WithOutput(_outputStream) .WithServices(serviceCollection => serviceCollection - .AddLogging() .AddOptions() .AddPsesDebugServices(ServiceProvider, this)) // TODO: Consider replacing all WithHandler with AddSingleton @@ -130,7 +132,6 @@ public void Dispose() _debugAdapterServer?.Dispose(); _inputStream.Dispose(); _outputStream.Dispose(); - _loggerFactory.Dispose(); _serverStopped.SetResult(true); // TODO: If the debugger has stopped, should we clear the breakpoints? } diff --git a/src/PowerShellEditorServices/Server/PsesLanguageServer.cs b/src/PowerShellEditorServices/Server/PsesLanguageServer.cs index 58d52bb3a..b2195cae5 100644 --- a/src/PowerShellEditorServices/Server/PsesLanguageServer.cs +++ b/src/PowerShellEditorServices/Server/PsesLanguageServer.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. +using System; using System.IO; using System.Linq; using System.Threading.Tasks; @@ -8,14 +9,18 @@ using Microsoft.Extensions.Logging; using Microsoft.PowerShell.EditorServices.Handlers; using Microsoft.PowerShell.EditorServices.Hosting; +using Microsoft.PowerShell.EditorServices.Logging; using Microsoft.PowerShell.EditorServices.Services; using Microsoft.PowerShell.EditorServices.Services.Extension; using Microsoft.PowerShell.EditorServices.Services.PowerShell.Host; using Newtonsoft.Json.Linq; using OmniSharp.Extensions.JsonRpc; +using OmniSharp.Extensions.LanguageServer.Protocol.General; using OmniSharp.Extensions.LanguageServer.Protocol.Server; using OmniSharp.Extensions.LanguageServer.Server; -using Serilog; + +// See EditorServicesServerFactory.cs for the explanation of this alias. +using HostLogger = System.IObservable<(int logLevel, string message)>; namespace Microsoft.PowerShell.EditorServices.Server { @@ -24,7 +29,7 @@ namespace Microsoft.PowerShell.EditorServices.Server /// internal class PsesLanguageServer { - internal ILoggerFactory LoggerFactory { get; } + internal HostLogger HostLogger { get; } internal ILanguageServer LanguageServer { get; private set; } private readonly LogLevel _minimumLogLevel; private readonly Stream _inputStream; @@ -32,6 +37,7 @@ internal class PsesLanguageServer private readonly HostStartupInfo _hostDetails; private readonly TaskCompletionSource _serverStart; private PsesInternalHost _psesHost; + private IDisposable hostLoggerSubscription; /// /// Create a new language server instance. @@ -41,18 +47,18 @@ internal class PsesLanguageServer /// cref="EditorServicesServerFactory.CreateLanguageServer"/>. It is essentially a /// singleton. The factory hides the logger. /// - /// Factory to create loggers with. + /// The host logger to hand off for monitoring. /// Protocol transport input stream. /// Protocol transport output stream. /// Host configuration to instantiate the server and services /// with. public PsesLanguageServer( - ILoggerFactory factory, + HostLogger hostLogger, Stream inputStream, Stream outputStream, HostStartupInfo hostStartupInfo) { - LoggerFactory = factory; + HostLogger = hostLogger; _minimumLogLevel = (LogLevel)hostStartupInfo.LogLevel; _inputStream = inputStream; _outputStream = outputStream; @@ -82,10 +88,9 @@ public async Task StartAsync() serviceCollection.AddPsesLanguageServices(_hostDetails); }) .ConfigureLogging(builder => builder - .AddSerilog(Log.Logger) // TODO: Set dispose to true? + .ClearProviders() .AddLanguageProtocolLogging() .SetMinimumLevel(_minimumLogLevel)) - // TODO: Consider replacing all WithHandler with AddSingleton .WithHandler() .WithHandler() .WithHandler() @@ -124,6 +129,11 @@ public async Task StartAsync() .OnInitialize( (languageServer, initializeParams, cancellationToken) => { + // Wire up the HostLogger to the LanguageServer's logger once we are initialized, so that any messages still logged to the HostLogger get sent across the LSP channel. There is no more logging to disk at this point. + hostLoggerSubscription = HostLogger.Subscribe(new HostLoggerAdapter( + languageServer.Services.GetService>() + )); + // Set the workspace path from the parameters. WorkspaceService workspaceService = languageServer.Services.GetService(); if (initializeParams.WorkspaceFolders is not null) @@ -158,7 +168,9 @@ public async Task StartAsync() _psesHost = languageServer.Services.GetService(); return _psesHost.TryStartAsync(hostStartOptions, cancellationToken); - }); + } + ) + .OnShutdown(_ => hostLoggerSubscription.Dispose()); }).ConfigureAwait(false); _serverStart.SetResult(true); diff --git a/test/PowerShellEditorServices.Test.E2E/DebugAdapterProtocolMessageTests.cs b/test/PowerShellEditorServices.Test.E2E/DebugAdapterProtocolMessageTests.cs index 654001da7..a3c68eadb 100644 --- a/test/PowerShellEditorServices.Test.E2E/DebugAdapterProtocolMessageTests.cs +++ b/test/PowerShellEditorServices.Test.E2E/DebugAdapterProtocolMessageTests.cs @@ -9,6 +9,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Debug; using OmniSharp.Extensions.DebugAdapter.Client; using OmniSharp.Extensions.DebugAdapter.Protocol.Models; using OmniSharp.Extensions.DebugAdapter.Protocol.Requests; @@ -33,8 +34,10 @@ public class DebugAdapterProtocolMessageTests : IAsyncLifetime, IDisposable public async Task InitializeAsync() { - LoggerFactory factory = new(); - _psesProcess = new PsesStdioProcess(factory, true); + LoggerFactory debugLoggerFactory = new(); + debugLoggerFactory.AddProvider(new DebugLoggerProvider()); + + _psesProcess = new PsesStdioProcess(debugLoggerFactory, true); await _psesProcess.Start(); TaskCompletionSource initialized = new(); @@ -50,6 +53,11 @@ public async Task InitializeAsync() options .WithInput(_psesProcess.OutputStream) .WithOutput(_psesProcess.InputStream) + .ConfigureLogging(builder => + builder + .AddDebug() + .SetMinimumLevel(LogLevel.Trace) + ) // The OnStarted delegate gets run when we receive the _Initialized_ event from the server: // https://microsoft.github.io/debug-adapter-protocol/specification#Events_Initialized .OnStarted((_, _) => diff --git a/test/PowerShellEditorServices.Test.E2E/PowerShellEditorServices.Test.E2E.csproj b/test/PowerShellEditorServices.Test.E2E/PowerShellEditorServices.Test.E2E.csproj index 3756f071d..2ea39d3fd 100644 --- a/test/PowerShellEditorServices.Test.E2E/PowerShellEditorServices.Test.E2E.csproj +++ b/test/PowerShellEditorServices.Test.E2E/PowerShellEditorServices.Test.E2E.csproj @@ -7,6 +7,7 @@ + diff --git a/test/PowerShellEditorServices.Test.E2E/Processes/ServerProcess.cs b/test/PowerShellEditorServices.Test.E2E/Processes/ServerProcess.cs index 8d744dc11..90ecaaf5c 100644 --- a/test/PowerShellEditorServices.Test.E2E/Processes/ServerProcess.cs +++ b/test/PowerShellEditorServices.Test.E2E/Processes/ServerProcess.cs @@ -38,8 +38,8 @@ protected ServerProcess(ILoggerFactory loggerFactory) Exited = _exitedSubject = new AsyncSubject(); - _inStreamLazy = new Lazy(() => new LoggingStream(GetInputStream())); - _outStreamLazy = new Lazy(() => new LoggingStream(GetOutputStream())); + _inStreamLazy = new Lazy(GetInputStream); + _outStreamLazy = new Lazy(GetOutputStream); } /// From feabfd52885dfefdc6b08f0c0e3ec5d1f2c4f8a5 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Thu, 14 Nov 2024 14:34:53 -0800 Subject: [PATCH 52/88] Drop support for PowerShell 7.2 (net6.0) per its end-of-life Also allows us to bump Microsoft.Extensions.Logging to 9.0.0. --- Directory.Packages.props | 4 ++-- PowerShellEditorServices.build.ps1 | 12 +++--------- .../PowerShellEditorServices.Hosting.csproj | 2 +- .../PowerShellEditorServices.Test.csproj | 7 +------ 4 files changed, 7 insertions(+), 18 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 834130581..d854d6c51 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -2,8 +2,8 @@ - - + + diff --git a/PowerShellEditorServices.build.ps1 b/PowerShellEditorServices.build.ps1 index 02a5d6436..5002127b2 100644 --- a/PowerShellEditorServices.build.ps1 +++ b/PowerShellEditorServices.build.ps1 @@ -40,12 +40,11 @@ $script:BuildInfoPath = "src/PowerShellEditorServices.Hosting/BuildInfo.cs" $script:NetFramework = @{ PS51 = 'net462' - PS72 = 'net6.0' PS74 = 'net8.0' Standard = 'netstandard2.0' } -$script:HostCoreOutput = "src/PowerShellEditorServices.Hosting/bin/$Configuration/$($script:NetFramework.PS72)/publish" +$script:HostCoreOutput = "src/PowerShellEditorServices.Hosting/bin/$Configuration/$($script:NetFramework.PS74)/publish" $script:HostDeskOutput = "src/PowerShellEditorServices.Hosting/bin/$Configuration/$($script:NetFramework.PS51)/publish" $script:PsesOutput = "src/PowerShellEditorServices/bin/$Configuration/$($script:NetFramework.Standard)/publish" @@ -128,7 +127,7 @@ task RestorePsesModules -If (-not (Test-Path "module/PSReadLine") -or -not (Test Task Build FindDotNet, CreateBuildInfo, RestorePsesModules, { Write-Build DarkGreen "Building PowerShellEditorServices" Invoke-BuildExec { & dotnet publish $script:dotnetBuildArgs ./src/PowerShellEditorServices/PowerShellEditorServices.csproj -f $script:NetFramework.Standard } - Invoke-BuildExec { & dotnet publish $script:dotnetBuildArgs ./src/PowerShellEditorServices.Hosting/PowerShellEditorServices.Hosting.csproj -f $script:NetFramework.PS72 } + Invoke-BuildExec { & dotnet publish $script:dotnetBuildArgs ./src/PowerShellEditorServices.Hosting/PowerShellEditorServices.Hosting.csproj -f $script:NetFramework.PS74 } if (-not $script:IsNix) { Invoke-BuildExec { & dotnet publish $script:dotnetBuildArgs ./src/PowerShellEditorServices.Hosting/PowerShellEditorServices.Hosting.csproj -f $script:NetFramework.PS51 } @@ -201,11 +200,6 @@ Task TestPS74 Build, SetupHelpForTests, { Invoke-BuildExec { & dotnet $script:dotnetTestArgs $script:NetFramework.PS74 } } -Task TestPS72 Build, SetupHelpForTests, { - Set-Location ./test/PowerShellEditorServices.Test/ - Invoke-BuildExec { & dotnet $script:dotnetTestArgs $script:NetFramework.PS72 } -} - Task TestPS51 -If (-not $script:IsNix) Build, SetupHelpForTests, { Set-Location ./test/PowerShellEditorServices.Test/ # TODO: See https://github.com/dotnet/sdk/issues/18353 for x64 test host @@ -299,7 +293,7 @@ Task TestE2EPowerShellCLM -If (-not $script:IsNix) Build, SetupHelpForTests, { } } -Task Test TestPS72, TestPS74, TestE2EPwsh, TestPS51, TestE2EPowerShell +Task Test TestPS74, TestE2EPwsh, TestPS51, TestE2EPowerShell Task TestFull Test, TestE2EDaily, TestE2EPwshCLM, TestE2EPowerShellCLM diff --git a/src/PowerShellEditorServices.Hosting/PowerShellEditorServices.Hosting.csproj b/src/PowerShellEditorServices.Hosting/PowerShellEditorServices.Hosting.csproj index 8233ead02..7b73ff8a8 100644 --- a/src/PowerShellEditorServices.Hosting/PowerShellEditorServices.Hosting.csproj +++ b/src/PowerShellEditorServices.Hosting/PowerShellEditorServices.Hosting.csproj @@ -2,7 +2,7 @@ - net6.0;net462 + net8.0;net462 Microsoft.PowerShell.EditorServices.Hosting diff --git a/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj b/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj index 01c23bcee..8d4ce9c79 100644 --- a/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj +++ b/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj @@ -2,7 +2,7 @@ - net8.0;net6.0;net462 + net8.0;net462 Microsoft.PowerShell.EditorServices.Test x64 @@ -21,11 +21,6 @@ - - - - - From 38dd8f0fd020171469796b11b3a5703e3fefa6bb Mon Sep 17 00:00:00 2001 From: Justin Grote Date: Mon, 4 Nov 2024 15:44:00 -0800 Subject: [PATCH 53/88] First piece of minimal logging configuration --- .../Logging/LanguageServerLogger.cs | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/PowerShellEditorServices/Logging/LanguageServerLogger.cs diff --git a/src/PowerShellEditorServices/Logging/LanguageServerLogger.cs b/src/PowerShellEditorServices/Logging/LanguageServerLogger.cs new file mode 100644 index 000000000..16e8b9831 --- /dev/null +++ b/src/PowerShellEditorServices/Logging/LanguageServerLogger.cs @@ -0,0 +1,44 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; + +namespace Microsoft.PowerShell.EditorServices.Logging; +internal class DynamicLogLevelOptions( + LogLevel initialLevel, + IOptionsMonitor optionsMonitor) : IConfigureOptions +{ + private LogLevel _currentLevel = initialLevel; + private readonly IOptionsMonitor _optionsMonitor = optionsMonitor; + + public void Configure(LoggerFilterOptions options) => options.MinLevel = _currentLevel; + + public void SetLogLevel(LogLevel level) + { + _currentLevel = level; + // Trigger reload of options to apply new log level + _optionsMonitor.CurrentValue.MinLevel = level; + } +} + +public static class LoggingBuilderExtensions +{ + public static ILoggingBuilder AddLspClientConfigurableMinimumLevel( + this ILoggingBuilder builder, + LogLevel initialLevel = LogLevel.Trace + ) + { + builder.Services.AddOptions(); + builder.Services.AddSingleton(sp => + { + IOptionsMonitor optionsMonitor = sp.GetRequiredService>(); + return new(initialLevel, optionsMonitor); + }); + builder.Services.AddSingleton>(sp => + sp.GetRequiredService()); + return builder; + } +} + From 71253d2bb4a7bd51c4b9213028993ad6e4f56925 Mon Sep 17 00:00:00 2001 From: Justin Grote Date: Sat, 9 Nov 2024 12:28:48 -0700 Subject: [PATCH 54/88] Add basic logger --- .../Logging/LanguageServerLogger.cs | 129 ++++++++++++++++-- 1 file changed, 118 insertions(+), 11 deletions(-) diff --git a/src/PowerShellEditorServices/Logging/LanguageServerLogger.cs b/src/PowerShellEditorServices/Logging/LanguageServerLogger.cs index 16e8b9831..4da2509dd 100644 --- a/src/PowerShellEditorServices/Logging/LanguageServerLogger.cs +++ b/src/PowerShellEditorServices/Logging/LanguageServerLogger.cs @@ -1,30 +1,120 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. +#nullable enable +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reactive.Disposables; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using Newtonsoft.Json; +using OmniSharp.Extensions.LanguageServer.Protocol.Client; +using OmniSharp.Extensions.LanguageServer.Protocol.Models; +using OmniSharp.Extensions.LanguageServer.Protocol.Server; +using OmniSharp.Extensions.LanguageServer.Protocol.Window; namespace Microsoft.PowerShell.EditorServices.Logging; -internal class DynamicLogLevelOptions( - LogLevel initialLevel, - IOptionsMonitor optionsMonitor) : IConfigureOptions + +internal class LanguageServerLogger(ILanguageServerFacade responseRouter, string categoryName) : ILogger { - private LogLevel _currentLevel = initialLevel; - private readonly IOptionsMonitor _optionsMonitor = optionsMonitor; + public IDisposable? BeginScope(TState state) where TState : notnull => Disposable.Empty; + public bool IsEnabled(LogLevel logLevel) => true; - public void Configure(LoggerFilterOptions options) => options.MinLevel = _currentLevel; + public void Log( + LogLevel logLevel, EventId eventId, TState state, Exception? exception, + Func formatter + ) + { + // Any Omnisharp or trace logs are directly LSP protocol related and we send them to the trace channel + // TODO: Dynamically adjust if SetTrace is reported + if (categoryName.StartsWith("OmniSharp") || logLevel == LogLevel.Trace) + { + // Everything with omnisharp goes directly to trace + string eventMessage = string.Empty; + string exceptionName = exception?.GetType().Name ?? string.Empty; + if (eventId.Name is not null) + { + eventMessage = eventId.Id == 0 ? eventId.Name : $"{eventId.Name} [{eventId.Id}] "; + } - public void SetLogLevel(LogLevel level) + LogTraceParams trace = new() + { + Message = categoryName + ": " + eventMessage + exceptionName, + Verbose = formatter(state, exception) + }; + responseRouter.Client.LogTrace(trace); + } + else if (TryGetMessageType(logLevel, out MessageType messageType)) + { + LogMessageParams logMessage = new() + { + Type = messageType, + // TODO: Add Critical and Debug delineations + Message = categoryName + ": " + formatter(state, exception) + + (exception != null ? " - " + exception : "") + " | " + + //Hopefully this isn't too expensive in the long run + FormatState(state, exception) + }; + responseRouter.Window.Log(logMessage); + } + } + + + private static string FormatState(TState state, Exception? exception) { - _currentLevel = level; - // Trigger reload of options to apply new log level - _optionsMonitor.CurrentValue.MinLevel = level; + return state switch + { + IEnumerable> dict => string.Join(" ", dict.Where(z => z.Key != "{OriginalFormat}").Select(z => $"{z.Key}='{z.Value}'")), + _ => JsonConvert.SerializeObject(state).Replace("\"", "'") + }; } + + private static bool TryGetMessageType(LogLevel logLevel, out MessageType messageType) + { + switch (logLevel) + { + case LogLevel.Critical: + case LogLevel.Error: + messageType = MessageType.Error; + return true; + case LogLevel.Warning: + messageType = MessageType.Warning; + return true; + case LogLevel.Information: + messageType = MessageType.Info; + return true; + case LogLevel.Debug: + case LogLevel.Trace: + messageType = MessageType.Log; + return true; + } + + messageType = MessageType.Log; + return false; + } +} + +internal class LanguageServerLoggerProvider(ILanguageServerFacade languageServer) : ILoggerProvider +{ + public ILogger CreateLogger(string categoryName) => new LanguageServerLogger(languageServer, categoryName); + + public void Dispose() { } } -public static class LoggingBuilderExtensions + +public static class LanguageServerLoggerExtensions { + /// + /// Adds a custom logger provider for PSES LSP, that provides more granular categorization than the default Omnisharp logger, such as separating Omnisharp and PSES messages to different channels. + /// + public static ILoggingBuilder AddPsesLanguageServerLogging(this ILoggingBuilder builder) + { + builder.Services.AddSingleton(); + return builder; + } + public static ILoggingBuilder AddLspClientConfigurableMinimumLevel( this ILoggingBuilder builder, LogLevel initialLevel = LogLevel.Trace @@ -38,7 +128,24 @@ public static ILoggingBuilder AddLspClientConfigurableMinimumLevel( }); builder.Services.AddSingleton>(sp => sp.GetRequiredService()); + return builder; } } +internal class DynamicLogLevelOptions( + LogLevel initialLevel, + IOptionsMonitor optionsMonitor) : IConfigureOptions +{ + private LogLevel _currentLevel = initialLevel; + private readonly IOptionsMonitor _optionsMonitor = optionsMonitor; + + public void Configure(LoggerFilterOptions options) => options.MinLevel = _currentLevel; + + public void SetLogLevel(LogLevel level) + { + _currentLevel = level; + // Trigger reload of options to apply new log level + _optionsMonitor.CurrentValue.MinLevel = level; + } +} From d9de5bd8b1ed624a687d701fa2616e5991db2e2c Mon Sep 17 00:00:00 2001 From: Justin Grote Date: Thu, 14 Nov 2024 17:10:56 -0800 Subject: [PATCH 55/88] Update HostLogger to map to MEL more easily --- .../Configuration/HostLogger.cs | 129 ++++++++++-------- .../Logging/HostLoggerAdapter.cs | 3 + .../Logging/LanguageServerLogger.cs | 45 +++--- 3 files changed, 97 insertions(+), 80 deletions(-) diff --git a/src/PowerShellEditorServices.Hosting/Configuration/HostLogger.cs b/src/PowerShellEditorServices.Hosting/Configuration/HostLogger.cs index 37893bce1..9fa239bfe 100644 --- a/src/PowerShellEditorServices.Hosting/Configuration/HostLogger.cs +++ b/src/PowerShellEditorServices.Hosting/Configuration/HostLogger.cs @@ -12,20 +12,51 @@ namespace Microsoft.PowerShell.EditorServices.Hosting { /// - /// User-facing log level for editor services configuration. + /// Log Level for HostLogger. This is a direct copy of LogLevel from Microsoft.Extensions.Logging, and will map to + /// MEL.LogLevel once MEL is bootstrapped, but we don't want to load any MEL assemblies until the Assembly Load + /// Context is set up. /// - /// - /// The underlying values of this enum attempt to align to - /// - /// public enum PsesLogLevel { - Diagnostic = 0, - Verbose = 1, - Normal = 2, + /// + /// Logs that contain the most detailed messages. These messages may contain sensitive application data. + /// These messages are disabled by default and should never be enabled in a production environment. + /// + Trace = 0, + + /// + /// Logs that are used for interactive investigation during development. These logs should primarily contain + /// information useful for debugging and have no long-term value. + /// + Debug = 1, + + /// + /// Logs that track the general flow of the application. These logs should have long-term value. + /// + Information = 2, + + /// + /// Logs that highlight an abnormal or unexpected event in the application flow, but do not otherwise cause the + /// application execution to stop. + /// Warning = 3, + + /// + /// Logs that highlight when the current flow of execution is stopped due to a failure. These should indicate a + /// failure in the current activity, not an application-wide failure. + /// Error = 4, - None = 5 + + /// + /// Logs that describe an unrecoverable application or system crash, or a catastrophic failure that requires + /// immediate attention. + /// + Critical = 5, + + /// + /// Not used for writing log messages. Specifies that a logging category should not write any messages. + /// + None = 6, } /// @@ -180,15 +211,9 @@ public void LogException( /// Since it's likely that the process will end when PSES shuts down, /// there's no good reason to need objects rather than writing directly to the host. /// - internal class PSHostLogger : IObserver<(PsesLogLevel logLevel, string message)> + /// The PowerShell host user interface object to log output to. + internal class PSHostLogger(PSHostUserInterface ui) : IObserver<(PsesLogLevel logLevel, string message)> { - private readonly PSHostUserInterface _ui; - - /// - /// Create a new PowerShell host logger. - /// - /// The PowerShell host user interface object to log output to. - public PSHostLogger(PSHostUserInterface ui) => _ui = ui; public void OnCompleted() { @@ -200,35 +225,37 @@ public void OnCompleted() public void OnNext((PsesLogLevel logLevel, string message) value) { - switch (value.logLevel) + (PsesLogLevel logLevel, string message) = value; + switch (logLevel) { - case PsesLogLevel.Diagnostic: - _ui.WriteDebugLine(value.message); - return; - - case PsesLogLevel.Verbose: - _ui.WriteVerboseLine(value.message); - return; + case PsesLogLevel.Trace: + case PsesLogLevel.Debug: + ui.WriteDebugLine(message); + break; - case PsesLogLevel.Normal: - _ui.WriteLine(value.message); - return; + case PsesLogLevel.Information: + ui.WriteVerboseLine(message); + break; case PsesLogLevel.Warning: - _ui.WriteWarningLine(value.message); - return; + ui.WriteWarningLine(message); + break; case PsesLogLevel.Error: - _ui.WriteErrorLine(value.message); - return; + case PsesLogLevel.Critical: + ui.WriteErrorLine(message); + break; default: - _ui.WriteLine(value.message); - return; + ui.WriteLine(message); + break; } } } + /// + /// A simple log sink that logs to a stream, typically used to log to a file. + /// internal class StreamLogger : IObserver<(PsesLogLevel logLevel, string message)>, IDisposable { public static StreamLogger CreateWithNewFile(string path) @@ -283,9 +310,7 @@ public void OnCompleted() } _cancellationSource.Cancel(); - _writerThread.Join(); - _unsubscriber.Dispose(); _fileWriter.Flush(); _fileWriter.Close(); @@ -298,29 +323,17 @@ public void OnCompleted() public void OnNext((PsesLogLevel logLevel, string message) value) { - string message = null; - switch (value.logLevel) + string message = value.logLevel switch { - case PsesLogLevel.Diagnostic: - message = $"[DBG]: {value.message}"; - break; - - case PsesLogLevel.Verbose: - message = $"[VRB]: {value.message}"; - break; - - case PsesLogLevel.Normal: - message = $"[INF]: {value.message}"; - break; - - case PsesLogLevel.Warning: - message = $"[WRN]: {value.message}"; - break; - - case PsesLogLevel.Error: - message = $"[ERR]: {value.message}"; - break; - } + // String interpolation often considered a logging sin is OK here because our filtering happens before. + PsesLogLevel.Trace => $"[TRC]: {value.message}", + PsesLogLevel.Debug => $"[DBG]: {value.message}", + PsesLogLevel.Information => $"[INF]: {value.message}", + PsesLogLevel.Warning => $"[WRN]: {value.message}", + PsesLogLevel.Error => $"[ERR]: {value.message}", + PsesLogLevel.Critical => $"[CRT]: {value.message}", + _ => value.message, + }; _messageQueue.Add(message); } diff --git a/src/PowerShellEditorServices/Logging/HostLoggerAdapter.cs b/src/PowerShellEditorServices/Logging/HostLoggerAdapter.cs index 0c10980dd..42d2a44e9 100644 --- a/src/PowerShellEditorServices/Logging/HostLoggerAdapter.cs +++ b/src/PowerShellEditorServices/Logging/HostLoggerAdapter.cs @@ -13,6 +13,9 @@ internal class HostLoggerAdapter(ILogger logger) : IObserver<(int logLevel, stri { public void OnError(Exception error) => logger.LogError(error, "Error in host logger"); + /// + /// Log the message received from the host into MEL. + /// public void OnNext((int logLevel, string message) value) => logger.Log((LogLevel)value.logLevel, value.message); public void OnCompleted() diff --git a/src/PowerShellEditorServices/Logging/LanguageServerLogger.cs b/src/PowerShellEditorServices/Logging/LanguageServerLogger.cs index 4da2509dd..99d628d10 100644 --- a/src/PowerShellEditorServices/Logging/LanguageServerLogger.cs +++ b/src/PowerShellEditorServices/Logging/LanguageServerLogger.cs @@ -10,7 +10,6 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Newtonsoft.Json; -using OmniSharp.Extensions.LanguageServer.Protocol.Client; using OmniSharp.Extensions.LanguageServer.Protocol.Models; using OmniSharp.Extensions.LanguageServer.Protocol.Server; using OmniSharp.Extensions.LanguageServer.Protocol.Window; @@ -29,33 +28,35 @@ public void Log( { // Any Omnisharp or trace logs are directly LSP protocol related and we send them to the trace channel // TODO: Dynamically adjust if SetTrace is reported - if (categoryName.StartsWith("OmniSharp") || logLevel == LogLevel.Trace) - { - // Everything with omnisharp goes directly to trace - string eventMessage = string.Empty; - string exceptionName = exception?.GetType().Name ?? string.Empty; - if (eventId.Name is not null) - { - eventMessage = eventId.Id == 0 ? eventId.Name : $"{eventId.Name} [{eventId.Id}] "; - } - - LogTraceParams trace = new() - { - Message = categoryName + ": " + eventMessage + exceptionName, - Verbose = formatter(state, exception) - }; - responseRouter.Client.LogTrace(trace); - } - else if (TryGetMessageType(logLevel, out MessageType messageType)) + // BUG: There is an omnisharp filter incorrectly filtering this. As a workaround we will use logMessage. + // https://github.com/OmniSharp/csharp-language-server-protocol/issues/1390 + // if (categoryName.StartsWith("OmniSharp") || logLevel == LogLevel.Trace) + // { + // // Everything with omnisharp goes directly to trace + // string eventMessage = string.Empty; + // string exceptionName = exception?.GetType().Name ?? string.Empty; + // if (eventId.Name is not null) + // { + // eventMessage = eventId.Id == 0 ? eventId.Name : $"{eventId.Name} [{eventId.Id}] "; + // } + + // LogTraceParams trace = new() + // { + // Message = categoryName + ": " + eventMessage + exceptionName, + // Verbose = formatter(state, exception) + // }; + // responseRouter.Client.LogTrace(trace); + // } + if (TryGetMessageType(logLevel, out MessageType messageType)) { LogMessageParams logMessage = new() { Type = messageType, // TODO: Add Critical and Debug delineations Message = categoryName + ": " + formatter(state, exception) + - (exception != null ? " - " + exception : "") + " | " + - //Hopefully this isn't too expensive in the long run - FormatState(state, exception) + (exception != null ? " - " + exception : "") + " | " + + //Hopefully this isn't too expensive in the long run + FormatState(state, exception) }; responseRouter.Window.Log(logMessage); } From 455ca1c647ad35cc9b73987071e66842a46bc894 Mon Sep 17 00:00:00 2001 From: Justin Grote Date: Thu, 14 Nov 2024 17:49:22 -0800 Subject: [PATCH 56/88] Update Log Levels for PSES Appropriately --- .../Commands/StartEditorServicesCommand.cs | 32 +++++----- .../Configuration/EditorServicesConfig.cs | 6 +- .../Configuration/SessionFileWriter.cs | 6 +- .../Configuration/TransportConfig.cs | 16 ++--- .../EditorServicesLoader.cs | 58 +++++++++---------- .../Internal/EditorServicesRunner.cs | 38 ++++++------ .../Logging/HostLoggerAdapter.cs | 1 - 7 files changed, 78 insertions(+), 79 deletions(-) diff --git a/src/PowerShellEditorServices.Hosting/Commands/StartEditorServicesCommand.cs b/src/PowerShellEditorServices.Hosting/Commands/StartEditorServicesCommand.cs index e74ca572c..9d43f3185 100644 --- a/src/PowerShellEditorServices.Hosting/Commands/StartEditorServicesCommand.cs +++ b/src/PowerShellEditorServices.Hosting/Commands/StartEditorServicesCommand.cs @@ -138,7 +138,7 @@ public StartEditorServicesCommand() /// The minimum log level that should be emitted. /// [Parameter] - public PsesLogLevel LogLevel { get; set; } = PsesLogLevel.Normal; + public PsesLogLevel LogLevel { get; set; } = PsesLogLevel.Warning; /// /// Paths to additional PowerShell modules to be imported at startup. @@ -218,7 +218,7 @@ protected override void BeginProcessing() [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD002:Avoid problematic synchronous waits", Justification = "We have to wait here, it's the whole program.")] protected override void EndProcessing() { - _logger.Log(PsesLogLevel.Diagnostic, "Beginning EndProcessing block"); + _logger.Log(PsesLogLevel.Trace, "Beginning EndProcessing block"); try { // First try to remove PSReadLine to decomplicate startup @@ -229,7 +229,7 @@ protected override void EndProcessing() EditorServicesConfig editorServicesConfig = CreateConfigObject(); using EditorServicesLoader psesLoader = EditorServicesLoader.Create(_logger, editorServicesConfig, SessionDetailsPath, _loggerUnsubscribers); - _logger.Log(PsesLogLevel.Verbose, "Loading EditorServices"); + _logger.Log(PsesLogLevel.Debug, "Loading EditorServices"); // Synchronously start editor services and wait here until it shuts down. psesLoader.LoadAndRunEditorServicesAsync().GetAwaiter().GetResult(); } @@ -281,7 +281,7 @@ private void StartLogging() IDisposable fileLoggerUnsubscriber = _logger.Subscribe(fileLogger); fileLogger.AddUnsubscriber(fileLoggerUnsubscriber); _loggerUnsubscribers.Add(fileLoggerUnsubscriber); - _logger.Log(PsesLogLevel.Diagnostic, "Logging started"); + _logger.Log(PsesLogLevel.Trace, "Logging started"); } // Sanitizes user input and ensures the directory is created. @@ -299,7 +299,7 @@ private string GetLogDirPath() private void RemovePSReadLineForStartup() { - _logger.Log(PsesLogLevel.Verbose, "Removing PSReadLine"); + _logger.Log(PsesLogLevel.Debug, "Removing PSReadLine"); using SMA.PowerShell pwsh = SMA.PowerShell.Create(RunspaceMode.CurrentRunspace); bool hasPSReadLine = pwsh.AddCommand(new CmdletInfo(@"Microsoft.PowerShell.Core\Get-Module", typeof(GetModuleCommand))) .AddParameter("Name", "PSReadLine") @@ -314,13 +314,13 @@ private void RemovePSReadLineForStartup() .AddParameter("Name", "PSReadLine") .AddParameter("ErrorAction", "SilentlyContinue"); - _logger.Log(PsesLogLevel.Verbose, "Removed PSReadLine"); + _logger.Log(PsesLogLevel.Debug, "Removed PSReadLine"); } } private EditorServicesConfig CreateConfigObject() { - _logger.Log(PsesLogLevel.Diagnostic, "Creating host configuration"); + _logger.Log(PsesLogLevel.Trace, "Creating host configuration"); string bundledModulesPath = BundledModulesPath; if (!Path.IsPathRooted(bundledModulesPath)) @@ -399,31 +399,31 @@ private string GetProfilePathFromProfileObject(PSObject profileObject, ProfileUs // * On Linux or macOS on any version greater than or equal to 7 private ConsoleReplKind GetReplKind() { - _logger.Log(PsesLogLevel.Diagnostic, "Determining REPL kind"); + _logger.Log(PsesLogLevel.Trace, "Determining REPL kind"); if (Stdio || !EnableConsoleRepl) { - _logger.Log(PsesLogLevel.Diagnostic, "REPL configured as None"); + _logger.Log(PsesLogLevel.Trace, "REPL configured as None"); return ConsoleReplKind.None; } if (UseLegacyReadLine) { - _logger.Log(PsesLogLevel.Diagnostic, "REPL configured as Legacy"); + _logger.Log(PsesLogLevel.Trace, "REPL configured as Legacy"); return ConsoleReplKind.LegacyReadLine; } - _logger.Log(PsesLogLevel.Diagnostic, "REPL configured as PSReadLine"); + _logger.Log(PsesLogLevel.Trace, "REPL configured as PSReadLine"); return ConsoleReplKind.PSReadLine; } private ITransportConfig GetLanguageServiceTransport() { - _logger.Log(PsesLogLevel.Diagnostic, "Configuring LSP transport"); + _logger.Log(PsesLogLevel.Trace, "Configuring LSP transport"); if (DebugServiceOnly) { - _logger.Log(PsesLogLevel.Diagnostic, "No LSP transport: PSES is debug only"); + _logger.Log(PsesLogLevel.Trace, "No LSP transport: PSES is debug only"); return null; } @@ -447,11 +447,11 @@ private ITransportConfig GetLanguageServiceTransport() private ITransportConfig GetDebugServiceTransport() { - _logger.Log(PsesLogLevel.Diagnostic, "Configuring debug transport"); + _logger.Log(PsesLogLevel.Trace, "Configuring debug transport"); if (LanguageServiceOnly) { - _logger.Log(PsesLogLevel.Diagnostic, "No Debug transport: PSES is language service only"); + _logger.Log(PsesLogLevel.Trace, "No Debug transport: PSES is language service only"); return null; } @@ -462,7 +462,7 @@ private ITransportConfig GetDebugServiceTransport() return new StdioTransportConfig(_logger); } - _logger.Log(PsesLogLevel.Diagnostic, "No debug transport: Transport is Stdio with debug disabled"); + _logger.Log(PsesLogLevel.Trace, "No debug transport: Transport is Stdio with debug disabled"); return null; } diff --git a/src/PowerShellEditorServices.Hosting/Configuration/EditorServicesConfig.cs b/src/PowerShellEditorServices.Hosting/Configuration/EditorServicesConfig.cs index b2e683a2f..66bc7b1de 100644 --- a/src/PowerShellEditorServices.Hosting/Configuration/EditorServicesConfig.cs +++ b/src/PowerShellEditorServices.Hosting/Configuration/EditorServicesConfig.cs @@ -90,14 +90,14 @@ public EditorServicesConfig( public ConsoleReplKind ConsoleRepl { get; set; } = ConsoleReplKind.None; /// - /// Will suppress messages to PSHost (to prevent Stdio clobbering) + /// Will suppress messages to PSHost (to prevent Stdio clobbering) /// public bool UseNullPSHostUI { get; set; } /// - /// The minimum log level to log events with. + /// The minimum log level to log events with. Defaults to warning but is usually overriden by the startup process. /// - public PsesLogLevel LogLevel { get; set; } = PsesLogLevel.Normal; + public PsesLogLevel LogLevel { get; set; } = PsesLogLevel.Warning; /// /// Configuration for the language server protocol transport to use. diff --git a/src/PowerShellEditorServices.Hosting/Configuration/SessionFileWriter.cs b/src/PowerShellEditorServices.Hosting/Configuration/SessionFileWriter.cs index c5f351f91..bca1acd5e 100644 --- a/src/PowerShellEditorServices.Hosting/Configuration/SessionFileWriter.cs +++ b/src/PowerShellEditorServices.Hosting/Configuration/SessionFileWriter.cs @@ -63,7 +63,7 @@ public SessionFileWriter(HostLogger logger, string sessionFilePath, Version powe /// The reason for the startup failure. public void WriteSessionFailure(string reason) { - _logger.Log(PsesLogLevel.Diagnostic, "Writing session failure"); + _logger.Log(PsesLogLevel.Trace, "Writing session failure"); Dictionary sessionObject = new() { @@ -81,7 +81,7 @@ public void WriteSessionFailure(string reason) /// The debug adapter transport configuration. public void WriteSessionStarted(ITransportConfig languageServiceTransport, ITransportConfig debugAdapterTransport) { - _logger.Log(PsesLogLevel.Diagnostic, "Writing session started"); + _logger.Log(PsesLogLevel.Trace, "Writing session started"); Dictionary sessionObject = new() { @@ -142,7 +142,7 @@ private void WriteSessionObject(Dictionary sessionObject) File.WriteAllText(_sessionFilePath, content, s_sessionFileEncoding); } - _logger.Log(PsesLogLevel.Verbose, $"Session file written to {_sessionFilePath} with content:\n{content}"); + _logger.Log(PsesLogLevel.Debug, $"Session file written to {_sessionFilePath} with content:\n{content}"); } } } diff --git a/src/PowerShellEditorServices.Hosting/Configuration/TransportConfig.cs b/src/PowerShellEditorServices.Hosting/Configuration/TransportConfig.cs index be763737c..db64a27a7 100644 --- a/src/PowerShellEditorServices.Hosting/Configuration/TransportConfig.cs +++ b/src/PowerShellEditorServices.Hosting/Configuration/TransportConfig.cs @@ -53,7 +53,7 @@ public sealed class StdioTransportConfig : ITransportConfig public Task<(Stream inStream, Stream outStream)> ConnectStreamsAsync() { - _logger.Log(PsesLogLevel.Diagnostic, "Connecting stdio streams"); + _logger.Log(PsesLogLevel.Trace, "Connecting stdio streams"); return Task.FromResult((Console.OpenStandardInput(), Console.OpenStandardOutput())); } } @@ -102,11 +102,11 @@ private DuplexNamedPipeTransportConfig(HostLogger logger, string pipeName) public async Task<(Stream inStream, Stream outStream)> ConnectStreamsAsync() { - _logger.Log(PsesLogLevel.Diagnostic, "Creating named pipe"); + _logger.Log(PsesLogLevel.Trace, "Creating named pipe"); NamedPipeServerStream namedPipe = NamedPipeUtils.CreateNamedPipe(_pipeName, PipeDirection.InOut); - _logger.Log(PsesLogLevel.Diagnostic, "Waiting for named pipe connection"); + _logger.Log(PsesLogLevel.Trace, "Waiting for named pipe connection"); await namedPipe.WaitForConnectionAsync().ConfigureAwait(false); - _logger.Log(PsesLogLevel.Diagnostic, "Named pipe connected"); + _logger.Log(PsesLogLevel.Trace, "Named pipe connected"); return (namedPipe, namedPipe); } } @@ -173,18 +173,18 @@ private SimplexNamedPipeTransportConfig(HostLogger logger, string inPipeName, st public async Task<(Stream inStream, Stream outStream)> ConnectStreamsAsync() { - _logger.Log(PsesLogLevel.Diagnostic, "Starting in pipe connection"); + _logger.Log(PsesLogLevel.Trace, "Starting in pipe connection"); NamedPipeServerStream inPipe = NamedPipeUtils.CreateNamedPipe(_inPipeName, PipeDirection.InOut); Task inPipeConnected = inPipe.WaitForConnectionAsync(); - _logger.Log(PsesLogLevel.Diagnostic, "Starting out pipe connection"); + _logger.Log(PsesLogLevel.Trace, "Starting out pipe connection"); NamedPipeServerStream outPipe = NamedPipeUtils.CreateNamedPipe(_outPipeName, PipeDirection.Out); Task outPipeConnected = outPipe.WaitForConnectionAsync(); - _logger.Log(PsesLogLevel.Diagnostic, "Wating for pipe connections"); + _logger.Log(PsesLogLevel.Trace, "Wating for pipe connections"); await Task.WhenAll(inPipeConnected, outPipeConnected).ConfigureAwait(false); - _logger.Log(PsesLogLevel.Diagnostic, "Simplex named pipe transport connected"); + _logger.Log(PsesLogLevel.Trace, "Simplex named pipe transport connected"); return (inPipe, outPipe); } } diff --git a/src/PowerShellEditorServices.Hosting/EditorServicesLoader.cs b/src/PowerShellEditorServices.Hosting/EditorServicesLoader.cs index cf5c45c75..a3abd6156 100644 --- a/src/PowerShellEditorServices.Hosting/EditorServicesLoader.cs +++ b/src/PowerShellEditorServices.Hosting/EditorServicesLoader.cs @@ -70,20 +70,20 @@ public static EditorServicesLoader Create( Version powerShellVersion = GetPSVersion(); SessionFileWriter sessionFileWriter = new(logger, sessionDetailsPath, powerShellVersion); - logger.Log(PsesLogLevel.Diagnostic, "Session file writer created"); + logger.Log(PsesLogLevel.Trace, "Session file writer created"); #if CoreCLR // In .NET Core, we add an event here to redirect dependency loading to the new AssemblyLoadContext we load PSES' dependencies into - logger.Log(PsesLogLevel.Verbose, "Adding AssemblyResolve event handler for new AssemblyLoadContext dependency loading"); + logger.Log(PsesLogLevel.Debug, "Adding AssemblyResolve event handler for new AssemblyLoadContext dependency loading"); PsesLoadContext psesLoadContext = new(s_psesDependencyDirPath); - if (hostConfig.LogLevel == PsesLogLevel.Diagnostic) + if (hostConfig.LogLevel == PsesLogLevel.Trace) { AppDomain.CurrentDomain.AssemblyLoad += (object sender, AssemblyLoadEventArgs args) => { logger.Log( - PsesLogLevel.Diagnostic, + PsesLogLevel.Trace, $"Loaded into load context {AssemblyLoadContext.GetLoadContext(args.LoadedAssembly)}: {args.LoadedAssembly}"); }; } @@ -91,9 +91,9 @@ public static EditorServicesLoader Create( AssemblyLoadContext.Default.Resolving += (AssemblyLoadContext _, AssemblyName asmName) => { #if ASSEMBLY_LOAD_STACKTRACE - logger.Log(PsesLogLevel.Diagnostic, $"Assembly resolve event fired for {asmName}. Stacktrace:\n{new StackTrace()}"); + logger.Log(PsesLogLevel.Trace, $"Assembly resolve event fired for {asmName}. Stacktrace:\n{new StackTrace()}"); #else - logger.Log(PsesLogLevel.Diagnostic, $"Assembly resolve event fired for {asmName}"); + logger.Log(PsesLogLevel.Trace, $"Assembly resolve event fired for {asmName}"); #endif // We only want the Editor Services DLL; the new ALC will lazily load its dependencies automatically @@ -104,15 +104,15 @@ public static EditorServicesLoader Create( string asmPath = Path.Combine(s_psesDependencyDirPath, $"{asmName.Name}.dll"); - logger.Log(PsesLogLevel.Verbose, "Loading PSES DLL using new assembly load context"); + logger.Log(PsesLogLevel.Debug, "Loading PSES DLL using new assembly load context"); return psesLoadContext.LoadFromAssemblyPath(asmPath); }; #else // In .NET Framework we add an event here to redirect dependency loading in the current AppDomain for PSES' dependencies - logger.Log(PsesLogLevel.Verbose, "Adding AssemblyResolve event handler for dependency loading"); + logger.Log(PsesLogLevel.Debug, "Adding AssemblyResolve event handler for dependency loading"); - if (hostConfig.LogLevel == PsesLogLevel.Diagnostic) + if (hostConfig.LogLevel == PsesLogLevel.Trace) { AppDomain.CurrentDomain.AssemblyLoad += (object sender, AssemblyLoadEventArgs args) => { @@ -122,7 +122,7 @@ public static EditorServicesLoader Create( } logger.Log( - PsesLogLevel.Diagnostic, + PsesLogLevel.Trace, $"Loaded '{args.LoadedAssembly.GetName()}' from '{args.LoadedAssembly.Location}'"); }; } @@ -131,9 +131,9 @@ public static EditorServicesLoader Create( AppDomain.CurrentDomain.AssemblyResolve += (object sender, ResolveEventArgs args) => { #if ASSEMBLY_LOAD_STACKTRACE - logger.Log(PsesLogLevel.Diagnostic, $"Assembly resolve event fired for {args.Name}. Stacktrace:\n{new StackTrace()}"); + logger.Log(PsesLogLevel.Trace, $"Assembly resolve event fired for {args.Name}. Stacktrace:\n{new StackTrace()}"); #else - logger.Log(PsesLogLevel.Diagnostic, $"Assembly resolve event fired for {args.Name}"); + logger.Log(PsesLogLevel.Trace, $"Assembly resolve event fired for {args.Name}"); #endif AssemblyName asmName = new(args.Name); @@ -143,7 +143,7 @@ public static EditorServicesLoader Create( string baseDirAsmPath = Path.Combine(s_psesBaseDirPath, dllName); if (File.Exists(baseDirAsmPath)) { - logger.Log(PsesLogLevel.Diagnostic, $"Loading {args.Name} from PSES base dir into LoadFile context"); + logger.Log(PsesLogLevel.Trace, $"Loading {args.Name} from PSES base dir into LoadFile context"); return Assembly.LoadFile(baseDirAsmPath); } @@ -151,7 +151,7 @@ public static EditorServicesLoader Create( string asmPath = Path.Combine(s_psesDependencyDirPath, dllName); if (File.Exists(asmPath)) { - logger.Log(PsesLogLevel.Diagnostic, $"Loading {args.Name} from PSES dependency dir into LoadFile context"); + logger.Log(PsesLogLevel.Trace, $"Loading {args.Name} from PSES dependency dir into LoadFile context"); return Assembly.LoadFile(asmPath); } @@ -212,10 +212,10 @@ public Task LoadAndRunEditorServicesAsync() ValidateConfiguration(); // Method with no implementation that forces the PSES assembly to load, triggering an AssemblyResolve event - _logger.Log(PsesLogLevel.Verbose, "Loading PowerShell Editor Services"); + _logger.Log(PsesLogLevel.Debug, "Loading PowerShell Editor Services"); LoadEditorServices(); - _logger.Log(PsesLogLevel.Verbose, "Starting EditorServices"); + _logger.Log(PsesLogLevel.Debug, "Starting EditorServices"); _editorServicesRunner = new EditorServicesRunner(_logger, _hostConfig, _sessionFileWriter, _loggersToUnsubscribe); @@ -225,7 +225,7 @@ public Task LoadAndRunEditorServicesAsync() public void Dispose() { - _logger.Log(PsesLogLevel.Diagnostic, "Loader disposed"); + _logger.Log(PsesLogLevel.Trace, "Loader disposed"); _editorServicesRunner?.Dispose(); // TODO: @@ -242,7 +242,7 @@ private void CheckPowerShellVersion() { PSLanguageMode languageMode = Runspace.DefaultRunspace.SessionStateProxy.LanguageMode; - _logger.Log(PsesLogLevel.Verbose, $@" + _logger.Log(PsesLogLevel.Debug, $@" == PowerShell Details == - PowerShell version: {_powerShellVersion} - Language mode: {languageMode} @@ -261,7 +261,7 @@ private void CheckPowerShellVersion() #if !CoreCLR private void CheckDotNetVersion() { - _logger.Log(PsesLogLevel.Verbose, "Checking that .NET Framework version is at least 4.8"); + _logger.Log(PsesLogLevel.Debug, "Checking that .NET Framework version is at least 4.8"); using RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Net Framework Setup\NDP\v4\Full"); object netFxValue = key?.GetValue("Release"); if (netFxValue == null || netFxValue is not int netFxVersion) @@ -269,7 +269,7 @@ private void CheckDotNetVersion() return; } - _logger.Log(PsesLogLevel.Verbose, $".NET registry version: {netFxVersion}"); + _logger.Log(PsesLogLevel.Debug, $".NET registry version: {netFxVersion}"); if (netFxVersion < Net48Version) { @@ -283,26 +283,26 @@ private void UpdatePSModulePath() { if (string.IsNullOrEmpty(_hostConfig.BundledModulePath)) { - _logger.Log(PsesLogLevel.Diagnostic, "BundledModulePath not set, skipping"); + _logger.Log(PsesLogLevel.Trace, "BundledModulePath not set, skipping"); return; } string psModulePath = Environment.GetEnvironmentVariable("PSModulePath").TrimEnd(Path.PathSeparator); if ($"{psModulePath}{Path.PathSeparator}".Contains($"{_hostConfig.BundledModulePath}{Path.PathSeparator}")) { - _logger.Log(PsesLogLevel.Diagnostic, "BundledModulePath already set, skipping"); + _logger.Log(PsesLogLevel.Trace, "BundledModulePath already set, skipping"); return; } psModulePath = $"{psModulePath}{Path.PathSeparator}{_hostConfig.BundledModulePath}"; Environment.SetEnvironmentVariable("PSModulePath", psModulePath); - _logger.Log(PsesLogLevel.Verbose, $"Updated PSModulePath to: '{psModulePath}'"); + _logger.Log(PsesLogLevel.Debug, $"Updated PSModulePath to: '{psModulePath}'"); } private void LogHostInformation() { - _logger.Log(PsesLogLevel.Verbose, $"PID: {System.Diagnostics.Process.GetCurrentProcess().Id}"); + _logger.Log(PsesLogLevel.Debug, $"PID: {System.Diagnostics.Process.GetCurrentProcess().Id}"); - _logger.Log(PsesLogLevel.Verbose, $@" + _logger.Log(PsesLogLevel.Debug, $@" == Build Details == - Editor Services version: {BuildInfo.BuildVersion} - Build origin: {BuildInfo.BuildOrigin} @@ -310,7 +310,7 @@ private void LogHostInformation() - Build time: {BuildInfo.BuildTime} "); - _logger.Log(PsesLogLevel.Verbose, $@" + _logger.Log(PsesLogLevel.Debug, $@" == Host Startup Configuration Details == - Host name: {_hostConfig.HostInfo.Name} - Host version: {_hostConfig.HostInfo.Version} @@ -333,14 +333,14 @@ private void LogHostInformation() + CurrentUserCurrentHost: {_hostConfig.ProfilePaths.CurrentUserCurrentHost ?? ""} "); - _logger.Log(PsesLogLevel.Verbose, $@" + _logger.Log(PsesLogLevel.Debug, $@" == Console Details == - Console input encoding: {Console.InputEncoding.EncodingName} - Console output encoding: {Console.OutputEncoding.EncodingName} - PowerShell output encoding: {GetPSOutputEncoding()} "); - _logger.Log(PsesLogLevel.Verbose, $@" + _logger.Log(PsesLogLevel.Debug, $@" == Environment Details == - OS description: {RuntimeInformation.OSDescription} - OS architecture: {RuntimeInformation.OSArchitecture} @@ -359,7 +359,7 @@ private static string GetPSOutputEncoding() [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "CA2208:Instantiate argument exceptions correctly", Justification = "Checking user-defined configuration")] private void ValidateConfiguration() { - _logger.Log(PsesLogLevel.Diagnostic, "Validating configuration"); + _logger.Log(PsesLogLevel.Trace, "Validating configuration"); bool lspUsesStdio = _hostConfig.LanguageServiceTransport is StdioTransportConfig; bool debugUsesStdio = _hostConfig.DebugServiceTransport is StdioTransportConfig; diff --git a/src/PowerShellEditorServices.Hosting/Internal/EditorServicesRunner.cs b/src/PowerShellEditorServices.Hosting/Internal/EditorServicesRunner.cs index 040a9ec78..90eb89810 100644 --- a/src/PowerShellEditorServices.Hosting/Internal/EditorServicesRunner.cs +++ b/src/PowerShellEditorServices.Hosting/Internal/EditorServicesRunner.cs @@ -60,11 +60,11 @@ public Task RunUntilShutdown() Task runAndAwaitShutdown = CreateEditorServicesAndRunUntilShutdown(); // Now write the session file - _logger.Log(PsesLogLevel.Diagnostic, "Writing session file"); + _logger.Log(PsesLogLevel.Trace, "Writing session file"); _sessionFileWriter.WriteSessionStarted(_config.LanguageServiceTransport, _config.DebugServiceTransport); // Finally, wait for Editor Services to shut down - _logger.Log(PsesLogLevel.Diagnostic, "Waiting on PSES run/shutdown"); + _logger.Log(PsesLogLevel.Trace, "Waiting on PSES run/shutdown"); return runAndAwaitShutdown; } @@ -124,7 +124,7 @@ private async Task CreateEditorServicesAndRunUntilShutdown() { try { - _logger.Log(PsesLogLevel.Diagnostic, "Creating/running editor services"); + _logger.Log(PsesLogLevel.Trace, "Creating/running editor services"); bool creatingLanguageServer = _config.LanguageServiceTransport != null; bool creatingDebugServer = _config.DebugServiceTransport != null; @@ -149,7 +149,7 @@ private async Task CreateEditorServicesAndRunUntilShutdown() // - Wait for the LSP server to finish // Unsubscribe the host logger here so that the Extension Terminal is not polluted with input after the first prompt - _logger.Log(PsesLogLevel.Verbose, "Starting server, deregistering host logger and registering shutdown listener"); + _logger.Log(PsesLogLevel.Debug, "Starting server, deregistering host logger and registering shutdown listener"); if (_loggersToUnsubscribe != null) { foreach (IDisposable loggerToUnsubscribe in _loggersToUnsubscribe) @@ -193,11 +193,11 @@ private async Task CreateEditorServicesAndRunUntilShutdown() private async Task RunTempDebugSessionAsync(HostStartupInfo hostDetails) { - _logger.Log(PsesLogLevel.Diagnostic, "Running temp debug session"); + _logger.Log(PsesLogLevel.Trace, "Running temp debug session"); PsesDebugServer debugServer = await CreateDebugServerForTempSessionAsync(hostDetails).ConfigureAwait(false); - _logger.Log(PsesLogLevel.Verbose, "Debug server created"); + _logger.Log(PsesLogLevel.Debug, "Debug server created"); await debugServer.StartAsync().ConfigureAwait(false); - _logger.Log(PsesLogLevel.Verbose, "Debug server started"); + _logger.Log(PsesLogLevel.Debug, "Debug server started"); await debugServer.WaitForShutdown().ConfigureAwait(false); } @@ -210,47 +210,47 @@ private async Task StartDebugServer(Task debugServerCreation) // To do this, we set an event to allow it to create a new debug server as its session ends if (!_alreadySubscribedDebug) { - _logger.Log(PsesLogLevel.Diagnostic, "Subscribing debug server for session ended event"); + _logger.Log(PsesLogLevel.Trace, "Subscribing debug server for session ended event"); _alreadySubscribedDebug = true; debugServer.SessionEnded += DebugServer_OnSessionEnded; } - _logger.Log(PsesLogLevel.Diagnostic, "Starting debug server"); + _logger.Log(PsesLogLevel.Trace, "Starting debug server"); await debugServer.StartAsync().ConfigureAwait(false); } private Task RestartDebugServerAsync(PsesDebugServer debugServer) { - _logger.Log(PsesLogLevel.Diagnostic, "Restarting debug server"); + _logger.Log(PsesLogLevel.Trace, "Restarting debug server"); Task debugServerCreation = RecreateDebugServerAsync(debugServer); return StartDebugServer(debugServerCreation); } private async Task CreateLanguageServerAsync(HostStartupInfo hostDetails) { - _logger.Log(PsesLogLevel.Verbose, $"Creating LSP transport with endpoint {_config.LanguageServiceTransport.EndpointDetails}"); + _logger.Log(PsesLogLevel.Debug, $"Creating LSP transport with endpoint {_config.LanguageServiceTransport.EndpointDetails}"); (Stream inStream, Stream outStream) = await _config.LanguageServiceTransport.ConnectStreamsAsync().ConfigureAwait(false); - _logger.Log(PsesLogLevel.Diagnostic, "Creating language server"); + _logger.Log(PsesLogLevel.Trace, "Creating language server"); return _serverFactory.CreateLanguageServer(inStream, outStream, hostDetails); } private async Task CreateDebugServerWithLanguageServerAsync(PsesLanguageServer languageServer) { - _logger.Log(PsesLogLevel.Verbose, $"Creating debug adapter transport with endpoint {_config.DebugServiceTransport.EndpointDetails}"); + _logger.Log(PsesLogLevel.Debug, $"Creating debug adapter transport with endpoint {_config.DebugServiceTransport.EndpointDetails}"); (Stream inStream, Stream outStream) = await _config.DebugServiceTransport.ConnectStreamsAsync().ConfigureAwait(false); - _logger.Log(PsesLogLevel.Diagnostic, "Creating debug adapter"); + _logger.Log(PsesLogLevel.Trace, "Creating debug adapter"); return _serverFactory.CreateDebugServerWithLanguageServer(inStream, outStream, languageServer); } private async Task RecreateDebugServerAsync(PsesDebugServer debugServer) { - _logger.Log(PsesLogLevel.Diagnostic, "Recreating debug adapter transport"); + _logger.Log(PsesLogLevel.Trace, "Recreating debug adapter transport"); (Stream inStream, Stream outStream) = await _config.DebugServiceTransport.ConnectStreamsAsync().ConfigureAwait(false); - _logger.Log(PsesLogLevel.Diagnostic, "Recreating debug adapter"); + _logger.Log(PsesLogLevel.Trace, "Recreating debug adapter"); return _serverFactory.RecreateDebugServer(inStream, outStream, debugServer); } @@ -263,7 +263,7 @@ private async Task CreateDebugServerForTempSessionAsync(HostSta private HostStartupInfo CreateHostStartupInfo() { - _logger.Log(PsesLogLevel.Diagnostic, "Creating startup info object"); + _logger.Log(PsesLogLevel.Trace, "Creating startup info object"); ProfilePathInfo profilePaths = null; if (_config.ProfilePaths.AllUsersAllHosts != null @@ -288,7 +288,7 @@ private HostStartupInfo CreateHostStartupInfo() _config.AdditionalModules, _config.InitialSessionState, _config.LogPath, - (int)_config.LogLevel, + (int)_config.LogLevel, //This maps to MEL log levels, we use int so this is easily supplied externally. consoleReplEnabled: _config.ConsoleRepl != ConsoleReplKind.None, useNullPSHostUI: _config.UseNullPSHostUI, usesLegacyReadLine: _config.ConsoleRepl == ConsoleReplKind.LegacyReadLine, @@ -308,7 +308,7 @@ private void WriteStartupBanner() [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "VSTHRD110:Observe result of async calls", Justification = "Intentionally fire and forget.")] private void DebugServer_OnSessionEnded(object sender, EventArgs args) { - _logger.Log(PsesLogLevel.Verbose, "Debug session ended, restarting debug service..."); + _logger.Log(PsesLogLevel.Debug, "Debug session ended, restarting debug service..."); PsesDebugServer oldServer = (PsesDebugServer)sender; oldServer.Dispose(); _alreadySubscribedDebug = false; diff --git a/src/PowerShellEditorServices/Logging/HostLoggerAdapter.cs b/src/PowerShellEditorServices/Logging/HostLoggerAdapter.cs index 42d2a44e9..9ffe3c950 100644 --- a/src/PowerShellEditorServices/Logging/HostLoggerAdapter.cs +++ b/src/PowerShellEditorServices/Logging/HostLoggerAdapter.cs @@ -22,6 +22,5 @@ public void OnCompleted() { // Nothing to do; we simply don't send more log messages } - } } From b5853081a05389310686f5a4c5de40757a21469f Mon Sep 17 00:00:00 2001 From: Justin Grote Date: Thu, 14 Nov 2024 18:37:56 -0800 Subject: [PATCH 57/88] Update PsesLogLevel to match MEL levels --- README.md | 2 +- .../Commands/StartEditorServicesCommand.cs | 29 +++++++++++++++++-- .../EditorServicesLoader.cs | 4 +-- .../Internal/EditorServicesRunner.cs | 26 +++++++++-------- 4 files changed, 43 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 6dec799a5..440150dce 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,7 @@ $command = @( "-HostName 'My Client'", "-HostProfileId 'myclient'", "-HostVersion 1.0.0", - "-LogLevel Diagnostic" + "-LogLevel Trace" ) -join " " $pwsh_arguments = "-NoLogo -NoProfile -Command $command" diff --git a/src/PowerShellEditorServices.Hosting/Commands/StartEditorServicesCommand.cs b/src/PowerShellEditorServices.Hosting/Commands/StartEditorServicesCommand.cs index 9d43f3185..6f2ec8851 100644 --- a/src/PowerShellEditorServices.Hosting/Commands/StartEditorServicesCommand.cs +++ b/src/PowerShellEditorServices.Hosting/Commands/StartEditorServicesCommand.cs @@ -138,7 +138,7 @@ public StartEditorServicesCommand() /// The minimum log level that should be emitted. /// [Parameter] - public PsesLogLevel LogLevel { get; set; } = PsesLogLevel.Warning; + public string LogLevel { get; set; } = PsesLogLevel.Warning.ToString(); /// /// Paths to additional PowerShell modules to be imported at startup. @@ -195,6 +195,11 @@ public StartEditorServicesCommand() [Parameter] public string StartupBanner { get; set; } + /// + /// Compatibility to store the currently supported PSESLogLevel Enum Value + /// + private PsesLogLevel _psesLogLevel = PsesLogLevel.Warning; + #pragma warning disable IDE0022 protected override void BeginProcessing() { @@ -257,7 +262,25 @@ protected override void EndProcessing() private void StartLogging() { - _logger = new HostLogger(LogLevel); + bool isLegacyPsesLogLevel = false; + if (!Enum.TryParse(LogLevel, true, out _psesLogLevel)) + { + // PSES used to have log levels that didn't match MEL levels, this is an adapter for those types and may eventually be removed once people migrate their settings. + isLegacyPsesLogLevel = true; + _psesLogLevel = LogLevel switch + { + "Diagnostic" => PsesLogLevel.Trace, + "Verbose" => PsesLogLevel.Debug, + "Normal" => PsesLogLevel.Information, + _ => PsesLogLevel.Trace + }; + } + + _logger = new HostLogger(_psesLogLevel); + if (isLegacyPsesLogLevel) + { + _logger.Log(PsesLogLevel.Warning, $"The log level '{LogLevel}' is deprecated and will be removed in a future release. Please update your settings or command line options to use one of the following options: 'Trace', 'Debug', 'Information', 'Warning', 'Error', 'Critical'."); + } // We need to not write log messages to Stdio // if it's being used as a protocol transport @@ -349,7 +372,7 @@ private EditorServicesConfig CreateConfigObject() LogPath) { FeatureFlags = FeatureFlags, - LogLevel = LogLevel, + LogLevel = _psesLogLevel, ConsoleRepl = GetReplKind(), UseNullPSHostUI = Stdio, // If Stdio is used we can't write anything else out AdditionalModules = AdditionalModules, diff --git a/src/PowerShellEditorServices.Hosting/EditorServicesLoader.cs b/src/PowerShellEditorServices.Hosting/EditorServicesLoader.cs index a3abd6156..eb52eaf2d 100644 --- a/src/PowerShellEditorServices.Hosting/EditorServicesLoader.cs +++ b/src/PowerShellEditorServices.Hosting/EditorServicesLoader.cs @@ -212,10 +212,10 @@ public Task LoadAndRunEditorServicesAsync() ValidateConfiguration(); // Method with no implementation that forces the PSES assembly to load, triggering an AssemblyResolve event - _logger.Log(PsesLogLevel.Debug, "Loading PowerShell Editor Services"); + _logger.Log(PsesLogLevel.Information, "Loading PowerShell Editor Services"); LoadEditorServices(); - _logger.Log(PsesLogLevel.Debug, "Starting EditorServices"); + _logger.Log(PsesLogLevel.Information, "Starting EditorServices"); _editorServicesRunner = new EditorServicesRunner(_logger, _hostConfig, _sessionFileWriter, _loggersToUnsubscribe); diff --git a/src/PowerShellEditorServices.Hosting/Internal/EditorServicesRunner.cs b/src/PowerShellEditorServices.Hosting/Internal/EditorServicesRunner.cs index 90eb89810..1c9de268c 100644 --- a/src/PowerShellEditorServices.Hosting/Internal/EditorServicesRunner.cs +++ b/src/PowerShellEditorServices.Hosting/Internal/EditorServicesRunner.cs @@ -64,7 +64,7 @@ public Task RunUntilShutdown() _sessionFileWriter.WriteSessionStarted(_config.LanguageServiceTransport, _config.DebugServiceTransport); // Finally, wait for Editor Services to shut down - _logger.Log(PsesLogLevel.Trace, "Waiting on PSES run/shutdown"); + _logger.Log(PsesLogLevel.Debug, "Waiting on PSES run/shutdown"); return runAndAwaitShutdown; } @@ -124,7 +124,7 @@ private async Task CreateEditorServicesAndRunUntilShutdown() { try { - _logger.Log(PsesLogLevel.Trace, "Creating/running editor services"); + _logger.Log(PsesLogLevel.Debug, "Creating/running editor services"); bool creatingLanguageServer = _config.LanguageServiceTransport != null; bool creatingDebugServer = _config.DebugServiceTransport != null; @@ -140,6 +140,9 @@ private async Task CreateEditorServicesAndRunUntilShutdown() return; } + _logger.Log(PsesLogLevel.Information, "PSES Startup Completed. Starting Language Server."); + _logger.Log(PsesLogLevel.Information, "Please check the LSP log file in your client for further messages. In VSCode, this is the 'PowerShell' output pane"); + // We want LSP and maybe debugging // To do that we: // - Create the LSP server @@ -149,7 +152,6 @@ private async Task CreateEditorServicesAndRunUntilShutdown() // - Wait for the LSP server to finish // Unsubscribe the host logger here so that the Extension Terminal is not polluted with input after the first prompt - _logger.Log(PsesLogLevel.Debug, "Starting server, deregistering host logger and registering shutdown listener"); if (_loggersToUnsubscribe != null) { foreach (IDisposable loggerToUnsubscribe in _loggersToUnsubscribe) @@ -193,7 +195,7 @@ private async Task CreateEditorServicesAndRunUntilShutdown() private async Task RunTempDebugSessionAsync(HostStartupInfo hostDetails) { - _logger.Log(PsesLogLevel.Trace, "Running temp debug session"); + _logger.Log(PsesLogLevel.Information, "Starting temporary debug session"); PsesDebugServer debugServer = await CreateDebugServerForTempSessionAsync(hostDetails).ConfigureAwait(false); _logger.Log(PsesLogLevel.Debug, "Debug server created"); await debugServer.StartAsync().ConfigureAwait(false); @@ -222,35 +224,35 @@ private async Task StartDebugServer(Task debugServerCreation) private Task RestartDebugServerAsync(PsesDebugServer debugServer) { - _logger.Log(PsesLogLevel.Trace, "Restarting debug server"); + _logger.Log(PsesLogLevel.Debug, "Restarting debug server"); Task debugServerCreation = RecreateDebugServerAsync(debugServer); return StartDebugServer(debugServerCreation); } private async Task CreateLanguageServerAsync(HostStartupInfo hostDetails) { - _logger.Log(PsesLogLevel.Debug, $"Creating LSP transport with endpoint {_config.LanguageServiceTransport.EndpointDetails}"); + _logger.Log(PsesLogLevel.Trace, $"Creating LSP transport with endpoint {_config.LanguageServiceTransport.EndpointDetails}"); (Stream inStream, Stream outStream) = await _config.LanguageServiceTransport.ConnectStreamsAsync().ConfigureAwait(false); - _logger.Log(PsesLogLevel.Trace, "Creating language server"); + _logger.Log(PsesLogLevel.Debug, "Creating language server"); return _serverFactory.CreateLanguageServer(inStream, outStream, hostDetails); } private async Task CreateDebugServerWithLanguageServerAsync(PsesLanguageServer languageServer) { - _logger.Log(PsesLogLevel.Debug, $"Creating debug adapter transport with endpoint {_config.DebugServiceTransport.EndpointDetails}"); + _logger.Log(PsesLogLevel.Trace, $"Creating debug adapter transport with endpoint {_config.DebugServiceTransport.EndpointDetails}"); (Stream inStream, Stream outStream) = await _config.DebugServiceTransport.ConnectStreamsAsync().ConfigureAwait(false); - _logger.Log(PsesLogLevel.Trace, "Creating debug adapter"); + _logger.Log(PsesLogLevel.Debug, "Creating debug adapter"); return _serverFactory.CreateDebugServerWithLanguageServer(inStream, outStream, languageServer); } private async Task RecreateDebugServerAsync(PsesDebugServer debugServer) { - _logger.Log(PsesLogLevel.Trace, "Recreating debug adapter transport"); + _logger.Log(PsesLogLevel.Debug, "Recreating debug adapter transport"); (Stream inStream, Stream outStream) = await _config.DebugServiceTransport.ConnectStreamsAsync().ConfigureAwait(false); - _logger.Log(PsesLogLevel.Trace, "Recreating debug adapter"); + _logger.Log(PsesLogLevel.Debug, "Recreating debug adapter"); return _serverFactory.RecreateDebugServer(inStream, outStream, debugServer); } @@ -263,7 +265,7 @@ private async Task CreateDebugServerForTempSessionAsync(HostSta private HostStartupInfo CreateHostStartupInfo() { - _logger.Log(PsesLogLevel.Trace, "Creating startup info object"); + _logger.Log(PsesLogLevel.Debug, "Creating startup info object"); ProfilePathInfo profilePaths = null; if (_config.ProfilePaths.AllUsersAllHosts != null From 160a903ddd7f9bf41f21b99ed36150ebbb80c72c Mon Sep 17 00:00:00 2001 From: Justin Grote Date: Thu, 14 Nov 2024 18:52:42 -0800 Subject: [PATCH 58/88] Some more logging Levels and cleanup --- .../Configuration/HostLogger.cs | 8 +++----- .../EditorServicesLoader.cs | 12 ++++++------ 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/PowerShellEditorServices.Hosting/Configuration/HostLogger.cs b/src/PowerShellEditorServices.Hosting/Configuration/HostLogger.cs index 9fa239bfe..bebb7e2b9 100644 --- a/src/PowerShellEditorServices.Hosting/Configuration/HostLogger.cs +++ b/src/PowerShellEditorServices.Hosting/Configuration/HostLogger.cs @@ -229,25 +229,23 @@ public void OnNext((PsesLogLevel logLevel, string message) value) switch (logLevel) { case PsesLogLevel.Trace: + ui.WriteDebugLine("[Trace] " + message); + break; case PsesLogLevel.Debug: ui.WriteDebugLine(message); break; - case PsesLogLevel.Information: ui.WriteVerboseLine(message); break; - case PsesLogLevel.Warning: ui.WriteWarningLine(message); break; - case PsesLogLevel.Error: case PsesLogLevel.Critical: ui.WriteErrorLine(message); break; - default: - ui.WriteLine(message); + ui.WriteDebugLine("UNKNOWN:" + message); break; } } diff --git a/src/PowerShellEditorServices.Hosting/EditorServicesLoader.cs b/src/PowerShellEditorServices.Hosting/EditorServicesLoader.cs index eb52eaf2d..eea23353c 100644 --- a/src/PowerShellEditorServices.Hosting/EditorServicesLoader.cs +++ b/src/PowerShellEditorServices.Hosting/EditorServicesLoader.cs @@ -212,10 +212,10 @@ public Task LoadAndRunEditorServicesAsync() ValidateConfiguration(); // Method with no implementation that forces the PSES assembly to load, triggering an AssemblyResolve event - _logger.Log(PsesLogLevel.Information, "Loading PowerShell Editor Services"); + _logger.Log(PsesLogLevel.Information, "Loading PowerShell Editor Services Assemblies"); LoadEditorServices(); - _logger.Log(PsesLogLevel.Information, "Starting EditorServices"); + _logger.Log(PsesLogLevel.Information, "Starting PowerShell Editor Services"); _editorServicesRunner = new EditorServicesRunner(_logger, _hostConfig, _sessionFileWriter, _loggersToUnsubscribe); @@ -242,7 +242,7 @@ private void CheckPowerShellVersion() { PSLanguageMode languageMode = Runspace.DefaultRunspace.SessionStateProxy.LanguageMode; - _logger.Log(PsesLogLevel.Debug, $@" + _logger.Log(PsesLogLevel.Trace, $@" == PowerShell Details == - PowerShell version: {_powerShellVersion} - Language mode: {languageMode} @@ -295,12 +295,12 @@ private void UpdatePSModulePath() } psModulePath = $"{psModulePath}{Path.PathSeparator}{_hostConfig.BundledModulePath}"; Environment.SetEnvironmentVariable("PSModulePath", psModulePath); - _logger.Log(PsesLogLevel.Debug, $"Updated PSModulePath to: '{psModulePath}'"); + _logger.Log(PsesLogLevel.Trace, $"Updated PSModulePath to: '{psModulePath}'"); } private void LogHostInformation() { - _logger.Log(PsesLogLevel.Debug, $"PID: {System.Diagnostics.Process.GetCurrentProcess().Id}"); + _logger.Log(PsesLogLevel.Trace, $"PID: {System.Diagnostics.Process.GetCurrentProcess().Id}"); _logger.Log(PsesLogLevel.Debug, $@" == Build Details == @@ -359,7 +359,7 @@ private static string GetPSOutputEncoding() [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "CA2208:Instantiate argument exceptions correctly", Justification = "Checking user-defined configuration")] private void ValidateConfiguration() { - _logger.Log(PsesLogLevel.Trace, "Validating configuration"); + _logger.Log(PsesLogLevel.Debug, "Validating configuration"); bool lspUsesStdio = _hostConfig.LanguageServiceTransport is StdioTransportConfig; bool debugUsesStdio = _hostConfig.DebugServiceTransport is StdioTransportConfig; From 3585f0008c6f3bfbc1958f51dcd9a3012e8174ff Mon Sep 17 00:00:00 2001 From: Justin Grote Date: Thu, 14 Nov 2024 20:04:34 -0800 Subject: [PATCH 59/88] Wire up loglevels in-band due to LSP bug --- .../Logging/LanguageServerLogger.cs | 95 ++++++++++++------- .../Server/PsesLanguageServer.cs | 2 +- 2 files changed, 62 insertions(+), 35 deletions(-) diff --git a/src/PowerShellEditorServices/Logging/LanguageServerLogger.cs b/src/PowerShellEditorServices/Logging/LanguageServerLogger.cs index 99d628d10..e9d9a06e2 100644 --- a/src/PowerShellEditorServices/Logging/LanguageServerLogger.cs +++ b/src/PowerShellEditorServices/Logging/LanguageServerLogger.cs @@ -26,11 +26,15 @@ public void Log( Func formatter ) { + if (responseRouter is null) + { + throw new InvalidOperationException("Log received without a valid responseRouter dependency. This is a bug, please report it."); + } // Any Omnisharp or trace logs are directly LSP protocol related and we send them to the trace channel // TODO: Dynamically adjust if SetTrace is reported - // BUG: There is an omnisharp filter incorrectly filtering this. As a workaround we will use logMessage. + // BUG: There is an omnisharp filter incorrectly filtering this. As a workaround we will use logMessage for now. // https://github.com/OmniSharp/csharp-language-server-protocol/issues/1390 - // if (categoryName.StartsWith("OmniSharp") || logLevel == LogLevel.Trace) + // // { // // Everything with omnisharp goes directly to trace // string eventMessage = string.Empty; @@ -47,22 +51,54 @@ public void Log( // }; // responseRouter.Client.LogTrace(trace); // } - if (TryGetMessageType(logLevel, out MessageType messageType)) + + // Drop all omnisharp messages to trace. This isn't a MEL filter because it's specific only to this provider. + if (categoryName.StartsWith("OmniSharp.", StringComparison.OrdinalIgnoreCase)) + { + logLevel = LogLevel.Trace; + } + + (MessageType messageType, string messagePrepend) = GetMessageInfo(logLevel); + + // The vscode-languageserver-node client doesn't support LogOutputChannel as of 2024-11-24 and also doesn't + // provide a way to middleware the incoming log messages, so our output channel has no idea what the logLevel + // is. As a workaround, we send the severity in-line with the message for the client to parse. + // BUG: https://github.com/microsoft/vscode-languageserver-node/issues/1116 + if (responseRouter.Client?.ClientSettings?.ClientInfo?.Name == "Visual Studio Code") { - LogMessageParams logMessage = new() + messagePrepend = logLevel switch { - Type = messageType, - // TODO: Add Critical and Debug delineations - Message = categoryName + ": " + formatter(state, exception) + - (exception != null ? " - " + exception : "") + " | " + - //Hopefully this isn't too expensive in the long run - FormatState(state, exception) + LogLevel.Critical => " CRITICAL: ", + LogLevel.Error => "", + LogLevel.Warning => "", + LogLevel.Information => "", + LogLevel.Debug => "", + LogLevel.Trace => "", + _ => string.Empty }; - responseRouter.Window.Log(logMessage); } - } + LogMessageParams logMessage = new() + { + Type = messageType, + Message = messagePrepend + categoryName + ": " + formatter(state, exception) + + (exception != null ? " - " + exception : "") + " | " + + //Hopefully this isn't too expensive in the long run + FormatState(state, exception) + }; + responseRouter.Window.Log(logMessage); + } + /// + /// Formats the state object into a string for logging. + /// + /// + /// This is copied from Omnisharp, we can probably do better. + /// + /// + /// + /// + /// private static string FormatState(TState state, Exception? exception) { return state switch @@ -72,29 +108,20 @@ private static string FormatState(TState state, Exception? exception) }; } - private static bool TryGetMessageType(LogLevel logLevel, out MessageType messageType) - { - switch (logLevel) + /// + /// Maps MEL log levels to LSP message types + /// + private static (MessageType messageType, string messagePrepend) GetMessageInfo(LogLevel logLevel) + => logLevel switch { - case LogLevel.Critical: - case LogLevel.Error: - messageType = MessageType.Error; - return true; - case LogLevel.Warning: - messageType = MessageType.Warning; - return true; - case LogLevel.Information: - messageType = MessageType.Info; - return true; - case LogLevel.Debug: - case LogLevel.Trace: - messageType = MessageType.Log; - return true; - } - - messageType = MessageType.Log; - return false; - } + LogLevel.Critical => (MessageType.Error, "Critical: "), + LogLevel.Error => (MessageType.Error, string.Empty), + LogLevel.Warning => (MessageType.Warning, string.Empty), + LogLevel.Information => (MessageType.Info, string.Empty), + LogLevel.Debug => (MessageType.Log, string.Empty), + LogLevel.Trace => (MessageType.Log, "Trace: "), + _ => throw new ArgumentOutOfRangeException(nameof(logLevel), logLevel, null) + }; } internal class LanguageServerLoggerProvider(ILanguageServerFacade languageServer) : ILoggerProvider diff --git a/src/PowerShellEditorServices/Server/PsesLanguageServer.cs b/src/PowerShellEditorServices/Server/PsesLanguageServer.cs index b2195cae5..c106d34c6 100644 --- a/src/PowerShellEditorServices/Server/PsesLanguageServer.cs +++ b/src/PowerShellEditorServices/Server/PsesLanguageServer.cs @@ -89,7 +89,7 @@ public async Task StartAsync() }) .ConfigureLogging(builder => builder .ClearProviders() - .AddLanguageProtocolLogging() + .AddPsesLanguageServerLogging() .SetMinimumLevel(_minimumLogLevel)) .WithHandler() .WithHandler() From 9ce8911e21c4822d64bc54838d30bdc77e3c682b Mon Sep 17 00:00:00 2001 From: Justin Grote Date: Thu, 14 Nov 2024 22:17:39 -0800 Subject: [PATCH 60/88] Fix bug with Info getting extra logs on the vscode LSP client side --- .../Logging/LanguageServerLogger.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/PowerShellEditorServices/Logging/LanguageServerLogger.cs b/src/PowerShellEditorServices/Logging/LanguageServerLogger.cs index e9d9a06e2..0b22ddd95 100644 --- a/src/PowerShellEditorServices/Logging/LanguageServerLogger.cs +++ b/src/PowerShellEditorServices/Logging/LanguageServerLogger.cs @@ -68,7 +68,7 @@ public void Log( { messagePrepend = logLevel switch { - LogLevel.Critical => " CRITICAL: ", + LogLevel.Critical => "CRITICAL: ", LogLevel.Error => "", LogLevel.Warning => "", LogLevel.Information => "", @@ -76,6 +76,12 @@ public void Log( LogLevel.Trace => "", _ => string.Empty }; + + // The vscode formatter prepends some extra stuff to Info specifically, so we drop Info to Log, but it will get logged correctly on the other side thanks to our inline indicator that our custom parser on the other side will pick up and process. + if (messageType == MessageType.Info) + { + messageType = MessageType.Log; + } } LogMessageParams logMessage = new() From 671cb37ef9ea7df6db62139206d75ace29549190 Mon Sep 17 00:00:00 2001 From: Justin Grote Date: Mon, 18 Nov 2024 11:08:18 -0700 Subject: [PATCH 61/88] Docs: Add PowerShell Support Statement --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 440150dce..8f91f84f4 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,12 @@ The functionality in PowerShell Editor Services is available in the following ed Please note that other than PowerShell for Visual Studio Code, these clients are community maintained and may be very out of date. It is recommended that you simply use an LSP plugin for your editor and configure it as demonstrated [below](#Usage). +## Supported PowerShell Versions + +PSES runs as a PowerShell Module in [currently supported versions of PowerShell 7+](https://learn.microsoft.com/en-us/powershell/scripting/install/powershell-support-lifecycle). + +Windows PowerShell 5.1 is supported on a best-effort basis. + ## Features - The Language Service provides common editor features for the PowerShell language: From c960bf987d0e65c7ec4644f9738b85cb43cac578 Mon Sep 17 00:00:00 2001 From: Justin Grote Date: Mon, 18 Nov 2024 11:17:15 -0700 Subject: [PATCH 62/88] Docs: Clarify Azure Data Studio and outside support --- README.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8f91f84f4..21ffbc9d1 100644 --- a/README.md +++ b/README.md @@ -10,16 +10,21 @@ experience in almost any editor or integrated development environment (IDE). ## [Language Server Protocol](https://microsoft.github.io/language-server-protocol/) clients using PowerShell Editor Services: +- [PowerShell for Visual Studio Code](https://github.com/PowerShell/vscode-powershell) +> [!NOTE] +> PowerShell for Azure Data Studio will no longer be updated or maintained. + +> [!WARNING] +> Other than PowerShell for Visual Studio Code, these clients are community maintained and may be very out of date. +It is recommended to use a generic [LSP plugin](#Usage) with your client if possible. The functionality in PowerShell Editor Services is available in the following editor extensions: -- [PowerShell for Visual Studio Code](https://github.com/PowerShell/vscode-powershell), also available in Azure Data Studio - [lsp-pwsh](https://github.com/emacs-lsp/lsp-mode/blob/master/clients/lsp-pwsh.el), an Emacs PowerShell plugin - [intellij-powershell](https://github.com/ant-druha/intellij-powershell), adds PowerShell language support to IntelliJ-based IDEs - [coc-powershell](https://github.com/yatli/coc-powershell), a Vim and Neovim plugin - [powershell.nvim](https://github.com/TheLeoP/powershell.nvim) a Neovim plugin -Please note that other than PowerShell for Visual Studio Code, these clients are community maintained and may be very out of date. -It is recommended that you simply use an LSP plugin for your editor and configure it as demonstrated [below](#Usage). + ## Supported PowerShell Versions @@ -152,7 +157,8 @@ The types of PowerShell Editor Services can change at any moment and should not ## Development -> NOTE: The easiest way to manually test changes you've made in PowerShellEditorServices is to follow the [vscode-powershell development doc](https://github.com/PowerShell/vscode-powershell/blob/main/docs/development.md) to get a local build of the VS Code extension to use your local build of PowerShellEditorServices. +> [!TIP] +> The easiest way to manually test changes you've made in PowerShellEditorServices is to follow the [vscode-powershell development doc](https://github.com/PowerShell/vscode-powershell/blob/main/docs/development.md). ### 1. Install PowerShell 7+ From 5d2c45693cffb42cb4c0c796115fe28262dfa1c8 Mon Sep 17 00:00:00 2001 From: Justin Grote Date: Mon, 18 Nov 2024 11:23:28 -0700 Subject: [PATCH 63/88] Docs: Clarify LSP client support --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 21ffbc9d1..46c126336 100644 --- a/README.md +++ b/README.md @@ -14,18 +14,16 @@ experience in almost any editor or integrated development environment (IDE). > [!NOTE] > PowerShell for Azure Data Studio will no longer be updated or maintained. +The functionality in PowerShell Editor Services is available in the following editor extensions: > [!WARNING] -> Other than PowerShell for Visual Studio Code, these clients are community maintained and may be very out of date. +> These clients are community maintained and may be very out of date. It is recommended to use a generic [LSP plugin](#Usage) with your client if possible. -The functionality in PowerShell Editor Services is available in the following editor extensions: - [lsp-pwsh](https://github.com/emacs-lsp/lsp-mode/blob/master/clients/lsp-pwsh.el), an Emacs PowerShell plugin - [intellij-powershell](https://github.com/ant-druha/intellij-powershell), adds PowerShell language support to IntelliJ-based IDEs - [coc-powershell](https://github.com/yatli/coc-powershell), a Vim and Neovim plugin - [powershell.nvim](https://github.com/TheLeoP/powershell.nvim) a Neovim plugin - - ## Supported PowerShell Versions PSES runs as a PowerShell Module in [currently supported versions of PowerShell 7+](https://learn.microsoft.com/en-us/powershell/scripting/install/powershell-support-lifecycle). From 20fa478dcd61bf75c84fe69f2f3f17ea4233d2e0 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Mon, 18 Nov 2024 09:40:15 -0800 Subject: [PATCH 64/88] Switch OneBranch pipeline to only build and not test Primarily this is because the end-to-end tests currently hang only on OneBranch because the image still only has end-of-life PowerShell 7.3, which we've dropped support for. But we need to do a release. All the CI tests run on GitHub where we do our actual development and their images are up-to-date so it all passes. --- .pipelines/PowerShellEditorServices-Official.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pipelines/PowerShellEditorServices-Official.yml b/.pipelines/PowerShellEditorServices-Official.yml index 729b95e10..c07eab61a 100644 --- a/.pipelines/PowerShellEditorServices-Official.yml +++ b/.pipelines/PowerShellEditorServices-Official.yml @@ -93,7 +93,7 @@ extends: Install-Module -Repository CFS -Name Microsoft.PowerShell.PSResourceGet ./tools/installPSResources.ps1 -PSRepository CFS displayName: Install PSResources - - pwsh: Invoke-Build TestFull -Configuration $(BuildConfiguration) -PSRepository CFS + - pwsh: Invoke-Build Build -Configuration $(BuildConfiguration) -PSRepository CFS displayName: Build and test - task: PublishTestResults@2 displayName: Publish test results From fec1f3a97c068b072427a4116b7394e6d8f5a76b Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Mon, 18 Nov 2024 11:04:16 -0800 Subject: [PATCH 65/88] v4.0.0: Drop support for PowerShell <7.4 and logging overhaul PowerShell 7.2 LTS and 7.3 are now past end-of-support and are now unsupported. This is an incompatible API change so we're bumping the major version. Please update to PowerShell 7.4 LTS going forward. This release contains a logging overhaul which purposely removes our dependency on Serilog and should lead to improved stability with PowerShell 5.1 (by avoiding a major GAC assembly conflict). --- CHANGELOG.md | 15 +++++++++++++++ PowerShellEditorServices.Common.props | 2 +- .../PowerShellEditorServices.psd1 | 2 +- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b44fa94b7..f94a43aca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # PowerShell Editor Services Release History +## v4.0.0 +### Monday, November 18, 2024 + +See more details at the GitHub Release for [v4.0.0](https://github.com/PowerShell/PowerShellEditorServices/releases/tag/v4.0.0). + +Drop support for PowerShell <7.4 and logging overhaul + +PowerShell 7.2 LTS and 7.3 are now past end-of-support and are now unsupported. +This is an incompatible API change so we're bumping the major version. +Please update to PowerShell 7.4 LTS going forward. + +This release contains a logging overhaul which purposely removes our +dependency on Serilog and should lead to improved stability with +PowerShell 5.1 (by avoiding a major GAC assembly conflict). + ## v3.21.0 ### Wednesday, October 30, 2024 diff --git a/PowerShellEditorServices.Common.props b/PowerShellEditorServices.Common.props index cc0dc7531..1bc5e8f5c 100644 --- a/PowerShellEditorServices.Common.props +++ b/PowerShellEditorServices.Common.props @@ -1,6 +1,6 @@ - 3.21.0 + 4.0.0 Microsoft © Microsoft Corporation. diff --git a/module/PowerShellEditorServices/PowerShellEditorServices.psd1 b/module/PowerShellEditorServices/PowerShellEditorServices.psd1 index 02e3385b6..f93cdb035 100644 --- a/module/PowerShellEditorServices/PowerShellEditorServices.psd1 +++ b/module/PowerShellEditorServices/PowerShellEditorServices.psd1 @@ -19,7 +19,7 @@ RootModule = if ($PSEdition -eq 'Core') } # Version number of this module. -ModuleVersion = '3.21.0' +ModuleVersion = '4.0.0' # ID used to uniquely identify this module GUID = '9ca15887-53a2-479a-9cda-48d26bcb6c47' From 42d13997e346de4601a08b7ab04a5207656ae1dd Mon Sep 17 00:00:00 2001 From: Justin Grote Date: Mon, 18 Nov 2024 00:17:51 -0700 Subject: [PATCH 66/88] Add BuildIfChanged Task and Dev Instructions --- PowerShellEditorServices.build.ps1 | 69 +++++++++++++++++++----------- README.md | 26 +++++------ 2 files changed, 57 insertions(+), 38 deletions(-) diff --git a/PowerShellEditorServices.build.ps1 b/PowerShellEditorServices.build.ps1 index 5002127b2..ec2f4e1fa 100644 --- a/PowerShellEditorServices.build.ps1 +++ b/PowerShellEditorServices.build.ps1 @@ -125,18 +125,20 @@ task RestorePsesModules -If (-not (Test-Path "module/PSReadLine") -or -not (Test } Task Build FindDotNet, CreateBuildInfo, RestorePsesModules, { - Write-Build DarkGreen "Building PowerShellEditorServices" + Write-Build DarkGreen 'Building PowerShellEditorServices' Invoke-BuildExec { & dotnet publish $script:dotnetBuildArgs ./src/PowerShellEditorServices/PowerShellEditorServices.csproj -f $script:NetFramework.Standard } Invoke-BuildExec { & dotnet publish $script:dotnetBuildArgs ./src/PowerShellEditorServices.Hosting/PowerShellEditorServices.Hosting.csproj -f $script:NetFramework.PS74 } if (-not $script:IsNix) { Invoke-BuildExec { & dotnet publish $script:dotnetBuildArgs ./src/PowerShellEditorServices.Hosting/PowerShellEditorServices.Hosting.csproj -f $script:NetFramework.PS51 } } +} -If { + $Null -eq $script:ChangesDetected -or $true -eq $script:ChangesDetected } Task AssembleModule -After Build { - Write-Build DarkGreen "Assembling PowerShellEditorServices module" - $psesOutputPath = "./module/PowerShellEditorServices" + Write-Build DarkGreen 'Assembling PowerShellEditorServices module' + $psesOutputPath = './module/PowerShellEditorServices' $psesBinOutputPath = "$psesOutputPath/bin" $psesDepsPath = "$psesBinOutputPath/Common" $psesCoreHostPath = "$psesBinOutputPath/Core" @@ -147,8 +149,8 @@ Task AssembleModule -After Build { } # Copy documents to module root - foreach ($document in @("LICENSE", "NOTICE.txt", "README.md", "SECURITY.md")) { - Copy-Item -Force -Path $document -Destination "./module" + foreach ($document in @('LICENSE', 'NOTICE.txt', 'README.md', 'SECURITY.md')) { + Copy-Item -Force -Path $document -Destination './module' } # Assemble PSES module @@ -186,13 +188,13 @@ Task AssembleModule -After Build { } Task BuildCmdletHelp -After AssembleModule { - Write-Build DarkGreen "Building cmdlet help" + Write-Build DarkGreen 'Building cmdlet help' New-ExternalHelp -Path ./module/docs -OutputPath ./module/PowerShellEditorServices/Commands/en-US -Force } Task SetupHelpForTests { - Write-Build DarkMagenta "Updating help (for tests)" - Update-Help -Module Microsoft.PowerShell.Management,Microsoft.PowerShell.Utility -Force -Scope CurrentUser -UICulture en-US + Write-Build DarkMagenta 'Updating help (for tests)' + Update-Help -Module Microsoft.PowerShell.Management, Microsoft.PowerShell.Utility -Force -Scope CurrentUser -UICulture en-US } Task TestPS74 Build, SetupHelpForTests, { @@ -210,7 +212,7 @@ Task TestPS51 -If (-not $script:IsNix) Build, SetupHelpForTests, { # TODO: See https://github.com/PowerShell/vscode-powershell/issues/3886 # Inheriting the module path for powershell.exe breaks things! $originalModulePath = $env:PSModulePath - $env:PSModulePath = "" + $env:PSModulePath = '' Invoke-BuildExec { & dotnet $script:dotnetTestArgs $script:NetFramework.PS51 } } finally { $env:PSModulePath = $originalModulePath @@ -221,7 +223,7 @@ Task TestPS51 -If (-not $script:IsNix) Build, SetupHelpForTests, { # should just be the latest supported framework. Task TestE2EPwsh Build, SetupHelpForTests, { Set-Location ./test/PowerShellEditorServices.Test.E2E/ - $env:PWSH_EXE_NAME = "pwsh" + $env:PWSH_EXE_NAME = 'pwsh' Invoke-BuildExec { & dotnet $script:dotnetTestArgs $script:NetFramework.PS74 } } @@ -240,12 +242,12 @@ Task TestE2EDaily -If (Test-Path $PwshDaily) Build, SetupHelpForTests, { Task TestE2EPowerShell -If (-not $script:IsNix) Build, SetupHelpForTests, { Set-Location ./test/PowerShellEditorServices.Test.E2E/ - $env:PWSH_EXE_NAME = "powershell" + $env:PWSH_EXE_NAME = 'powershell' try { # TODO: See https://github.com/PowerShell/vscode-powershell/issues/3886 # Inheriting the module path for powershell.exe breaks things! $originalModulePath = $env:PSModulePath - $env:PSModulePath = "" + $env:PSModulePath = '' Invoke-BuildExec { & dotnet $script:dotnetTestArgs $script:NetFramework.PS74 } } finally { $env:PSModulePath = $originalModulePath @@ -254,45 +256,62 @@ Task TestE2EPowerShell -If (-not $script:IsNix) Build, SetupHelpForTests, { Task TestE2EPwshCLM -If (-not $script:IsNix) Build, SetupHelpForTests, { Set-Location ./test/PowerShellEditorServices.Test.E2E/ - $env:PWSH_EXE_NAME = "pwsh" + $env:PWSH_EXE_NAME = 'pwsh' - if (-not [Security.Principal.WindowsIdentity]::GetCurrent().Owner.IsWellKnown("BuiltInAdministratorsSid")) { - Write-Build DarkRed "Skipping Constrained Language Mode tests as they must be ran in an elevated process" + if (-not [Security.Principal.WindowsIdentity]::GetCurrent().Owner.IsWellKnown('BuiltInAdministratorsSid')) { + Write-Build DarkRed 'Skipping Constrained Language Mode tests as they must be ran in an elevated process' return } try { - Write-Build DarkGreen "Running end-to-end tests in Constrained Language Mode" - [System.Environment]::SetEnvironmentVariable("__PSLockdownPolicy", "0x80000007", [System.EnvironmentVariableTarget]::Machine) + Write-Build DarkGreen 'Running end-to-end tests in Constrained Language Mode' + [System.Environment]::SetEnvironmentVariable('__PSLockdownPolicy', '0x80000007', [System.EnvironmentVariableTarget]::Machine) Invoke-BuildExec { & dotnet $script:dotnetTestArgs $script:NetFramework.PS74 } } finally { - [System.Environment]::SetEnvironmentVariable("__PSLockdownPolicy", $null, [System.EnvironmentVariableTarget]::Machine) + [System.Environment]::SetEnvironmentVariable('__PSLockdownPolicy', $null, [System.EnvironmentVariableTarget]::Machine) } } Task TestE2EPowerShellCLM -If (-not $script:IsNix) Build, SetupHelpForTests, { Set-Location ./test/PowerShellEditorServices.Test.E2E/ - $env:PWSH_EXE_NAME = "powershell" + $env:PWSH_EXE_NAME = 'powershell' - if (-not [Security.Principal.WindowsIdentity]::GetCurrent().Owner.IsWellKnown("BuiltInAdministratorsSid")) { - Write-Build DarkRed "Skipping Constrained Language Mode tests as they must be ran in an elevated process" + if (-not [Security.Principal.WindowsIdentity]::GetCurrent().Owner.IsWellKnown('BuiltInAdministratorsSid')) { + Write-Build DarkRed 'Skipping Constrained Language Mode tests as they must be ran in an elevated process' return } try { - Write-Build DarkGreen "Running end-to-end tests in Constrained Language Mode" - [System.Environment]::SetEnvironmentVariable("__PSLockdownPolicy", "0x80000007", [System.EnvironmentVariableTarget]::Machine) + Write-Build DarkGreen 'Running end-to-end tests in Constrained Language Mode' + [System.Environment]::SetEnvironmentVariable('__PSLockdownPolicy', '0x80000007', [System.EnvironmentVariableTarget]::Machine) # TODO: See https://github.com/PowerShell/vscode-powershell/issues/3886 # Inheriting the module path for powershell.exe breaks things! $originalModulePath = $env:PSModulePath - $env:PSModulePath = "" + $env:PSModulePath = '' Invoke-BuildExec { & dotnet $script:dotnetTestArgs $script:NetFramework.PS74 } } finally { - [System.Environment]::SetEnvironmentVariable("__PSLockdownPolicy", $null, [System.EnvironmentVariableTarget]::Machine) + [System.Environment]::SetEnvironmentVariable('__PSLockdownPolicy', $null, [System.EnvironmentVariableTarget]::Machine) $env:PSModulePath = $originalModulePath } } +Task BuildIfChanged.Init -Before BuildIfChanged { + [bool]$script:ChangesDetected = $false +} + +Task BuildIfChanged -Inputs { + $slash = [IO.Path]::DirectorySeparatorChar + Get-ChildItem ./src -Filter '*.cs' -Recurse + | Where-Object FullName -NotLike ('*' + $slash + 'obj' + $slash + '*') + | Where-Object FullName -NotLike ('*' + $slash + 'bin' + $slash + '*') +} -Outputs { + './src/PowerShellEditorServices/bin/Debug/netstandard2.0/Microsoft.PowerShell.EditorServices.dll' + './src/PowerShellEditorServices.Hosting/bin/Debug/net8.0/Microsoft.PowerShell.EditorServices.Hosting.dll' +} -Jobs { + Write-Build DarkMagenta 'Changes detected, rebuilding' + $script:ChangesDetected = $true +}, Build + Task Test TestPS74, TestE2EPwsh, TestPS51, TestE2EPowerShell Task TestFull Test, TestE2EDaily, TestE2EPwshCLM, TestE2EPowerShellCLM diff --git a/README.md b/README.md index 46c126336..48341ab68 100644 --- a/README.md +++ b/README.md @@ -153,7 +153,7 @@ Please note that we only consider the following as stable APIs that can be relie The types of PowerShell Editor Services can change at any moment and should not be linked against in a production environment. -## Development +## Development Environment > [!TIP] > The easiest way to manually test changes you've made in PowerShellEditorServices is to follow the [vscode-powershell development doc](https://github.com/PowerShell/vscode-powershell/blob/main/docs/development.md). @@ -175,31 +175,31 @@ Install-Module InvokeBuild -Scope CurrentUser Install-Module platyPS -Scope CurrentUser ``` -### 4. Delete `NuGet.Config` +### 4. Adjust `nuget.config` if necessary -Our NuGet configuration points to a private feed necessary for secure builds, -and it must be committed to the repo as it is. -The easiest way to build without access to that private feed is to delete the file: +Our NuGet configuration uses a secure feed with allow-listed third party dependency packages. If your contribution requires any changes to the included NuGet packages, you must disable this secure feed. + +First, run this command to prevent accidentally commiting changes to this file ```powershell -Remove-Item NuGet.Config +git update-index --skip-worktree nuget.config ``` -Please be careful not to commit this change in a PR. +Then, either delete the file or remove the `packagesources` section to use nuget.org again. Your PR _will_ fail automated build checks and you _must_ inform us at the top of your PR so the appropriate packages can be added if approved. -Now you're ready to build the code. -You can do so in one of two ways: +## Build PowerShell Editor Services +Now you're ready to build the code. You can do so in one of two ways: -### Building the code from PowerShell +### PowerShell ```powershell -PS C:\path\to\PowerShellEditorServices> Invoke-Build Build +PS C:\src\PowerShellEditorServices> Invoke-Build ``` -### Building the code from Visual Studio Code +### Visual Studio Code Open the PowerShellEditorServices folder that you cloned locally and press Ctrl+Shift+B -(or Cmd+Shift+B on macOS). +(or Cmd+Shift+B on macOS) which will run the default build task. ## Code of Conduct From a5aaad8528f64d673283d52fcb714053efdadc7f Mon Sep 17 00:00:00 2001 From: Justin Grote Date: Tue, 3 Dec 2024 14:41:37 -0800 Subject: [PATCH 67/88] Add Breakpoint Label frame to optimize debug stepping performance (#2190) * Add Breakpoint label frame to optimize debug stepping performance * Incorporate PR Review Feedback * Add Tests Co-authored-by: Patrick Meinecke --- .../Server/PsesDebugServer.cs | 1 + .../Services/DebugAdapter/DebugService.cs | 65 +------- .../DebugAdapter/Handlers/ScopesHandler.cs | 21 ++- .../Handlers/StackTraceHandler.cs | 147 +++++++++++++----- .../Utility/LspDebugUtils.cs | 32 ---- .../DebugAdapterProtocolMessageTests.cs | 120 ++++++++++++-- 6 files changed, 241 insertions(+), 145 deletions(-) diff --git a/src/PowerShellEditorServices/Server/PsesDebugServer.cs b/src/PowerShellEditorServices/Server/PsesDebugServer.cs index 31f6a988f..6fbecce9c 100644 --- a/src/PowerShellEditorServices/Server/PsesDebugServer.cs +++ b/src/PowerShellEditorServices/Server/PsesDebugServer.cs @@ -117,6 +117,7 @@ public async Task StartAsync() response.SupportsHitConditionalBreakpoints = true; response.SupportsLogPoints = true; response.SupportsSetVariable = true; + response.SupportsDelayedStackTraceLoading = true; return Task.CompletedTask; }); diff --git a/src/PowerShellEditorServices/Services/DebugAdapter/DebugService.cs b/src/PowerShellEditorServices/Services/DebugAdapter/DebugService.cs index 667a26bdd..195d0508b 100644 --- a/src/PowerShellEditorServices/Services/DebugAdapter/DebugService.cs +++ b/src/PowerShellEditorServices/Services/DebugAdapter/DebugService.cs @@ -6,8 +6,6 @@ using System.Collections.Generic; using System.Linq; using System.Management.Automation; -using System.Management.Automation.Language; -using System.Reflection; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; @@ -50,7 +48,6 @@ internal class DebugService private VariableContainerDetails scriptScopeVariables; private VariableContainerDetails localScopeVariables; private StackFrameDetails[] stackFrameDetails; - private readonly PropertyInfo invocationTypeScriptPositionProperty; private readonly SemaphoreSlim debugInfoHandle = AsyncUtils.CreateSimpleLockingSemaphore(); #endregion @@ -75,6 +72,11 @@ internal class DebugService /// public DebuggerStoppedEventArgs CurrentDebuggerStoppedEventArgs { get; private set; } + /// + /// Returns a task that completes when script frames and variables have completed population + /// + public Task StackFramesAndVariablesFetched { get; private set; } + /// /// Tracks whether we are running Debug-Runspace in an out-of-process runspace. /// @@ -111,12 +113,6 @@ public DebugService( _debugContext.DebuggerResuming += OnDebuggerResuming; _debugContext.BreakpointUpdated += OnBreakpointUpdated; _remoteFileManager = remoteFileManager; - - invocationTypeScriptPositionProperty = - typeof(InvocationInfo) - .GetProperty( - "ScriptPosition", - BindingFlags.NonPublic | BindingFlags.Instance); } #endregion @@ -981,8 +977,8 @@ await _executionService.ExecutePSCommandAsync( } } - // Get call stack and variables. - await FetchStackFramesAndVariablesAsync(noScriptName ? localScriptPath : null).ConfigureAwait(false); + // Begin call stack and variables fetch. We don't need to block here. + StackFramesAndVariablesFetched = FetchStackFramesAndVariablesAsync(noScriptName ? localScriptPath : null); // If this is a remote connection and the debugger stopped at a line // in a script file, get the file contents @@ -996,53 +992,6 @@ await _remoteFileManager.FetchRemoteFileAsync( _psesHost.CurrentRunspace).ConfigureAwait(false); } - if (stackFrameDetails.Length > 0) - { - // Augment the top stack frame with details from the stop event - if (invocationTypeScriptPositionProperty.GetValue(e.InvocationInfo) is IScriptExtent scriptExtent) - { - StackFrameDetails targetFrame = stackFrameDetails[0]; - - // Certain context changes (like stepping into the default value expression - // of a parameter) do not create a call stack frame. In order to represent - // this context change we create a fake call stack frame. - if (!string.IsNullOrEmpty(scriptExtent.File) - && !PathUtils.IsPathEqual(scriptExtent.File, targetFrame.ScriptPath)) - { - await debugInfoHandle.WaitAsync().ConfigureAwait(false); - try - { - targetFrame = new StackFrameDetails - { - ScriptPath = scriptExtent.File, - // Just use the last frame's variables since we don't have a - // good way to get real values. - AutoVariables = targetFrame.AutoVariables, - CommandVariables = targetFrame.CommandVariables, - // Ideally we'd get a real value here but since there's no real - // call stack frame for this, we'd need to replicate a lot of - // engine code. - FunctionName = "", - }; - - StackFrameDetails[] newFrames = new StackFrameDetails[stackFrameDetails.Length + 1]; - newFrames[0] = targetFrame; - stackFrameDetails.CopyTo(newFrames, 1); - stackFrameDetails = newFrames; - } - finally - { - debugInfoHandle.Release(); - } - } - - targetFrame.StartLineNumber = scriptExtent.StartLineNumber; - targetFrame.EndLineNumber = scriptExtent.EndLineNumber; - targetFrame.StartColumnNumber = scriptExtent.StartColumnNumber; - targetFrame.EndColumnNumber = scriptExtent.EndColumnNumber; - } - } - CurrentDebuggerStoppedEventArgs = new DebuggerStoppedEventArgs( e, diff --git a/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/ScopesHandler.cs b/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/ScopesHandler.cs index 04adf185e..daa3d8e60 100644 --- a/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/ScopesHandler.cs +++ b/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/ScopesHandler.cs @@ -18,16 +18,27 @@ internal class ScopesHandler : IScopesHandler public ScopesHandler(DebugService debugService) => _debugService = debugService; + /// + /// Retrieves the variable scopes (containers) for the currently selected stack frame. Variables details are fetched via a separate request. + /// public Task Handle(ScopesArguments request, CancellationToken cancellationToken) { - VariableScope[] variableScopes = - _debugService.GetVariableScopes( - (int)request.FrameId); + // HACK: The StackTraceHandler injects an artificial label frame as the first frame as a performance optimization, so when scopes are requested by the client, we need to adjust the frame index accordingly to match the underlying PowerShell frame, so when the client clicks on the label (or hit the default breakpoint), they get variables populated from the top of the PowerShell stackframe. If the client dives deeper, we need to reflect that as well (though 90% of debug users don't actually investigate this) + // VSCode Frame 0 (Label) -> PowerShell StackFrame 0 (for convenience) + // VSCode Frame 1 (First Real PS Frame) -> Also PowerShell StackFrame 0 + // VSCode Frame 2 -> PowerShell StackFrame 1 + // VSCode Frame 3 -> PowerShell StackFrame 2 + // etc. + int powershellFrameId = request.FrameId == 0 ? 0 : (int)request.FrameId - 1; + + VariableScope[] variableScopes = _debugService.GetVariableScopes(powershellFrameId); return Task.FromResult(new ScopesResponse { - Scopes = new Container(variableScopes - .Select(LspDebugUtils.CreateScope)) + Scopes = new Container( + variableScopes + .Select(LspDebugUtils.CreateScope) + ) }); } } diff --git a/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/StackTraceHandler.cs b/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/StackTraceHandler.cs index f53e094e7..84d23a8b6 100644 --- a/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/StackTraceHandler.cs +++ b/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/StackTraceHandler.cs @@ -1,64 +1,133 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. +#nullable enable using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using System.Management.Automation; using Microsoft.PowerShell.EditorServices.Services; -using Microsoft.PowerShell.EditorServices.Services.DebugAdapter; -using Microsoft.PowerShell.EditorServices.Utility; using OmniSharp.Extensions.DebugAdapter.Protocol.Models; using OmniSharp.Extensions.DebugAdapter.Protocol.Requests; +using Microsoft.PowerShell.EditorServices.Services.DebugAdapter; +using System.Linq; +using OmniSharp.Extensions.JsonRpc; + +namespace Microsoft.PowerShell.EditorServices.Handlers; -namespace Microsoft.PowerShell.EditorServices.Handlers +internal class StackTraceHandler(DebugService debugService) : IStackTraceHandler { - internal class StackTraceHandler : IStackTraceHandler + /// + /// Because we don't know the size of the stacktrace beforehand, we will tell the client that there are more frames available, this is effectively a paging size, as the client should request this many frames after the first one. + /// + private const int INITIAL_PAGE_SIZE = 20; + + public async Task Handle(StackTraceArguments request, CancellationToken cancellationToken) { - private readonly DebugService _debugService; + if (!debugService.IsDebuggerStopped) + { + throw new RpcErrorException(0, null!, "Stacktrace was requested while we are not stopped at a breakpoint. This is a violation of the DAP protocol, and is probably a bug."); + } - public StackTraceHandler(DebugService debugService) => _debugService = debugService; + // Adapting to int to let us use LINQ, realistically if you have a stacktrace larger than this that the client is requesting, you have bigger problems... + int skip = Convert.ToInt32(request.StartFrame ?? 0); + int take = Convert.ToInt32(request.Levels ?? 0); - public async Task Handle(StackTraceArguments request, CancellationToken cancellationToken) - { - StackFrameDetails[] stackFrameDetails = await _debugService.GetStackFramesAsync(cancellationToken).ConfigureAwait(false); + // We generate a label for the breakpoint and can return that immediately if the client is supporting DelayedStackTraceLoading. + InvocationInfo invocationInfo = debugService.CurrentDebuggerStoppedEventArgs?.OriginalEvent?.InvocationInfo + ?? throw new RpcErrorException(0, null!, "InvocationInfo was not available on CurrentDebuggerStoppedEvent args. This is a bug and you should report it."); - // Handle a rare race condition where the adapter requests stack frames before they've - // begun building. - if (stackFrameDetails is null) - { - return new StackTraceResponse - { - StackFrames = Array.Empty(), - TotalFrames = 0 - }; - } - - List newStackFrames = new(); - - long startFrameIndex = request.StartFrame ?? 0; - long maxFrameCount = stackFrameDetails.Length; - - // If the number of requested levels == 0 (or null), that means get all stack frames - // after the specified startFrame index. Otherwise get all the stack frames. - long requestedFrameCount = request.Levels ?? 0; - if (requestedFrameCount > 0) - { - maxFrameCount = Math.Min(maxFrameCount, startFrameIndex + requestedFrameCount); - } + StackFrame breakpointLabel = CreateBreakpointLabel(invocationInfo); - for (long i = startFrameIndex; i < maxFrameCount; i++) + if (skip == 0 && take == 1) // This indicates the client is doing an initial fetch, so we want to return quickly to unblock the UI and wait on the remaining stack frames for the subsequent requests. + { + return new StackTraceResponse() { - // Create the new StackFrame object with an ID that can - // be referenced back to the current list of stack frames - newStackFrames.Add(LspDebugUtils.CreateStackFrame(stackFrameDetails[i], id: i)); - } + StackFrames = new StackFrame[] { breakpointLabel }, + TotalFrames = INITIAL_PAGE_SIZE //Indicate to the client that there are more frames available + }; + } + + // Wait until the stack frames and variables have been fetched. + await debugService.StackFramesAndVariablesFetched.ConfigureAwait(false); + + StackFrameDetails[] stackFrameDetails = await debugService.GetStackFramesAsync(cancellationToken) + .ConfigureAwait(false); + // Handle a rare race condition where the adapter requests stack frames before they've + // begun building. + if (stackFrameDetails is null) + { return new StackTraceResponse { - StackFrames = newStackFrames, - TotalFrames = newStackFrames.Count + StackFrames = Array.Empty(), + TotalFrames = 0 + }; + } + + List newStackFrames = new(); + if (skip == 0) + { + newStackFrames.Add(breakpointLabel); + } + + newStackFrames.AddRange( + stackFrameDetails + .Skip(skip != 0 ? skip - 1 : skip) + .Take(take != 0 ? take - 1 : take) + .Select((frame, index) => CreateStackFrame(frame, index + 1)) + ); + + return new StackTraceResponse + { + StackFrames = newStackFrames, + TotalFrames = newStackFrames.Count + }; + } + + public static StackFrame CreateStackFrame(StackFrameDetails stackFrame, long id) + { + SourcePresentationHint sourcePresentationHint = + stackFrame.IsExternalCode ? SourcePresentationHint.Deemphasize : SourcePresentationHint.Normal; + + // When debugging an interactive session, the ScriptPath is which is not a valid source file. + // We need to make sure the user can't open the file associated with this stack frame. + // It will generate a VSCode error in this case. + Source? source = null; + if (!stackFrame.ScriptPath.Contains("")) + { + source = new Source + { + Path = stackFrame.ScriptPath, + PresentationHint = sourcePresentationHint }; } + + return new StackFrame + { + Id = id, + Name = (source is not null) ? stackFrame.FunctionName : "Interactive Session", + Line = (source is not null) ? stackFrame.StartLineNumber : 0, + EndLine = stackFrame.EndLineNumber, + Column = (source is not null) ? stackFrame.StartColumnNumber : 0, + EndColumn = stackFrame.EndColumnNumber, + Source = source + }; } + + public static StackFrame CreateBreakpointLabel(InvocationInfo invocationInfo, int id = 0) => new() + { + Name = "", + Id = id, + Source = new() + { + Path = invocationInfo.ScriptName + }, + Line = invocationInfo.ScriptLineNumber, + Column = invocationInfo.OffsetInLine, + PresentationHint = StackFramePresentationHint.Label + }; + } + diff --git a/src/PowerShellEditorServices/Utility/LspDebugUtils.cs b/src/PowerShellEditorServices/Utility/LspDebugUtils.cs index 115689586..36677743c 100644 --- a/src/PowerShellEditorServices/Utility/LspDebugUtils.cs +++ b/src/PowerShellEditorServices/Utility/LspDebugUtils.cs @@ -56,38 +56,6 @@ public static Breakpoint CreateBreakpoint( }; } - public static StackFrame CreateStackFrame( - StackFrameDetails stackFrame, - long id) - { - SourcePresentationHint sourcePresentationHint = - stackFrame.IsExternalCode ? SourcePresentationHint.Deemphasize : SourcePresentationHint.Normal; - - // When debugging an interactive session, the ScriptPath is which is not a valid source file. - // We need to make sure the user can't open the file associated with this stack frame. - // It will generate a VSCode error in this case. - Source source = null; - if (!stackFrame.ScriptPath.Contains("<")) - { - source = new Source - { - Path = stackFrame.ScriptPath, - PresentationHint = sourcePresentationHint - }; - } - - return new StackFrame - { - Id = id, - Name = (source != null) ? stackFrame.FunctionName : "Interactive Session", - Line = (source != null) ? stackFrame.StartLineNumber : 0, - EndLine = stackFrame.EndLineNumber, - Column = (source != null) ? stackFrame.StartColumnNumber : 0, - EndColumn = stackFrame.EndColumnNumber, - Source = source - }; - } - public static Scope CreateScope(VariableScope scope) { return new Scope diff --git a/test/PowerShellEditorServices.Test.E2E/DebugAdapterProtocolMessageTests.cs b/test/PowerShellEditorServices.Test.E2E/DebugAdapterProtocolMessageTests.cs index a3c68eadb..bb794516f 100644 --- a/test/PowerShellEditorServices.Test.E2E/DebugAdapterProtocolMessageTests.cs +++ b/test/PowerShellEditorServices.Test.E2E/DebugAdapterProtocolMessageTests.cs @@ -2,22 +2,31 @@ // Licensed under the MIT License. using System; +using System.Diagnostics; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Logging.Debug; using OmniSharp.Extensions.DebugAdapter.Client; +using DapStackFrame = OmniSharp.Extensions.DebugAdapter.Protocol.Models.StackFrame; +using OmniSharp.Extensions.DebugAdapter.Protocol.Events; using OmniSharp.Extensions.DebugAdapter.Protocol.Models; using OmniSharp.Extensions.DebugAdapter.Protocol.Requests; +using OmniSharp.Extensions.JsonRpc.Server; using Xunit; using Xunit.Abstractions; +using Microsoft.Extensions.Logging.Abstractions; namespace PowerShellEditorServices.Test.E2E { + public class XunitOutputTraceListener(ITestOutputHelper output) : TraceListener + { + public override void Write(string message) => output.WriteLine(message); + public override void WriteLine(string message) => output.WriteLine(message); + } + [Trait("Category", "DAP")] public class DebugAdapterProtocolMessageTests : IAsyncLifetime, IDisposable { @@ -28,16 +37,26 @@ public class DebugAdapterProtocolMessageTests : IAsyncLifetime, IDisposable private DebugAdapterClient PsesDebugAdapterClient; private PsesStdioProcess _psesProcess; + /// + /// Completes when the debug adapter is started. + /// public TaskCompletionSource Started { get; } = new TaskCompletionSource(); - + /// + /// Completes when the first breakpoint is reached. + /// + public TaskCompletionSource Stopped { get; } = new TaskCompletionSource(); + + /// + /// Constructor. The ITestOutputHelper is injected by xUnit and used to write diagnostic logs. + /// + /// public DebugAdapterProtocolMessageTests(ITestOutputHelper output) => _output = output; public async Task InitializeAsync() { - LoggerFactory debugLoggerFactory = new(); - debugLoggerFactory.AddProvider(new DebugLoggerProvider()); + // NOTE: To see debug logger output, add this line to your test - _psesProcess = new PsesStdioProcess(debugLoggerFactory, true); + _psesProcess = new PsesStdioProcess(new NullLoggerFactory(), true); await _psesProcess.Start(); TaskCompletionSource initialized = new(); @@ -53,11 +72,6 @@ public async Task InitializeAsync() options .WithInput(_psesProcess.OutputStream) .WithOutput(_psesProcess.InputStream) - .ConfigureLogging(builder => - builder - .AddDebug() - .SetMinimumLevel(LogLevel.Trace) - ) // The OnStarted delegate gets run when we receive the _Initialized_ event from the server: // https://microsoft.github.io/debug-adapter-protocol/specification#Events_Initialized .OnStarted((_, _) => @@ -65,6 +79,13 @@ public async Task InitializeAsync() Started.SetResult(true); return Task.CompletedTask; }) + // We use this to create a task we can await to test debugging after a breakpoint has been received. + .OnNotification(null, (stoppedEvent, _) => + { + Console.WriteLine("StoppedEvent received"); + Stopped.SetResult(stoppedEvent); + return Task.CompletedTask; + }) // The OnInitialized delegate gets run when we first receive the _Initialize_ response: // https://microsoft.github.io/debug-adapter-protocol/specification#Requests_Initialize .OnInitialized((_, _, _, _) => @@ -263,6 +284,83 @@ public async Task CanSetBreakpointsAsync() (i) => Assert.Equal("after breakpoint", i)); } + [SkippableFact] + public async Task FailsIfStacktraceRequestedWhenNotPaused() + { + Skip.If(PsesStdioProcess.RunningInConstrainedLanguageMode, + "Breakpoints can't be set in Constrained Language Mode."); + string filePath = NewTestFile(GenerateScriptFromLoggingStatements( + "labelTestBreakpoint" + )); + // Set a breakpoint + await PsesDebugAdapterClient.SetBreakpoints( + new SetBreakpointsArguments + { + Source = new Source { Name = Path.GetFileName(filePath), Path = filePath }, + Breakpoints = new SourceBreakpoint[] { new SourceBreakpoint { Line = 1 } }, + SourceModified = false, + } + ); + + // Signal to start the script + await PsesDebugAdapterClient.RequestConfigurationDone(new ConfigurationDoneArguments()); + await PsesDebugAdapterClient.LaunchScript(filePath, Started); + + + // Get the stacktrace for the breakpoint + await Assert.ThrowsAsync(() => PsesDebugAdapterClient.RequestStackTrace( + new StackTraceArguments { } + )); + } + + [SkippableFact] + public async Task SendsInitialLabelBreakpointForPerformanceReasons() + { + Skip.If(PsesStdioProcess.RunningInConstrainedLanguageMode, + "Breakpoints can't be set in Constrained Language Mode."); + string filePath = NewTestFile(GenerateScriptFromLoggingStatements( + "before breakpoint", + "at breakpoint", + "after breakpoint" + )); + + //TODO: This is technically wrong per the spec, configDone should be completed BEFORE launching, but this is how the vscode client does it today and we really need to fix that. + await PsesDebugAdapterClient.LaunchScript(filePath, Started); + + // {"command":"setBreakpoints","arguments":{"source":{"name":"dfsdfg.ps1","path":"/Users/tyleonha/Code/PowerShell/Misc/foo/dfsdfg.ps1"},"lines":[2],"breakpoints":[{"line":2}],"sourceModified":false},"type":"request","seq":3} + SetBreakpointsResponse setBreakpointsResponse = await PsesDebugAdapterClient.SetBreakpoints(new SetBreakpointsArguments + { + Source = new Source { Name = Path.GetFileName(filePath), Path = filePath }, + Breakpoints = new SourceBreakpoint[] { new SourceBreakpoint { Line = 2 } }, + SourceModified = false, + }); + + Breakpoint breakpoint = setBreakpointsResponse.Breakpoints.First(); + Assert.True(breakpoint.Verified); + Assert.Equal(filePath, breakpoint.Source.Path, ignoreCase: s_isWindows); + Assert.Equal(2, breakpoint.Line); + + ConfigurationDoneResponse configDoneResponse = await PsesDebugAdapterClient.RequestConfigurationDone(new ConfigurationDoneArguments()); + + // FIXME: I think there is a race condition here. If you remove this, the following line Stack Trace fails because the breakpoint hasn't been hit yet. I think the whole getLog process just works long enough for ConfigurationDone to complete and for the breakpoint to be hit. + + // I've tried to do this properly by waiting for a StoppedEvent, but that doesn't seem to work, I'm probably just not wiring it up right in the handler. + Assert.NotNull(configDoneResponse); + Assert.Collection(await GetLog(), + (i) => Assert.Equal("before breakpoint", i)); + File.Delete(s_testOutputPath); + + // Get the stacktrace for the breakpoint + StackTraceResponse stackTraceResponse = await PsesDebugAdapterClient.RequestStackTrace( + new StackTraceArguments { ThreadId = 1 } + ); + DapStackFrame firstFrame = stackTraceResponse.StackFrames.First(); + Assert.Equal( + firstFrame.PresentationHint, + StackFramePresentationHint.Label + ); + } + // This is a regression test for a bug where user code causes a new synchronization context // to be created, breaking the extension. It's most evident when debugging PowerShell // scripts that use System.Windows.Forms. It required fixing both Editor Services and From a05cba05d2077de160807e42c0711bbe3e4ea50d Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Wed, 4 Dec 2024 15:12:25 -0800 Subject: [PATCH 68/88] v4.1.0: Debugger optimizations and incremental build support! --- CHANGELOG.md | 7 +++++++ PowerShellEditorServices.Common.props | 2 +- .../PowerShellEditorServices/PowerShellEditorServices.psd1 | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f94a43aca..0640253e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # PowerShell Editor Services Release History +## v4.1.0 +### Wednesday, December 04, 2024 + +See more details at the GitHub Release for [v4.1.0](https://github.com/PowerShell/PowerShellEditorServices/releases/tag/v4.1.0). + +Debugger optimizations and incremental build support! + ## v4.0.0 ### Monday, November 18, 2024 diff --git a/PowerShellEditorServices.Common.props b/PowerShellEditorServices.Common.props index 1bc5e8f5c..010fe2a8c 100644 --- a/PowerShellEditorServices.Common.props +++ b/PowerShellEditorServices.Common.props @@ -1,6 +1,6 @@ - 4.0.0 + 4.1.0 Microsoft © Microsoft Corporation. diff --git a/module/PowerShellEditorServices/PowerShellEditorServices.psd1 b/module/PowerShellEditorServices/PowerShellEditorServices.psd1 index f93cdb035..c71dc1dfe 100644 --- a/module/PowerShellEditorServices/PowerShellEditorServices.psd1 +++ b/module/PowerShellEditorServices/PowerShellEditorServices.psd1 @@ -19,7 +19,7 @@ RootModule = if ($PSEdition -eq 'Core') } # Version number of this module. -ModuleVersion = '4.0.0' +ModuleVersion = '4.1.0' # ID used to uniquely identify this module GUID = '9ca15887-53a2-479a-9cda-48d26bcb6c47' From d98ced6f3b17172f29bf73e068a79f99e7aaba5f Mon Sep 17 00:00:00 2001 From: Justin Grote Date: Tue, 3 Dec 2024 16:02:41 -0800 Subject: [PATCH 69/88] Enable Roslynator Analyzers via Nuget Package --- Directory.Packages.props | 14 +++++++++++++- .../Configuration/HostLogger.cs | 1 - .../PowerShellEditorServices.Hosting.csproj | 9 ++++++++- .../PowerShellEditorServices.csproj | 9 ++++++++- 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index d854d6c51..8af5dd2ec 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -13,6 +13,18 @@ + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + @@ -22,4 +34,4 @@ - + \ No newline at end of file diff --git a/src/PowerShellEditorServices.Hosting/Configuration/HostLogger.cs b/src/PowerShellEditorServices.Hosting/Configuration/HostLogger.cs index bebb7e2b9..1c8617341 100644 --- a/src/PowerShellEditorServices.Hosting/Configuration/HostLogger.cs +++ b/src/PowerShellEditorServices.Hosting/Configuration/HostLogger.cs @@ -214,7 +214,6 @@ public void LogException( /// The PowerShell host user interface object to log output to. internal class PSHostLogger(PSHostUserInterface ui) : IObserver<(PsesLogLevel logLevel, string message)> { - public void OnCompleted() { // No-op since there's nothing to close or dispose, diff --git a/src/PowerShellEditorServices.Hosting/PowerShellEditorServices.Hosting.csproj b/src/PowerShellEditorServices.Hosting/PowerShellEditorServices.Hosting.csproj index 7b73ff8a8..1c30a93df 100644 --- a/src/PowerShellEditorServices.Hosting/PowerShellEditorServices.Hosting.csproj +++ b/src/PowerShellEditorServices.Hosting/PowerShellEditorServices.Hosting.csproj @@ -1,5 +1,6 @@  - + net8.0;net462 @@ -16,6 +17,12 @@ + + + + + + diff --git a/src/PowerShellEditorServices/PowerShellEditorServices.csproj b/src/PowerShellEditorServices/PowerShellEditorServices.csproj index bf90a93ae..18948aabc 100644 --- a/src/PowerShellEditorServices/PowerShellEditorServices.csproj +++ b/src/PowerShellEditorServices/PowerShellEditorServices.csproj @@ -1,5 +1,6 @@ - + PowerShell Editor Services @@ -41,6 +42,12 @@ + + + + + + From 869c578162cef1059cad9b9fe9efd906c366db7d Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Wed, 8 Jan 2025 11:15:29 -0800 Subject: [PATCH 70/88] Delete extra blank lines etc. to satisfy Roslynator --- src/PowerShellEditorServices/Logging/LanguageServerLogger.cs | 1 - .../Services/DebugAdapter/Handlers/LaunchAndAttachHandler.cs | 2 -- .../Services/DebugAdapter/Handlers/StackTraceHandler.cs | 2 -- .../Services/DebugAdapter/Handlers/VariablesHandler.cs | 2 ++ .../Services/Workspace/Handlers/ConfigurationHandler.cs | 1 - .../DebugAdapterProtocolMessageTests.cs | 1 - .../Debugging/DebugServiceTests.cs | 1 - 7 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/PowerShellEditorServices/Logging/LanguageServerLogger.cs b/src/PowerShellEditorServices/Logging/LanguageServerLogger.cs index 0b22ddd95..5d368f912 100644 --- a/src/PowerShellEditorServices/Logging/LanguageServerLogger.cs +++ b/src/PowerShellEditorServices/Logging/LanguageServerLogger.cs @@ -137,7 +137,6 @@ internal class LanguageServerLoggerProvider(ILanguageServerFacade languageServer public void Dispose() { } } - public static class LanguageServerLoggerExtensions { /// diff --git a/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/LaunchAndAttachHandler.cs b/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/LaunchAndAttachHandler.cs index 97bd6cca7..67b2c1021 100644 --- a/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/LaunchAndAttachHandler.cs +++ b/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/LaunchAndAttachHandler.cs @@ -301,7 +301,6 @@ void RunspaceChangedHandler(object s, RunspaceChangedEventArgs _) throw new RpcErrorException(0, null, "Invalid configuration with no process ID nor custom pipe name!"); } - // Execute the Debug-Runspace command but don't await it because it // will block the debug adapter initialization process. The // InitializedEvent will be sent as soon as the RunspaceChanged @@ -328,7 +327,6 @@ void RunspaceChangedHandler(object s, RunspaceChangedEventArgs _) if (request.RunspaceId < 1) { - throw new RpcErrorException(0, null, "A positive integer must be specified for the RunspaceId!"); } diff --git a/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/StackTraceHandler.cs b/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/StackTraceHandler.cs index 84d23a8b6..858f6a815 100644 --- a/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/StackTraceHandler.cs +++ b/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/StackTraceHandler.cs @@ -128,6 +128,4 @@ public static StackFrame CreateStackFrame(StackFrameDetails stackFrame, long id) Column = invocationInfo.OffsetInLine, PresentationHint = StackFramePresentationHint.Label }; - } - diff --git a/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/VariablesHandler.cs b/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/VariablesHandler.cs index 58fb4d5ef..55c5f85ff 100644 --- a/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/VariablesHandler.cs +++ b/src/PowerShellEditorServices/Services/DebugAdapter/Handlers/VariablesHandler.cs @@ -34,10 +34,12 @@ public async Task Handle(VariablesArguments request, Cancella .ToArray() }; } + #pragma warning disable RCS1075 catch (Exception) { // TODO: This shouldn't be so broad } + #pragma warning restore RCS1075 return variablesResponse; } diff --git a/src/PowerShellEditorServices/Services/Workspace/Handlers/ConfigurationHandler.cs b/src/PowerShellEditorServices/Services/Workspace/Handlers/ConfigurationHandler.cs index a7f36aab1..2cfb57cd4 100644 --- a/src/PowerShellEditorServices/Services/Workspace/Handlers/ConfigurationHandler.cs +++ b/src/PowerShellEditorServices/Services/Workspace/Handlers/ConfigurationHandler.cs @@ -100,7 +100,6 @@ public override async Task Handle(DidChangeConfigurationParams request, Ca return await Unit.Task.ConfigureAwait(false); } - public event EventHandler ConfigurationUpdated; } } diff --git a/test/PowerShellEditorServices.Test.E2E/DebugAdapterProtocolMessageTests.cs b/test/PowerShellEditorServices.Test.E2E/DebugAdapterProtocolMessageTests.cs index bb794516f..523ced631 100644 --- a/test/PowerShellEditorServices.Test.E2E/DebugAdapterProtocolMessageTests.cs +++ b/test/PowerShellEditorServices.Test.E2E/DebugAdapterProtocolMessageTests.cs @@ -306,7 +306,6 @@ await PsesDebugAdapterClient.SetBreakpoints( await PsesDebugAdapterClient.RequestConfigurationDone(new ConfigurationDoneArguments()); await PsesDebugAdapterClient.LaunchScript(filePath, Started); - // Get the stacktrace for the breakpoint await Assert.ThrowsAsync(() => PsesDebugAdapterClient.RequestStackTrace( new StackTraceArguments { } diff --git a/test/PowerShellEditorServices.Test/Debugging/DebugServiceTests.cs b/test/PowerShellEditorServices.Test/Debugging/DebugServiceTests.cs index 05386d43a..d9656c855 100644 --- a/test/PowerShellEditorServices.Test/Debugging/DebugServiceTests.cs +++ b/test/PowerShellEditorServices.Test/Debugging/DebugServiceTests.cs @@ -76,7 +76,6 @@ public async Task InitializeAsync() variableScriptFile = GetDebugScript("VariableTest.ps1"); } - public async Task DisposeAsync() { debugService.Abort(); From aef0fc22739fe7740a055692ff2475e60e308c40 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Thu, 9 Jan 2025 16:05:52 -0800 Subject: [PATCH 71/88] Look in all workspace folders for PSSA settings file (#2167) --- .../Services/Analysis/AnalysisService.cs | 4 +- .../Services/Workspace/WorkspaceService.cs | 80 +++++++------------ 2 files changed, 32 insertions(+), 52 deletions(-) diff --git a/src/PowerShellEditorServices/Services/Analysis/AnalysisService.cs b/src/PowerShellEditorServices/Services/Analysis/AnalysisService.cs index f6b25c5f7..f346cb6c9 100644 --- a/src/PowerShellEditorServices/Services/Analysis/AnalysisService.cs +++ b/src/PowerShellEditorServices/Services/Analysis/AnalysisService.cs @@ -322,7 +322,7 @@ private bool TryFindSettingsFile(out string settingsFilePath) return false; } - settingsFilePath = _workspaceService?.ResolveWorkspacePath(configuredPath); + settingsFilePath = _workspaceService?.FindFileInWorkspace(configuredPath); if (settingsFilePath is null || !File.Exists(settingsFilePath)) @@ -332,6 +332,8 @@ private bool TryFindSettingsFile(out string settingsFilePath) return false; } + _logger.LogInformation($"Found PSSA settings file at '{settingsFilePath}'"); + return true; } diff --git a/src/PowerShellEditorServices/Services/Workspace/WorkspaceService.cs b/src/PowerShellEditorServices/Services/Workspace/WorkspaceService.cs index 941fcf736..efd7f82d7 100644 --- a/src/PowerShellEditorServices/Services/Workspace/WorkspaceService.cs +++ b/src/PowerShellEditorServices/Services/Workspace/WorkspaceService.cs @@ -335,6 +335,35 @@ public string GetRelativePath(ScriptFile scriptFile) return fileUri.ToString(); } + /// + /// Finds a file in the first workspace folder where it exists, if possible. + /// Used as a backwards-compatible way to find files in the workspace. + /// + /// + /// Best possible path. + public string FindFileInWorkspace(string filePath) + { + // If the file path is already an absolute path, just return it. + if (Path.IsPathRooted(filePath)) + { + return filePath; + } + + // If the file path is relative, try to find it in the workspace folders. + foreach (WorkspaceFolder workspaceFolder in WorkspaceFolders) + { + string folderPath = workspaceFolder.Uri.GetFileSystemPath(); + string combinedPath = Path.Combine(folderPath, filePath); + if (File.Exists(combinedPath)) + { + return combinedPath; + } + } + + // If the file path is not found in the workspace folders, return the original path. + return filePath; + } + /// /// Enumerate all the PowerShell (ps1, psm1, psd1) files in the workspace in a recursive manner, using default values. /// @@ -409,57 +438,6 @@ internal static string ReadFileContents(DocumentUri uri) return reader.ReadToEnd(); } - internal string ResolveWorkspacePath(string path) => ResolveRelativeScriptPath(InitialWorkingDirectory, path); - - internal string ResolveRelativeScriptPath(string baseFilePath, string relativePath) - { - // TODO: Sometimes the `baseFilePath` (even when its `WorkspacePath`) is null. - string combinedPath = null; - Exception resolveException = null; - - try - { - // If the path is already absolute there's no need to resolve it relatively - // to the baseFilePath. - if (Path.IsPathRooted(relativePath)) - { - return relativePath; - } - - // Get the directory of the original script file, combine it - // with the given path and then resolve the absolute file path. - combinedPath = - Path.GetFullPath( - Path.Combine( - baseFilePath, - relativePath)); - } - catch (NotSupportedException e) - { - // Occurs if the path is incorrectly formatted for any reason. One - // instance where this occurred is when a user had curly double-quote - // characters in their source instead of normal double-quotes. - resolveException = e; - } - catch (ArgumentException e) - { - // Occurs if the path contains invalid characters, specifically those - // listed in System.IO.Path.InvalidPathChars. - resolveException = e; - } - - if (resolveException != null) - { - logger.LogError( - "Could not resolve relative script path\r\n" + - $" baseFilePath = {baseFilePath}\r\n " + - $" relativePath = {relativePath}\r\n\r\n" + - $"{resolveException}"); - } - - return combinedPath; - } - /// /// Returns a normalized string for a given documentUri to be used as key name. /// Case-sensitive uri on Linux and lowercase for other platforms. From 6b73ed777d32a1580f7e9a20a7614e4cdbb6d140 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Wed, 15 Jan 2025 13:20:21 -0800 Subject: [PATCH 72/88] Update packages --- .github/workflows/ci-test.yml | 3 +-- Directory.Packages.props | 20 ++++++++++---------- global.json | 2 +- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci-test.yml b/.github/workflows/ci-test.yml index 2c504a075..959d482ec 100644 --- a/.github/workflows/ci-test.yml +++ b/.github/workflows/ci-test.yml @@ -30,8 +30,7 @@ jobs: with: cache: true cache-dependency-path: '**/*.csproj' - dotnet-version: 6.0.x - global-json-file: "./global.json" + global-json-file: ./global.json - name: Install PSResources shell: pwsh diff --git a/Directory.Packages.props b/Directory.Packages.props index 8af5dd2ec..428e28735 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -1,10 +1,10 @@ - - - - + + + + @@ -13,15 +13,15 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all @@ -30,8 +30,8 @@ - + - + - \ No newline at end of file + diff --git a/global.json b/global.json index 892db14b0..4141e1966 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "8.0.110", + "version": "8.0.405", "rollForward": "latestFeature", "allowPrerelease": false } From e26f172efa6ee6aef1de0f64b7f2d0fbbc5d22cd Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Thu, 16 Jan 2025 12:19:34 -0800 Subject: [PATCH 73/88] v4.2.0: Support PSScriptAnalyzer config in multi-root workspaces (#2213) --- CHANGELOG.md | 7 +++++++ PowerShellEditorServices.Common.props | 2 +- .../PowerShellEditorServices/PowerShellEditorServices.psd1 | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0640253e9..00db279bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # PowerShell Editor Services Release History +## v4.2.0 +### Thursday, January 16, 2025 + +See more details at the GitHub Release for [v4.2.0](https://github.com/PowerShell/PowerShellEditorServices/releases/tag/v4.2.0). + +Support PSScriptAnalyzer config in multi-root workspaces + ## v4.1.0 ### Wednesday, December 04, 2024 diff --git a/PowerShellEditorServices.Common.props b/PowerShellEditorServices.Common.props index 010fe2a8c..d61f9a96e 100644 --- a/PowerShellEditorServices.Common.props +++ b/PowerShellEditorServices.Common.props @@ -1,6 +1,6 @@ - 4.1.0 + 4.2.0 Microsoft © Microsoft Corporation. diff --git a/module/PowerShellEditorServices/PowerShellEditorServices.psd1 b/module/PowerShellEditorServices/PowerShellEditorServices.psd1 index c71dc1dfe..9f4ca3920 100644 --- a/module/PowerShellEditorServices/PowerShellEditorServices.psd1 +++ b/module/PowerShellEditorServices/PowerShellEditorServices.psd1 @@ -19,7 +19,7 @@ RootModule = if ($PSEdition -eq 'Core') } # Version number of this module. -ModuleVersion = '4.1.0' +ModuleVersion = '4.2.0' # ID used to uniquely identify this module GUID = '9ca15887-53a2-479a-9cda-48d26bcb6c47' From 1ee7adb30a3ccf8463df985c317fa3e41a703494 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Wed, 26 Feb 2025 11:18:55 -0800 Subject: [PATCH 74/88] OneBranch now uses PowerShell 7.4 so remove workarounds (#2218) We can rely on the pre-installed PSResourceGet and we can re-enable tests! --- .pipelines/PowerShellEditorServices-Official.yml | 7 ++----- tools/installPSResources.ps1 | 15 +++++++++++++-- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/.pipelines/PowerShellEditorServices-Official.yml b/.pipelines/PowerShellEditorServices-Official.yml index c07eab61a..02711b556 100644 --- a/.pipelines/PowerShellEditorServices-Official.yml +++ b/.pipelines/PowerShellEditorServices-Official.yml @@ -88,12 +88,9 @@ extends: inputs: packageType: runtime version: 6.x - - pwsh: | - Register-PSRepository -Name CFS -SourceLocation "https://pkgs.dev.azure.com/powershell/PowerShell/_packaging/powershell/nuget/v2" -InstallationPolicy Trusted - Install-Module -Repository CFS -Name Microsoft.PowerShell.PSResourceGet - ./tools/installPSResources.ps1 -PSRepository CFS + - pwsh: ./tools/installPSResources.ps1 -PSRepository CFS displayName: Install PSResources - - pwsh: Invoke-Build Build -Configuration $(BuildConfiguration) -PSRepository CFS + - pwsh: Invoke-Build TestFull -Configuration $(BuildConfiguration) -PSRepository CFS displayName: Build and test - task: PublishTestResults@2 displayName: Publish test results diff --git a/tools/installPSResources.ps1 b/tools/installPSResources.ps1 index e98910d70..97fed8bc3 100644 --- a/tools/installPSResources.ps1 +++ b/tools/installPSResources.ps1 @@ -9,5 +9,16 @@ if ($PSRepository -eq "CFS" -and -not (Get-PSResourceRepository -Name CFS -Error Register-PSResourceRepository -Name CFS -Uri "https://pkgs.dev.azure.com/powershell/PowerShell/_packaging/powershell/nuget/v3/index.json" } -Install-PSResource -Repository $PSRepository -TrustRepository -Name InvokeBuild -Install-PSResource -Repository $PSRepository -TrustRepository -Name platyPS +# NOTE: Due to a bug in Install-PSResource with upstream feeds, we have to +# request an exact version. Otherwise, if a newer version is available in the +# upstream feed, it will fail to install any version at all. +Install-PSResource -Verbose -TrustRepository -RequiredResource @{ + InvokeBuild = @{ + version = "5.12.1" + repository = $PSRepository + } + platyPS = @{ + version = "0.14.2" + repository = $PSRepository + } +} From 601666f1e73bb65d2bf0ae081d89f9b53be5a97e Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Wed, 26 Feb 2025 12:22:45 -0800 Subject: [PATCH 75/88] Fix RestorePsesModules to use Save-PSResource (#2219) --- PowerShellEditorServices.build.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PowerShellEditorServices.build.ps1 b/PowerShellEditorServices.build.ps1 index ec2f4e1fa..cf2666517 100644 --- a/PowerShellEditorServices.build.ps1 +++ b/PowerShellEditorServices.build.ps1 @@ -120,8 +120,8 @@ namespace Microsoft.PowerShell.EditorServices.Hosting task RestorePsesModules -If (-not (Test-Path "module/PSReadLine") -or -not (Test-Path "module/PSScriptAnalyzer")) { Write-Build DarkMagenta "Restoring bundled modules" - Save-Module -Path module -Repository $PSRepository -Name PSScriptAnalyzer -RequiredVersion "1.23.0" -Verbose - Save-Module -Path module -Repository $PSRepository -Name PSReadLine -RequiredVersion "2.4.0-beta0" -AllowPrerelease -Verbose + Save-PSResource -Path module -Name PSScriptAnalyzer -Version "1.23.0" -Repository $PSRepository -TrustRepository -Verbose + Save-PSResource -Path module -Name PSReadLine -Version "2.4.0-beta0" -Prerelease -Repository $PSRepository -TrustRepository -Verbose } Task Build FindDotNet, CreateBuildInfo, RestorePsesModules, { From 0af8424b3bfd3571771cfbe523499c01bb107e37 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Wed, 26 Feb 2025 13:08:54 -0800 Subject: [PATCH 76/88] Skip test that's too slow in ADO (#2220) And remove test that's no longer run since <7.4 has been dropped. --- .../LanguageServerProtocolMessageTests.cs | 43 ++----------------- 1 file changed, 4 insertions(+), 39 deletions(-) diff --git a/test/PowerShellEditorServices.Test.E2E/LanguageServerProtocolMessageTests.cs b/test/PowerShellEditorServices.Test.E2E/LanguageServerProtocolMessageTests.cs index 6e8d3ff62..83f150718 100644 --- a/test/PowerShellEditorServices.Test.E2E/LanguageServerProtocolMessageTests.cs +++ b/test/PowerShellEditorServices.Test.E2E/LanguageServerProtocolMessageTests.cs @@ -1057,44 +1057,6 @@ public async Task CanSendCompletionAndCompletionResolveRequestAsync() Assert.Contains("Writes customized output to a host", updatedCompletionItem.Documentation.String); } - // Regression test for https://github.com/PowerShell/PowerShellEditorServices/issues/1926 - [SkippableFact] - public async Task CanRequestCompletionsAndHandleExceptions() - { - PowerShellVersion details - = await PsesLanguageClient - .SendRequest("powerShell/getVersion", new GetVersionParams()) - .Returning(CancellationToken.None); - - Skip.IfNot(details.Version.StartsWith("7.2") || details.Version.StartsWith("7.3"), - "This is a bug in PowerShell 7.2 and 7.3, fixed in 7.4"); - - string filePath = NewTestFile(@" -@() | ForEach-Object { - if ($false) { - return - } - - @{key=$} - }"); - - Messages.Clear(); // On some systems there's a warning message about configuration items too. - CompletionList completionItems = await PsesLanguageClient.TextDocument.RequestCompletion( - new CompletionParams - { - TextDocument = new TextDocumentIdentifier - { - Uri = DocumentUri.FromFileSystemPath(filePath) - }, - Position = new Position(line: 6, character: 11) - }); - - Assert.Empty(completionItems); - Assert.Collection(Messages, - (message) => Assert.Contains("Error Occurred in TabExpansion2", message.Message), - (message) => Assert.Contains("Exception occurred while running handling completion request", message.Message)); - } - [SkippableFact(Skip = "Completion for Expand-SlowArchive is flaky.")] public async Task CanSendCompletionResolveWithModulePrefixRequestAsync() { @@ -1269,9 +1231,12 @@ await PsesLanguageClient Assert.Equal(0, evaluateResponseBody.VariablesReference); } - [Fact] + [SkippableFact] public async Task CanSendGetCommandRequestAsync() { + Skip.If(Environment.GetEnvironmentVariable("TF_BUILD") is not null, + "This test is too slow in CI."); + List pSCommandMessages = await PsesLanguageClient .SendRequest("powerShell/getCommand", new GetCommandParams()) From 5bc5c11121145f6b67200ce9fcbd70ff5876b94b Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Tue, 4 Mar 2025 11:06:06 -0800 Subject: [PATCH 77/88] Switch to PowerShell Gallery mirror (#2221) --- tools/installPSResources.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/installPSResources.ps1 b/tools/installPSResources.ps1 index 97fed8bc3..3bb642ace 100644 --- a/tools/installPSResources.ps1 +++ b/tools/installPSResources.ps1 @@ -6,7 +6,7 @@ param( ) if ($PSRepository -eq "CFS" -and -not (Get-PSResourceRepository -Name CFS -ErrorAction SilentlyContinue)) { - Register-PSResourceRepository -Name CFS -Uri "https://pkgs.dev.azure.com/powershell/PowerShell/_packaging/powershell/nuget/v3/index.json" + Register-PSResourceRepository -Name CFS -Uri "https://pkgs.dev.azure.com/powershell/PowerShell/_packaging/PowerShellGalleryMirror/nuget/v3/index.json" } # NOTE: Due to a bug in Install-PSResource with upstream feeds, we have to From 8337c80f471be51c4bf36b876f55dadaf282db43 Mon Sep 17 00:00:00 2001 From: Justin Grote Date: Tue, 4 Mar 2025 11:26:55 -0800 Subject: [PATCH 78/88] Add git-blame-ignore-revs file for some refactor commits to make blame better (#2224) --- .git-blame-ignore-revs | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .git-blame-ignore-revs diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 000000000..e0c1cb705 --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,9 @@ +# Enable this file in your git config: git config blame.ignoreRevsFile .git-blame-ignore-revs +# Enabled on GitHub automatically + +# Close Over APIs, was mostly reformatting +945d61634784db2e51f894c9606e785a099fd23d +# Dotnet Format Style +44387b36695607248cebb9467ad48061c19354cb +# Formatting Fixup +7233182585b63760992545c7407b17fb2965bc5c From 9d56407563837aa53f92788a2f0080840119ccee Mon Sep 17 00:00:00 2001 From: Justin Grote Date: Tue, 4 Mar 2025 11:27:37 -0800 Subject: [PATCH 79/88] Surface Additional Parameter Documentation/Tooltips (#2222) * Add Documentation to Parameters and Variables if Present * Add tests * Handle variables * Fix CompletesAttributeValue Test * Fix Rosyn Analyzer Nit on Liq Select * Change variable label handling --- .../Handlers/CompletionHandler.cs | 43 ++++++++++++++++--- .../Completion/CompletionExamples.psm1 | 2 +- .../Language/CompletionHandlerTests.cs | 24 ++++++++++- .../Language/SymbolsServiceTests.cs | 28 ++++++------ 4 files changed, 74 insertions(+), 23 deletions(-) diff --git a/src/PowerShellEditorServices/Services/TextDocument/Handlers/CompletionHandler.cs b/src/PowerShellEditorServices/Services/TextDocument/Handlers/CompletionHandler.cs index 29e36ce25..c3d7a39c5 100644 --- a/src/PowerShellEditorServices/Services/TextDocument/Handlers/CompletionHandler.cs +++ b/src/PowerShellEditorServices/Services/TextDocument/Handlers/CompletionHandler.cs @@ -327,15 +327,15 @@ CompletionResultType.ProviderItem or CompletionResultType.ProviderContainer Data = item.Detail, Detail = SupportsMarkdown ? null : item.Detail, }, - CompletionResultType.ParameterName => TryExtractType(detail, out string type) - ? item with { Kind = CompletionItemKind.Variable, Detail = type } + CompletionResultType.ParameterName => TryExtractType(detail, item.Label, out string type, out string documentation) + ? item with { Kind = CompletionItemKind.Variable, Detail = type, Documentation = documentation } // The comparison operators (-eq, -not, -gt, etc) unfortunately come across as // ParameterName types but they don't have a type associated to them, so we can // deduce it is an operator. : item with { Kind = CompletionItemKind.Operator }, CompletionResultType.ParameterValue => item with { Kind = CompletionItemKind.Value }, - CompletionResultType.Variable => TryExtractType(detail, out string type) - ? item with { Kind = CompletionItemKind.Variable, Detail = type } + CompletionResultType.Variable => TryExtractType(detail, "$" + item.Label, out string type, out string documentation) + ? item with { Kind = CompletionItemKind.Variable, Detail = type, Documentation = documentation } : item with { Kind = CompletionItemKind.Variable }, CompletionResultType.Namespace => item with { Kind = CompletionItemKind.Module }, CompletionResultType.Type => detail.StartsWith("Class ", StringComparison.CurrentCulture) @@ -450,16 +450,45 @@ private static string GetTypeFilterText(string textToBeReplaced, string completi /// type names in [] to be consistent with PowerShell syntax and how the debugger displays /// type names. /// - /// - /// + /// The tooltip text to parse + /// The extracted type string, if found + /// The remaining text after the type, if any + /// The label to check for in the documentation prefix /// Whether or not the type was found. - private static bool TryExtractType(string toolTipText, out string type) + internal static bool TryExtractType(string toolTipText, string label, out string type, out string documentation) { MatchCollection matches = s_typeRegex.Matches(toolTipText); type = string.Empty; + documentation = null; //We use null instead of String.Empty to indicate no documentation was found. + if ((matches.Count > 0) && (matches[0].Groups.Count > 1)) { type = matches[0].Groups[1].Value; + + // Extract the description as everything after the type + if (matches[0].Length < toolTipText.Length) + { + documentation = toolTipText.Substring(matches[0].Length).Trim(); + + if (documentation is not null) + { + // If the substring is the same as the label, documentation should remain blank + if (documentation.Equals(label, StringComparison.OrdinalIgnoreCase)) + { + documentation = null; + } + // If the documentation starts with "label - ", remove this prefix + else if (documentation.StartsWith(label + " - ", StringComparison.OrdinalIgnoreCase)) + { + documentation = documentation.Substring((label + " - ").Length).Trim(); + } + } + if (string.IsNullOrWhiteSpace(documentation)) + { + documentation = null; + } + } + return true; } return false; diff --git a/test/PowerShellEditorServices.Test.Shared/Completion/CompletionExamples.psm1 b/test/PowerShellEditorServices.Test.Shared/Completion/CompletionExamples.psm1 index b8427615e..840ec9fdf 100644 --- a/test/PowerShellEditorServices.Test.Shared/Completion/CompletionExamples.psm1 +++ b/test/PowerShellEditorServices.Test.Shared/Completion/CompletionExamples.psm1 @@ -13,7 +13,7 @@ Import-Module PowerShellGet Get-Rand function Test-Completion { - param([Parameter(Mandatory, Value)]) + param([Parameter(Mandatory, Value)]$test) } Get-ChildItem / diff --git a/test/PowerShellEditorServices.Test/Language/CompletionHandlerTests.cs b/test/PowerShellEditorServices.Test/Language/CompletionHandlerTests.cs index 35546cefe..fb8076476 100644 --- a/test/PowerShellEditorServices.Test/Language/CompletionHandlerTests.cs +++ b/test/PowerShellEditorServices.Test/Language/CompletionHandlerTests.cs @@ -105,7 +105,6 @@ public async Task CompletesVariableInFile() [SkippableFact] public async Task CompletesAttributeValue() { - Skip.If(VersionUtils.IsPS74, "PowerShell 7.4 isn't returning these!"); (_, IEnumerable results) = await GetCompletionResultsAsync(CompleteAttributeValue.SourceDetails); // NOTE: Since the completions come through un-ordered from PowerShell, their SortText // (which has an index prepended from the original order) will mis-match our assumed @@ -126,5 +125,28 @@ public async Task CompletesFilePath() Assert.Equal(actual.TextEdit.TextEdit with { NewText = "" }, CompleteFilePath.ExpectedEdit); Assert.All(results, r => Assert.True(r.Kind is CompletionItemKind.File or CompletionItemKind.Folder)); } + + // TODO: These should be an integration tests at a higher level if/when https://github.com/PowerShell/PowerShell/pull/25108 is merged. As of today, we can't actually test this in the PS engine currently. + [Fact] + public void CanExtractTypeAndDescriptionFromTooltip() + { + string expectedType = "[string]"; + string expectedDescription = "Test String"; + string paramName = "TestParam"; + string testHelp = $"{expectedType} {paramName} - {expectedDescription}"; + Assert.True(PsesCompletionHandler.TryExtractType(testHelp, paramName, out string type, out string description)); + Assert.Equal(expectedType, type); + Assert.Equal(expectedDescription, description); + } + + [Fact] + public void CanExtractTypeFromTooltip() + { + string expectedType = "[string]"; + string testHelp = $"{expectedType}"; + Assert.True(PsesCompletionHandler.TryExtractType(testHelp, string.Empty, out string type, out string description)); + Assert.Null(description); + Assert.Equal(expectedType, type); + } } } diff --git a/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs b/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs index 359a424f8..28a51ae3a 100644 --- a/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs +++ b/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs @@ -796,37 +796,37 @@ public void FindsSymbolsInFile() Assert.False(symbol.IsDeclaration); AssertIsRegion(symbol.NameRegion, 16, 29, 16, 39); - symbol = Assert.Single(symbols.Where(i => i.Type == SymbolType.Workflow)); + symbol = Assert.Single(symbols, i => i.Type == SymbolType.Workflow); Assert.Equal("fn AWorkflow", symbol.Id); Assert.Equal("workflow AWorkflow ()", symbol.Name); Assert.True(symbol.IsDeclaration); - symbol = Assert.Single(symbols.Where(i => i.Type == SymbolType.Class)); + symbol = Assert.Single(symbols, i => i.Type == SymbolType.Class); Assert.Equal("type AClass", symbol.Id); Assert.Equal("class AClass { }", symbol.Name); Assert.True(symbol.IsDeclaration); - symbol = Assert.Single(symbols.Where(i => i.Type == SymbolType.Property)); + symbol = Assert.Single(symbols, i => i.Type == SymbolType.Property); Assert.Equal("prop AProperty", symbol.Id); Assert.Equal("[string] $AProperty", symbol.Name); Assert.True(symbol.IsDeclaration); - symbol = Assert.Single(symbols.Where(i => i.Type == SymbolType.Constructor)); + symbol = Assert.Single(symbols, i => i.Type == SymbolType.Constructor); Assert.Equal("mtd AClass", symbol.Id); Assert.Equal("AClass([string]$AParameter)", symbol.Name); Assert.True(symbol.IsDeclaration); - symbol = Assert.Single(symbols.Where(i => i.Type == SymbolType.Method)); + symbol = Assert.Single(symbols, i => i.Type == SymbolType.Method); Assert.Equal("mtd AMethod", symbol.Id); Assert.Equal("void AMethod([string]$param1, [int]$param2, $param3)", symbol.Name); Assert.True(symbol.IsDeclaration); - symbol = Assert.Single(symbols.Where(i => i.Type == SymbolType.Enum)); + symbol = Assert.Single(symbols, i => i.Type == SymbolType.Enum); Assert.Equal("type AEnum", symbol.Id); Assert.Equal("enum AEnum { }", symbol.Name); Assert.True(symbol.IsDeclaration); - symbol = Assert.Single(symbols.Where(i => i.Type == SymbolType.EnumMember)); + symbol = Assert.Single(symbols, i => i.Type == SymbolType.EnumMember); Assert.Equal("prop AValue", symbol.Id); Assert.Equal("AValue", symbol.Name); Assert.True(symbol.IsDeclaration); @@ -866,38 +866,38 @@ public void FindsSymbolsWithNewLineInFile() { IEnumerable symbols = FindSymbolsInFile(FindSymbolsInNewLineSymbolFile.SourceDetails); - SymbolReference symbol = Assert.Single(symbols.Where(i => i.Type == SymbolType.Function)); + SymbolReference symbol = Assert.Single(symbols, i => i.Type == SymbolType.Function); Assert.Equal("fn returnTrue", symbol.Id); AssertIsRegion(symbol.NameRegion, 2, 1, 2, 11); AssertIsRegion(symbol.ScriptRegion, 1, 1, 4, 2); - symbol = Assert.Single(symbols.Where(i => i.Type == SymbolType.Class)); + symbol = Assert.Single(symbols, i => i.Type == SymbolType.Class); Assert.Equal("type NewLineClass", symbol.Id); AssertIsRegion(symbol.NameRegion, 7, 1, 7, 13); AssertIsRegion(symbol.ScriptRegion, 6, 1, 23, 2); - symbol = Assert.Single(symbols.Where(i => i.Type == SymbolType.Constructor)); + symbol = Assert.Single(symbols, i => i.Type == SymbolType.Constructor); Assert.Equal("mtd NewLineClass", symbol.Id); AssertIsRegion(symbol.NameRegion, 8, 5, 8, 17); AssertIsRegion(symbol.ScriptRegion, 8, 5, 10, 6); - symbol = Assert.Single(symbols.Where(i => i.Type == SymbolType.Property)); + symbol = Assert.Single(symbols, i => i.Type == SymbolType.Property); Assert.Equal("prop SomePropWithDefault", symbol.Id); AssertIsRegion(symbol.NameRegion, 15, 5, 15, 25); AssertIsRegion(symbol.ScriptRegion, 12, 5, 15, 40); - symbol = Assert.Single(symbols.Where(i => i.Type == SymbolType.Method)); + symbol = Assert.Single(symbols, i => i.Type == SymbolType.Method); Assert.Equal("mtd MyClassMethod", symbol.Id); Assert.Equal("string MyClassMethod([MyNewLineEnum]$param1)", symbol.Name); AssertIsRegion(symbol.NameRegion, 20, 5, 20, 18); AssertIsRegion(symbol.ScriptRegion, 17, 5, 22, 6); - symbol = Assert.Single(symbols.Where(i => i.Type == SymbolType.Enum)); + symbol = Assert.Single(symbols, i => i.Type == SymbolType.Enum); Assert.Equal("type MyNewLineEnum", symbol.Id); AssertIsRegion(symbol.NameRegion, 26, 1, 26, 14); AssertIsRegion(symbol.ScriptRegion, 25, 1, 28, 2); - symbol = Assert.Single(symbols.Where(i => i.Type == SymbolType.EnumMember)); + symbol = Assert.Single(symbols, i => i.Type == SymbolType.EnumMember); Assert.Equal("prop First", symbol.Id); AssertIsRegion(symbol.NameRegion, 27, 5, 27, 10); AssertIsRegion(symbol.ScriptRegion, 27, 5, 27, 10); From 7935cf86a4a876fb909d1e8ce5d4937757703597 Mon Sep 17 00:00:00 2001 From: Justin Grote Date: Tue, 18 Mar 2025 10:18:38 -0700 Subject: [PATCH 80/88] Improve E2E Test Fixtures to be less flaky (#2208) * Improve E2E Test Fixtures to be less flaky * Adjust test skips * Fix dangling IsLinux reference * Kick Hover Test issue can down the road * Make CanSendGetCommandRequestAsync Skip in CI Again * Remove unneded using namespace * Bump GetCommandRequest to 2 minutes It took longer than 1 minute in Github Actions! * Skip HoverRequest on Windows for Now * Swap management for utility command and ensure help is cached. * Fix symbol test regression oopsie * Update POST * Fix DSC Test Contengent assuming https://github.com/PowerShell/PowerShellEditorServices/pull/2208#issuecomment-2702301664 is OK from @andyleejordan * Fix Help Update Process * Add upterm debugging to pipeline * Expand help update to all potential pwsh versions * Add PS7 Help * Try Help CAB again * Apparently it's a zip not a cab on Linux... * Fixup PS5.1 Help Script * Switch to Microsoft.PowerShell.Archive for help tests for smaller artifact size. * Clean up build script comments --------- Co-authored-by: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> --- .github/workflows/ci-test.yml | 6 + PowerShellEditorServices.build.ps1 | 84 +++- .../Server/PsesDebugServer.cs | 3 +- .../DebugAdapterProtocolMessageTests.cs | 421 ++++++++++-------- .../Hosts/DebugOutputStream.cs | 43 ++ .../Hosts/IAsyncLanguageServerHost.cs | 24 + .../IDebugAdapterClientExtensions.cs} | 9 +- .../PsesStdioLanguageServerProcessHost.cs | 84 ++++ .../Hosts/StdioLanguageServerProcessHost.cs | 116 +++++ ...LSPTestsFixures.cs => LSPTestsFixtures.cs} | 23 +- .../LanguageServerProtocolMessageTests.cs | 129 +++--- .../PowerShellEditorServices.Test.E2E.csproj | 9 +- .../Processes/LoggingStream.cs | 66 --- .../Processes/PsesStdioProcess.cs | 121 ----- .../Processes/ServerProcess.cs | 151 ------- .../Processes/StdioServerProcess.cs | 191 -------- .../xunit.runner.json | 6 +- ...a-9ae2-482a-a648-e96550fb8733_HelpInfo.xml | 10 + ...2a-a648-e96550fb8733_en-US_HelpContent.cab | Bin 0 -> 5388 bytes ...2a-a648-e96550fb8733_en-US_HelpContent.zip | Bin 0 -> 5529 bytes ...a-9ae2-482a-a648-e96550fb8733_HelpInfo.xml | 10 + ...2a-a648-e96550fb8733_en-US_HelpContent.cab | Bin 0 -> 5137 bytes .../PSHelp/README | 3 + .../SymbolDetails/SymbolDetails.ps1 | 15 +- .../Language/SymbolsServiceTests.cs | 17 +- 25 files changed, 718 insertions(+), 823 deletions(-) create mode 100644 test/PowerShellEditorServices.Test.E2E/Hosts/DebugOutputStream.cs create mode 100644 test/PowerShellEditorServices.Test.E2E/Hosts/IAsyncLanguageServerHost.cs rename test/PowerShellEditorServices.Test.E2E/{DebugAdapterClientExtensions.cs => Hosts/IDebugAdapterClientExtensions.cs} (63%) create mode 100644 test/PowerShellEditorServices.Test.E2E/Hosts/PsesStdioLanguageServerProcessHost.cs create mode 100644 test/PowerShellEditorServices.Test.E2E/Hosts/StdioLanguageServerProcessHost.cs rename test/PowerShellEditorServices.Test.E2E/{LSPTestsFixures.cs => LSPTestsFixtures.cs} (86%) delete mode 100644 test/PowerShellEditorServices.Test.E2E/Processes/LoggingStream.cs delete mode 100644 test/PowerShellEditorServices.Test.E2E/Processes/PsesStdioProcess.cs delete mode 100644 test/PowerShellEditorServices.Test.E2E/Processes/ServerProcess.cs delete mode 100644 test/PowerShellEditorServices.Test.E2E/Processes/StdioServerProcess.cs create mode 100644 test/PowerShellEditorServices.Test.Shared/PSHelp/7/Microsoft.PowerShell.Archive_eb74e8da-9ae2-482a-a648-e96550fb8733_HelpInfo.xml create mode 100644 test/PowerShellEditorServices.Test.Shared/PSHelp/7/Microsoft.PowerShell.Archive_eb74e8da-9ae2-482a-a648-e96550fb8733_en-US_HelpContent.cab create mode 100644 test/PowerShellEditorServices.Test.Shared/PSHelp/7/Microsoft.PowerShell.Archive_eb74e8da-9ae2-482a-a648-e96550fb8733_en-US_HelpContent.zip create mode 100644 test/PowerShellEditorServices.Test.Shared/PSHelp/Microsoft.PowerShell.Archive_eb74e8da-9ae2-482a-a648-e96550fb8733_HelpInfo.xml create mode 100644 test/PowerShellEditorServices.Test.Shared/PSHelp/Microsoft.PowerShell.Archive_eb74e8da-9ae2-482a-a648-e96550fb8733_en-US_HelpContent.cab create mode 100644 test/PowerShellEditorServices.Test.Shared/PSHelp/README diff --git a/.github/workflows/ci-test.yml b/.github/workflows/ci-test.yml index 959d482ec..6a2f09928 100644 --- a/.github/workflows/ci-test.yml +++ b/.github/workflows/ci-test.yml @@ -51,6 +51,12 @@ jobs: shell: pwsh run: ./pwsh/tools/install-powershell.ps1 -Daily + - name: If Debugging, start upterm for interactive pipeline troubleshooting + if: ${{ runner.debug == 1 }} + uses: lhotari/action-upterm@v1 + with: + wait-timeout-minutes: 1 + - name: Build and test shell: pwsh run: Invoke-Build -Configuration Release ${{ github.event_name == 'merge_group' && 'TestFull' || 'Test' }} diff --git a/PowerShellEditorServices.build.ps1 b/PowerShellEditorServices.build.ps1 index cf2666517..116ae70eb 100644 --- a/PowerShellEditorServices.build.ps1 +++ b/PowerShellEditorServices.build.ps1 @@ -193,8 +193,88 @@ Task BuildCmdletHelp -After AssembleModule { } Task SetupHelpForTests { - Write-Build DarkMagenta 'Updating help (for tests)' - Update-Help -Module Microsoft.PowerShell.Management, Microsoft.PowerShell.Utility -Force -Scope CurrentUser -UICulture en-US + # Some CI do not ship with help included, and the secure devops pipeline also does not allow internet access, so we must update help from our local repository source. + + # Only commands in Microsoft.PowerShell.Archive can be tested for help so as to minimize the repository storage. + # This requires admin rights for PS5.1 + + # NOTE: You can run this task once as admin or update help separately, and continue to run tests as non-admin, if for instance developing locally. + + $installHelpScript = { + param( + [Parameter(Position = 0)][string]$helpPath + ) + $PSVersion = $PSVersionTable.PSVersion + $ErrorActionPreference = 'Stop' + $helpPath = Resolve-Path $helpPath + if ($PSEdition -ne 'Desktop') { + $helpPath = Join-Path $helpPath '7' + } + + if ((Get-Help Expand-Archive).remarks -notlike 'Get-Help cannot find the Help files*') { + Write-Host -ForegroundColor Green "PowerShell $PSVersion Archive help is already installed" + return + } + + if ($PSEdition -eq 'Desktop') { + # Cant use requires RunAsAdministrator because PS isn't smart enough to know this is a subscript. + if (-not [Security.Principal.WindowsPrincipal]::new( + [Security.Principal.WindowsIdentity]::GetCurrent() + ).IsInRole( + [Security.Principal.WindowsBuiltInRole]::Administrator + )) { + throw 'Windows PowerShell Update-Help requires admin rights. Please re-run the script in an elevated PowerShell session!' + } + } + + Write-Host -ForegroundColor Magenta "PowerShell $PSVersion Archive help is not installed, installing from $helpPath" + + $updateHelpParams = @{ + Module = 'Microsoft.PowerShell.Archive' + SourcePath = $helpPath + UICulture = 'en-US' + Force = $true + Verbose = $true + } + + # PS7+ does not require admin rights if CurrentUser is used for scope. PS5.1 does not have this option. + if ($PSEdition -ne 'Desktop') { + $updateHelpParams.'Scope' = 'CurrentUser' + } + # Update the help and capture verbose output + $updateHelpOutput = Update-Help @updateHelpParams *>&1 + + if ((Get-Help Expand-Archive).remarks -like 'Get-Help cannot find the Help files*') { + throw "Failed to install PowerShell $PSVersion Help: $updateHelpOutput" + } else { + Write-Host -ForegroundColor Green "PowerShell $PSVersion Archive help installed successfully" + } + } + + # Need this to inject the help file path since PSScriptRoot won't work inside the script + $helpPath = Resolve-Path "$PSScriptRoot\test\PowerShellEditorServices.Test.Shared\PSHelp" -ErrorAction Stop + Write-Build DarkMagenta "Runner help located at $helpPath" + + if (Get-Command powershell.exe -CommandType Application -ea 0) { + Write-Build DarkMagenta 'Checking PowerShell 5.1 help' + & powershell.exe -NoProfile -NonInteractive -Command $installHelpScript -args $helpPath + if ($LASTEXITCODE -ne 0) { + throw 'Failed to install PowerShell 5.1 help!' + } + } + + if ($PwshDaily -and (Get-Command $PwshDaily -ea 0)) { + Write-Build DarkMagenta "Checking PowerShell Daily help at $PwshDaily" + Invoke-BuildExec { & $PwshDaily -NoProfile -NonInteractive -Command $installHelpScript -args $helpPath } + if ($LASTEXITCODE -ne 0) { + throw 'Failed to install PowerShell Daily help!' + } + } + + if ($PSEdition -eq 'Core') { + Write-Build DarkMagenta "Checking this PowerShell process's help" + & $installHelpScript $helpPath + } } Task TestPS74 Build, SetupHelpForTests, { diff --git a/src/PowerShellEditorServices/Server/PsesDebugServer.cs b/src/PowerShellEditorServices/Server/PsesDebugServer.cs index 6fbecce9c..9f48a0f2d 100644 --- a/src/PowerShellEditorServices/Server/PsesDebugServer.cs +++ b/src/PowerShellEditorServices/Server/PsesDebugServer.cs @@ -120,7 +120,8 @@ public async Task StartAsync() response.SupportsDelayedStackTraceLoading = true; return Task.CompletedTask; - }); + }) + ; }).ConfigureAwait(false); } diff --git a/test/PowerShellEditorServices.Test.E2E/DebugAdapterProtocolMessageTests.cs b/test/PowerShellEditorServices.Test.E2E/DebugAdapterProtocolMessageTests.cs index 523ced631..881e55884 100644 --- a/test/PowerShellEditorServices.Test.E2E/DebugAdapterProtocolMessageTests.cs +++ b/test/PowerShellEditorServices.Test.E2E/DebugAdapterProtocolMessageTests.cs @@ -2,140 +2,132 @@ // Licensed under the MIT License. using System; -using System.Diagnostics; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text; -using System.Threading; using System.Threading.Tasks; +using Nerdbank.Streams; using OmniSharp.Extensions.DebugAdapter.Client; -using DapStackFrame = OmniSharp.Extensions.DebugAdapter.Protocol.Models.StackFrame; +using OmniSharp.Extensions.DebugAdapter.Protocol.Client; using OmniSharp.Extensions.DebugAdapter.Protocol.Events; using OmniSharp.Extensions.DebugAdapter.Protocol.Models; using OmniSharp.Extensions.DebugAdapter.Protocol.Requests; using OmniSharp.Extensions.JsonRpc.Server; using Xunit; using Xunit.Abstractions; -using Microsoft.Extensions.Logging.Abstractions; +using DapStackFrame = OmniSharp.Extensions.DebugAdapter.Protocol.Models.StackFrame; namespace PowerShellEditorServices.Test.E2E { - public class XunitOutputTraceListener(ITestOutputHelper output) : TraceListener - { - public override void Write(string message) => output.WriteLine(message); - public override void WriteLine(string message) => output.WriteLine(message); - } - [Trait("Category", "DAP")] - public class DebugAdapterProtocolMessageTests : IAsyncLifetime, IDisposable + // ITestOutputHelper is injected by XUnit + // https://xunit.net/docs/capturing-output + public class DebugAdapterProtocolMessageTests(ITestOutputHelper output) : IAsyncLifetime { - private static readonly bool s_isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); - private static readonly string s_testOutputPath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + // After initialization, use this client to send messages for E2E tests and check results + private IDebugAdapterClient client; - private readonly ITestOutputHelper _output; - private DebugAdapterClient PsesDebugAdapterClient; - private PsesStdioProcess _psesProcess; + private static readonly bool s_isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); /// - /// Completes when the debug adapter is started. + /// Test scripts output here, where the output can be read to verify script progress against breakpointing /// - public TaskCompletionSource Started { get; } = new TaskCompletionSource(); + private static readonly string testScriptLogPath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + + private readonly PsesStdioLanguageServerProcessHost psesHost = new(isDebugAdapter: true); + + private readonly TaskCompletionSource initializedLanguageClientTcs = new(); /// - /// Completes when the first breakpoint is reached. + /// This task is useful for waiting until the client is initialized (but before Server Initialized is sent) /// - public TaskCompletionSource Stopped { get; } = new TaskCompletionSource(); + private Task initializedLanguageClient => initializedLanguageClientTcs.Task; + + /// + /// Is used to read the script log file to verify script progress against breakpointing. + private StreamReader scriptLogReader; + private TaskCompletionSource nextStoppedTcs = new(); /// - /// Constructor. The ITestOutputHelper is injected by xUnit and used to write diagnostic logs. + /// This task is useful for waiting until a breakpoint is hit in a test. /// - /// - public DebugAdapterProtocolMessageTests(ITestOutputHelper output) => _output = output; + private Task nextStopped => nextStoppedTcs.Task; public async Task InitializeAsync() { - // NOTE: To see debug logger output, add this line to your test - - _psesProcess = new PsesStdioProcess(new NullLoggerFactory(), true); - await _psesProcess.Start(); + // Cleanup testScriptLogPath if it exists due to an interrupted previous run + if (File.Exists(testScriptLogPath)) + { + File.Delete(testScriptLogPath); + } - TaskCompletionSource initialized = new(); + (StreamReader stdout, StreamWriter stdin) = await psesHost.Start(); - _psesProcess.ProcessExited += (sender, args) => - { - initialized.TrySetException(new ProcessExitedException("Initialization failed due to process failure", args.ExitCode, args.ErrorMessage)); - Started.TrySetException(new ProcessExitedException("Startup failed due to process failure", args.ExitCode, args.ErrorMessage)); - }; + // Splice the streams together and enable debug logging of all messages sent and received + DebugOutputStream psesStream = new( + FullDuplexStream.Splice(stdout.BaseStream, stdin.BaseStream) + ); - PsesDebugAdapterClient = DebugAdapterClient.Create(options => + /* + PSES follows the following DAP flow: + Receive a Initialize request + Run Initialize handler and send response back + Receive a Launch/Attach request + Run Launch/Attach handler and send response back + PSES sends the initialized event at the end of the Launch/Attach handler + + This is to spec, but the omnisharp client has a flaw where it does not complete the await until after + Server Initialized has been received, when it should in fact return once the Client Initialize (aka + capabilities) response is received. Per the DAP spec, we can send Launch/Attach before Server Initialized + and PSES relies on this behavior, but if we await the standard client initialization From method, it would + deadlock the test because it won't return until Server Initialized is received from PSES, which it won't + send until a launch is sent. + + HACK: To get around this, we abuse the OnInitialized handler to return the client "early" via the + `InitializedLanguageClient` once the Client Initialize response has been received. + see https://github.com/OmniSharp/csharp-language-server-protocol/issues/1408 + */ + Task dapClientInitializeTask = DebugAdapterClient.From(options => { options - .WithInput(_psesProcess.OutputStream) - .WithOutput(_psesProcess.InputStream) - // The OnStarted delegate gets run when we receive the _Initialized_ event from the server: - // https://microsoft.github.io/debug-adapter-protocol/specification#Events_Initialized - .OnStarted((_, _) => - { - Started.SetResult(true); - return Task.CompletedTask; - }) - // We use this to create a task we can await to test debugging after a breakpoint has been received. - .OnNotification(null, (stoppedEvent, _) => + .WithInput(psesStream) + .WithOutput(psesStream) + // The "early" return mentioned above + .OnInitialized(async (dapClient, _, _, _) => initializedLanguageClientTcs.SetResult(dapClient)) + // This TCS is useful to wait for a breakpoint to be hit + .OnStopped(async (StoppedEvent e) => { - Console.WriteLine("StoppedEvent received"); - Stopped.SetResult(stoppedEvent); - return Task.CompletedTask; + nextStoppedTcs.SetResult(e); + nextStoppedTcs = new(); }) - // The OnInitialized delegate gets run when we first receive the _Initialize_ response: - // https://microsoft.github.io/debug-adapter-protocol/specification#Requests_Initialize - .OnInitialized((_, _, _, _) => - { - initialized.SetResult(true); - return Task.CompletedTask; - }); - - options.OnUnhandledException = (exception) => - { - initialized.SetException(exception); - Started.SetException(exception); - }; + ; }); - // PSES follows the following flow: - // Receive a Initialize request - // Run Initialize handler and send response back - // Receive a Launch/Attach request - // Run Launch/Attach handler and send response back - // PSES sends the initialized event at the end of the Launch/Attach handler - - // The way that the Omnisharp client works is that this Initialize method doesn't return until - // after OnStarted is run... which only happens when Initialized is received from the server. - // so if we would await this task, it would deadlock. - // To get around this, we run the Initialize() without await but use a `TaskCompletionSource` - // that gets completed when we receive the response to Initialize - // This tells us that we are ready to send messages to PSES... but are not stuck waiting for - // Initialized. -#pragma warning disable CS4014 - PsesDebugAdapterClient.Initialize(CancellationToken.None); -#pragma warning restore CS4014 - await initialized.Task; + // This ensures any unhandled exceptions get addressed if it fails to start before our early return completes. + // Under normal operation the initializedLanguageClient will always return first. + await Task.WhenAny( + initializedLanguageClient, + dapClientInitializeTask + ); + + client = await initializedLanguageClient; } public async Task DisposeAsync() { - await PsesDebugAdapterClient.RequestDisconnect(new DisconnectArguments + await client.RequestDisconnect(new DisconnectArguments { Restart = false, TerminateDebuggee = true }); - await _psesProcess.Stop(); - } + client?.Dispose(); + psesHost.Stop(); - public void Dispose() - { - GC.SuppressFinalize(this); - PsesDebugAdapterClient?.Dispose(); - _psesProcess?.Dispose(); + scriptLogReader?.Dispose(); //Also disposes the underlying filestream + if (File.Exists(testScriptLogPath)) + { + File.Delete(testScriptLogPath); + } } private static string NewTestFile(string script, bool isPester = false) @@ -147,7 +139,14 @@ private static string NewTestFile(string script, bool isPester = false) return filePath; } - private string GenerateScriptFromLoggingStatements(params string[] logStatements) + /// + /// Given an array of strings, generate a PowerShell script that writes each string to our test script log path + /// so it can be read back later to verify script progress against breakpointing. + /// + /// A list of statements that for which a script will be generated to write each statement to a testing log that can be read by . The strings are double quoted in Powershell, so variables such as $($PSScriptRoot) etc. can be used + /// A script string that should be written to disk and instructed by PSES to execute + /// + private string GenerateLoggingScript(params string[] logStatements) { if (logStatements.Length == 0) { @@ -155,9 +154,9 @@ private string GenerateScriptFromLoggingStatements(params string[] logStatements } // Clean up side effects from other test runs. - if (File.Exists(s_testOutputPath)) + if (File.Exists(testScriptLogPath)) { - File.Delete(s_testOutputPath); + File.Delete(testScriptLogPath); } // Have script create file first with `>` (but don't rely on overwriting). @@ -166,7 +165,7 @@ private string GenerateScriptFromLoggingStatements(params string[] logStatements .Append("Write-Output \"") .Append(logStatements[0]) .Append("\" > '") - .Append(s_testOutputPath) + .Append(testScriptLogPath) .AppendLine("'"); for (int i = 1; i < logStatements.Length; i++) @@ -176,88 +175,114 @@ private string GenerateScriptFromLoggingStatements(params string[] logStatements .Append("Write-Output \"") .Append(logStatements[i]) .Append("\" >> '") - .Append(s_testOutputPath) + .Append(testScriptLogPath) .AppendLine("'"); } - _output.WriteLine("Script is:"); - _output.WriteLine(builder.ToString()); + output.WriteLine("Script is:"); + output.WriteLine(builder.ToString()); return builder.ToString(); } - private static async Task GetLog() + /// + /// Reads the next output line from the test script log file. Useful in assertions to verify script progress against breakpointing. + /// + private async Task ReadScriptLogLineAsync() { - for (int i = 0; !File.Exists(s_testOutputPath) && i < 60; i++) + while (scriptLogReader is null) { - await Task.Delay(1000); + try + { + scriptLogReader = new StreamReader( + new FileStream( + testScriptLogPath, + FileMode.OpenOrCreate, + FileAccess.Read, // Because we use append, its OK to create the file ahead of the script + FileShare.ReadWrite + ) + ); + } + catch (IOException) //Sadly there does not appear to be a xplat way to wait for file availability, but luckily this does not appear to fire often. + { + await Task.Delay(500); + } } - // Sleep one more time after the file exists so whatever is writing can finish. - await Task.Delay(1000); - return File.ReadLines(s_testOutputPath).ToArray(); + + // return valid lines only + string nextLine = string.Empty; + while (nextLine is null || nextLine.Length == 0) + { + nextLine = await scriptLogReader.ReadLineAsync(); //Might return null if at EOF because we created it above but the script hasn't written to it yet + } + return nextLine; } [Fact] public void CanInitializeWithCorrectServerSettings() { - Assert.True(PsesDebugAdapterClient.ServerSettings.SupportsConditionalBreakpoints); - Assert.True(PsesDebugAdapterClient.ServerSettings.SupportsConfigurationDoneRequest); - Assert.True(PsesDebugAdapterClient.ServerSettings.SupportsFunctionBreakpoints); - Assert.True(PsesDebugAdapterClient.ServerSettings.SupportsHitConditionalBreakpoints); - Assert.True(PsesDebugAdapterClient.ServerSettings.SupportsLogPoints); - Assert.True(PsesDebugAdapterClient.ServerSettings.SupportsSetVariable); + Assert.True(client.ServerSettings.SupportsConditionalBreakpoints); + Assert.True(client.ServerSettings.SupportsConfigurationDoneRequest); + Assert.True(client.ServerSettings.SupportsFunctionBreakpoints); + Assert.True(client.ServerSettings.SupportsHitConditionalBreakpoints); + Assert.True(client.ServerSettings.SupportsLogPoints); + Assert.True(client.ServerSettings.SupportsSetVariable); + Assert.True(client.ServerSettings.SupportsDelayedStackTraceLoading); } [Fact] public async Task UsesDotSourceOperatorAndQuotesAsync() { - string filePath = NewTestFile(GenerateScriptFromLoggingStatements("$($MyInvocation.Line)")); - await PsesDebugAdapterClient.LaunchScript(filePath, Started); - ConfigurationDoneResponse configDoneResponse = await PsesDebugAdapterClient.RequestConfigurationDone(new ConfigurationDoneArguments()); + string filePath = NewTestFile(GenerateLoggingScript("$($MyInvocation.Line)")); + await client.LaunchScript(filePath); + ConfigurationDoneResponse configDoneResponse = await client.RequestConfigurationDone(new ConfigurationDoneArguments()); Assert.NotNull(configDoneResponse); - Assert.Collection(await GetLog(), - (i) => Assert.StartsWith(". '", i)); + + string actual = await ReadScriptLogLineAsync(); + Assert.StartsWith(". '", actual); } [Fact] public async Task UsesCallOperatorWithSettingAsync() { - string filePath = NewTestFile(GenerateScriptFromLoggingStatements("$($MyInvocation.Line)")); - await PsesDebugAdapterClient.LaunchScript(filePath, Started, executeMode: "Call"); - ConfigurationDoneResponse configDoneResponse = await PsesDebugAdapterClient.RequestConfigurationDone(new ConfigurationDoneArguments()); + string filePath = NewTestFile(GenerateLoggingScript("$($MyInvocation.Line)")); + await client.LaunchScript(filePath, executeMode: "Call"); + ConfigurationDoneResponse configDoneResponse = await client.RequestConfigurationDone(new ConfigurationDoneArguments()); Assert.NotNull(configDoneResponse); - Assert.Collection(await GetLog(), - (i) => Assert.StartsWith("& '", i)); + + string actual = await ReadScriptLogLineAsync(); + Assert.StartsWith("& '", actual); } [Fact] public async Task CanLaunchScriptWithNoBreakpointsAsync() { - string filePath = NewTestFile(GenerateScriptFromLoggingStatements("works")); + string filePath = NewTestFile(GenerateLoggingScript("works")); - await PsesDebugAdapterClient.LaunchScript(filePath, Started); + await client.LaunchScript(filePath); - ConfigurationDoneResponse configDoneResponse = await PsesDebugAdapterClient.RequestConfigurationDone(new ConfigurationDoneArguments()); + ConfigurationDoneResponse configDoneResponse = await client.RequestConfigurationDone(new ConfigurationDoneArguments()); Assert.NotNull(configDoneResponse); - Assert.Collection(await GetLog(), - (i) => Assert.Equal("works", i)); + + string actual = await ReadScriptLogLineAsync(); + Assert.Equal("works", actual); } [SkippableFact] public async Task CanSetBreakpointsAsync() { - Skip.If(PsesStdioProcess.RunningInConstrainedLanguageMode, + Skip.If(PsesStdioLanguageServerProcessHost.RunningInConstrainedLanguageMode, "Breakpoints can't be set in Constrained Language Mode."); - string filePath = NewTestFile(GenerateScriptFromLoggingStatements( + string filePath = NewTestFile(GenerateLoggingScript( "before breakpoint", "at breakpoint", "after breakpoint" )); - await PsesDebugAdapterClient.LaunchScript(filePath, Started); + await client.LaunchScript(filePath); // {"command":"setBreakpoints","arguments":{"source":{"name":"dfsdfg.ps1","path":"/Users/tyleonha/Code/PowerShell/Misc/foo/dfsdfg.ps1"},"lines":[2],"breakpoints":[{"line":2}],"sourceModified":false},"type":"request","seq":3} - SetBreakpointsResponse setBreakpointsResponse = await PsesDebugAdapterClient.SetBreakpoints(new SetBreakpointsArguments + SetBreakpointsResponse setBreakpointsResponse = await client.SetBreakpoints(new SetBreakpointsArguments { Source = new Source { Name = Path.GetFileName(filePath), Path = filePath }, Breakpoints = new SourceBreakpoint[] { new SourceBreakpoint { Line = 2 } }, @@ -269,31 +294,43 @@ public async Task CanSetBreakpointsAsync() Assert.Equal(filePath, breakpoint.Source.Path, ignoreCase: s_isWindows); Assert.Equal(2, breakpoint.Line); - ConfigurationDoneResponse configDoneResponse = await PsesDebugAdapterClient.RequestConfigurationDone(new ConfigurationDoneArguments()); + ConfigurationDoneResponse configDoneResponse = await client.RequestConfigurationDone(new ConfigurationDoneArguments()); Assert.NotNull(configDoneResponse); - Assert.Collection(await GetLog(), - (i) => Assert.Equal("before breakpoint", i)); - File.Delete(s_testOutputPath); - ContinueResponse continueResponse = await PsesDebugAdapterClient.RequestContinue( - new ContinueArguments { ThreadId = 1 }); + // Wait until we hit the breakpoint + StoppedEvent stoppedEvent = await nextStopped; + Assert.Equal("breakpoint", stoppedEvent.Reason); + + // The code before the breakpoint should have already run + Assert.Equal("before breakpoint", await ReadScriptLogLineAsync()); + + // Assert that the stopped breakpoint is the one we set + StackTraceResponse stackTraceResponse = await client.RequestStackTrace(new StackTraceArguments { ThreadId = 1 }); + DapStackFrame stoppedTopFrame = stackTraceResponse.StackFrames.First(); + Assert.Equal(2, stoppedTopFrame.Line); - Assert.NotNull(continueResponse); - Assert.Collection(await GetLog(), - (i) => Assert.Equal("at breakpoint", i), - (i) => Assert.Equal("after breakpoint", i)); + _ = await client.RequestContinue(new ContinueArguments { ThreadId = 1 }); + + string atBreakpointActual = await ReadScriptLogLineAsync(); + Assert.Equal("at breakpoint", atBreakpointActual); + + string afterBreakpointActual = await ReadScriptLogLineAsync(); + Assert.Equal("after breakpoint", afterBreakpointActual); } [SkippableFact] public async Task FailsIfStacktraceRequestedWhenNotPaused() { - Skip.If(PsesStdioProcess.RunningInConstrainedLanguageMode, + Skip.If(PsesStdioLanguageServerProcessHost.RunningInConstrainedLanguageMode, "Breakpoints can't be set in Constrained Language Mode."); - string filePath = NewTestFile(GenerateScriptFromLoggingStatements( - "labelTestBreakpoint" + + // We want a long running script that never hits the next breakpoint + string filePath = NewTestFile(GenerateLoggingScript( + "$(sleep 10)", + "Should fail before we get here" )); - // Set a breakpoint - await PsesDebugAdapterClient.SetBreakpoints( + + await client.SetBreakpoints( new SetBreakpointsArguments { Source = new Source { Name = Path.GetFileName(filePath), Path = filePath }, @@ -303,11 +340,11 @@ await PsesDebugAdapterClient.SetBreakpoints( ); // Signal to start the script - await PsesDebugAdapterClient.RequestConfigurationDone(new ConfigurationDoneArguments()); - await PsesDebugAdapterClient.LaunchScript(filePath, Started); + await client.RequestConfigurationDone(new ConfigurationDoneArguments()); + await client.LaunchScript(filePath); - // Get the stacktrace for the breakpoint - await Assert.ThrowsAsync(() => PsesDebugAdapterClient.RequestStackTrace( + // Try to get the stacktrace, which should throw as we are not currently at a breakpoint. + await Assert.ThrowsAsync(() => client.RequestStackTrace( new StackTraceArguments { } )); } @@ -315,19 +352,17 @@ await Assert.ThrowsAsync(() => PsesDebugAdapterClient.RequestS [SkippableFact] public async Task SendsInitialLabelBreakpointForPerformanceReasons() { - Skip.If(PsesStdioProcess.RunningInConstrainedLanguageMode, + Skip.If(PsesStdioLanguageServerProcessHost.RunningInConstrainedLanguageMode, "Breakpoints can't be set in Constrained Language Mode."); - string filePath = NewTestFile(GenerateScriptFromLoggingStatements( + string filePath = NewTestFile(GenerateLoggingScript( "before breakpoint", - "at breakpoint", - "after breakpoint" + "label breakpoint" )); - //TODO: This is technically wrong per the spec, configDone should be completed BEFORE launching, but this is how the vscode client does it today and we really need to fix that. - await PsesDebugAdapterClient.LaunchScript(filePath, Started); + // Request a launch. Note that per DAP spec, launch doesn't actually begin until ConfigDone finishes. + await client.LaunchScript(filePath); - // {"command":"setBreakpoints","arguments":{"source":{"name":"dfsdfg.ps1","path":"/Users/tyleonha/Code/PowerShell/Misc/foo/dfsdfg.ps1"},"lines":[2],"breakpoints":[{"line":2}],"sourceModified":false},"type":"request","seq":3} - SetBreakpointsResponse setBreakpointsResponse = await PsesDebugAdapterClient.SetBreakpoints(new SetBreakpointsArguments + SetBreakpointsResponse setBreakpointsResponse = await client.SetBreakpoints(new SetBreakpointsArguments { Source = new Source { Name = Path.GetFileName(filePath), Path = filePath }, Breakpoints = new SourceBreakpoint[] { new SourceBreakpoint { Line = 2 } }, @@ -339,24 +374,25 @@ public async Task SendsInitialLabelBreakpointForPerformanceReasons() Assert.Equal(filePath, breakpoint.Source.Path, ignoreCase: s_isWindows); Assert.Equal(2, breakpoint.Line); - ConfigurationDoneResponse configDoneResponse = await PsesDebugAdapterClient.RequestConfigurationDone(new ConfigurationDoneArguments()); + _ = client.RequestConfigurationDone(new ConfigurationDoneArguments()); - // FIXME: I think there is a race condition here. If you remove this, the following line Stack Trace fails because the breakpoint hasn't been hit yet. I think the whole getLog process just works long enough for ConfigurationDone to complete and for the breakpoint to be hit. + // Wait for the breakpoint to be hit + StoppedEvent stoppedEvent = await nextStopped; + Assert.Equal("breakpoint", stoppedEvent.Reason); - // I've tried to do this properly by waiting for a StoppedEvent, but that doesn't seem to work, I'm probably just not wiring it up right in the handler. - Assert.NotNull(configDoneResponse); - Assert.Collection(await GetLog(), - (i) => Assert.Equal("before breakpoint", i)); - File.Delete(s_testOutputPath); + // The code before the breakpoint should have already run + Assert.Equal("before breakpoint", await ReadScriptLogLineAsync()); // Get the stacktrace for the breakpoint - StackTraceResponse stackTraceResponse = await PsesDebugAdapterClient.RequestStackTrace( + StackTraceResponse stackTraceResponse = await client.RequestStackTrace( new StackTraceArguments { ThreadId = 1 } ); DapStackFrame firstFrame = stackTraceResponse.StackFrames.First(); + + // Our synthetic label breakpoint should be present Assert.Equal( - firstFrame.PresentationHint, - StackFramePresentationHint.Label + StackFramePresentationHint.Label, + firstFrame.PresentationHint ); } @@ -374,21 +410,21 @@ public async Task SendsInitialLabelBreakpointForPerformanceReasons() [SkippableFact] public async Task CanStepPastSystemWindowsForms() { - Skip.IfNot(PsesStdioProcess.IsWindowsPowerShell, + Skip.IfNot(PsesStdioLanguageServerProcessHost.IsWindowsPowerShell, "Windows Forms requires Windows PowerShell."); - Skip.If(PsesStdioProcess.RunningInConstrainedLanguageMode, + Skip.If(PsesStdioLanguageServerProcessHost.RunningInConstrainedLanguageMode, "Breakpoints can't be set in Constrained Language Mode."); string filePath = NewTestFile(string.Join(Environment.NewLine, new[] { - "Add-Type -AssemblyName System.Windows.Forms", - "$global:form = New-Object System.Windows.Forms.Form", - "Write-Host $form" - })); + "Add-Type -AssemblyName System.Windows.Forms", + "$global:form = New-Object System.Windows.Forms.Form", + "Write-Host $form" + })); - await PsesDebugAdapterClient.LaunchScript(filePath, Started); + await client.LaunchScript(filePath); - SetFunctionBreakpointsResponse setBreakpointsResponse = await PsesDebugAdapterClient.SetFunctionBreakpoints( + SetFunctionBreakpointsResponse setBreakpointsResponse = await client.SetFunctionBreakpoints( new SetFunctionBreakpointsArguments { Breakpoints = new FunctionBreakpoint[] @@ -398,11 +434,11 @@ public async Task CanStepPastSystemWindowsForms() Breakpoint breakpoint = setBreakpointsResponse.Breakpoints.First(); Assert.True(breakpoint.Verified); - ConfigurationDoneResponse configDoneResponse = await PsesDebugAdapterClient.RequestConfigurationDone(new ConfigurationDoneArguments()); + ConfigurationDoneResponse configDoneResponse = await client.RequestConfigurationDone(new ConfigurationDoneArguments()); Assert.NotNull(configDoneResponse); await Task.Delay(5000); - VariablesResponse variablesResponse = await PsesDebugAdapterClient.RequestVariables( + VariablesResponse variablesResponse = await client.RequestVariables( new VariablesArguments { VariablesReference = 1 }); Variable form = variablesResponse.Variables.FirstOrDefault(v => v.Name == "$form"); @@ -417,24 +453,25 @@ public async Task CanStepPastSystemWindowsForms() [Fact] public async Task CanLaunchScriptWithCommentedLastLineAsync() { - string script = GenerateScriptFromLoggingStatements("$($MyInvocation.Line)") + "# a comment at the end"; + string script = GenerateLoggingScript("$($MyInvocation.Line)", "$(1+1)") + "# a comment at the end"; Assert.EndsWith(Environment.NewLine + "# a comment at the end", script); // NOTE: This is horribly complicated, but the "script" parameter here is assigned to // PsesLaunchRequestArguments.Script, which is then assigned to // DebugStateService.ScriptToLaunch in that handler, and finally used by the // ConfigurationDoneHandler in LaunchScriptAsync. - await PsesDebugAdapterClient.LaunchScript(script, Started); + await client.LaunchScript(script); + + _ = await client.RequestConfigurationDone(new ConfigurationDoneArguments()); - ConfigurationDoneResponse configDoneResponse = await PsesDebugAdapterClient.RequestConfigurationDone(new ConfigurationDoneArguments()); - Assert.NotNull(configDoneResponse); // We can check that the script was invoked as expected, which is to dot-source a script // block with the contents surrounded by newlines. While we can't check that the last // line was a curly brace by itself, we did check that the contents ended with a // comment, so if this output exists then the bug did not recur. - Assert.Collection(await GetLog(), - (i) => Assert.Equal(". {", i), - (i) => Assert.Equal("", i)); + Assert.Equal(". {", await ReadScriptLogLineAsync()); + + // Verifies that the script did run and the body was evaluated + Assert.Equal("2", await ReadScriptLogLineAsync()); } [SkippableFact] @@ -457,24 +494,24 @@ public async Task CanRunPesterTestFile() await Task.Delay(1000); } await Task.Delay(15000); - _output.WriteLine(File.ReadAllText(pesterLog)); + output.WriteLine(File.ReadAllText(pesterLog)); */ string pesterTest = NewTestFile(@" - Describe 'A' { - Context 'B' { - It 'C' { - { throw 'error' } | Should -Throw - } - It 'D' { - " + GenerateScriptFromLoggingStatements("pester") + @" - } + Describe 'A' { + Context 'B' { + It 'C' { + { throw 'error' } | Should -Throw + } + It 'D' { + " + GenerateLoggingScript("pester") + @" } - }", isPester: true); + } + }", isPester: true); - await PsesDebugAdapterClient.LaunchScript($"Invoke-Pester -Script '{pesterTest}'", Started); - await PsesDebugAdapterClient.RequestConfigurationDone(new ConfigurationDoneArguments()); - Assert.Collection(await GetLog(), (i) => Assert.Equal("pester", i)); + await client.LaunchScript($"Invoke-Pester -Script '{pesterTest}'"); + await client.RequestConfigurationDone(new ConfigurationDoneArguments()); + Assert.Equal("pester", await ReadScriptLogLineAsync()); } } } diff --git a/test/PowerShellEditorServices.Test.E2E/Hosts/DebugOutputStream.cs b/test/PowerShellEditorServices.Test.E2E/Hosts/DebugOutputStream.cs new file mode 100644 index 000000000..70ffdbced --- /dev/null +++ b/test/PowerShellEditorServices.Test.E2E/Hosts/DebugOutputStream.cs @@ -0,0 +1,43 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. +#nullable enable + +using System.Diagnostics; +using System.IO; +using System.Text; +using Nerdbank.Streams; + +namespace PowerShellEditorServices.Test.E2E; + +/// +/// A stream that logs all data read and written to the debug stream which is visible in the debug console when a +/// debugger is attached. +/// +internal class DebugOutputStream : MonitoringStream +{ + public DebugOutputStream(Stream? underlyingStream) + : base(underlyingStream ?? new MemoryStream()) + { + DidRead += (_, segment) => + { + if (segment.Array is null) { return; } + LogData("⬅️", segment.Array, segment.Offset, segment.Count); + }; + + DidWrite += (_, segment) => + { + if (segment.Array is null) { return; } + LogData("➡️", segment.Array, segment.Offset, segment.Count); + }; + } + + private static void LogData(string header, byte[] buffer, int offset, int count) + { + // If debugging, the raw traffic will be visible in the debug console + if (Debugger.IsAttached) + { + string data = Encoding.UTF8.GetString(buffer, offset, count); + Debug.WriteLine($"{header} {data}"); + } + } +} diff --git a/test/PowerShellEditorServices.Test.E2E/Hosts/IAsyncLanguageServerHost.cs b/test/PowerShellEditorServices.Test.E2E/Hosts/IAsyncLanguageServerHost.cs new file mode 100644 index 000000000..11ea57ef0 --- /dev/null +++ b/test/PowerShellEditorServices.Test.E2E/Hosts/IAsyncLanguageServerHost.cs @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. +#nullable enable + +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace PowerShellEditorServices.Test.E2E; + +/// +/// Represents a debug adapter server host that can be started and stopped and provides streams for communication. +/// +public interface IAsyncLanguageServerHost : IAsyncDisposable +{ + // Start the host and return when the host is ready to communicate. It should return a tuple of a stream Reader and stream Writer for communication with the LSP. The underlying streams can be retrieved via baseStream propertyif needed. + Task<(StreamReader, StreamWriter)> Start(CancellationToken token = default); + // Stops the host and returns when the host has fully stopped. It should be idempotent, such that if called while the host is already stopping/stopped, it will have the same result + Task Stop(CancellationToken token = default); + + // Optional to implement if more is required than a simple stop + async ValueTask IAsyncDisposable.DisposeAsync() => await Stop(); +} diff --git a/test/PowerShellEditorServices.Test.E2E/DebugAdapterClientExtensions.cs b/test/PowerShellEditorServices.Test.E2E/Hosts/IDebugAdapterClientExtensions.cs similarity index 63% rename from test/PowerShellEditorServices.Test.E2E/DebugAdapterClientExtensions.cs rename to test/PowerShellEditorServices.Test.E2E/Hosts/IDebugAdapterClientExtensions.cs index dfcb0bbc7..e37be268d 100644 --- a/test/PowerShellEditorServices.Test.E2E/DebugAdapterClientExtensions.cs +++ b/test/PowerShellEditorServices.Test.E2E/Hosts/IDebugAdapterClientExtensions.cs @@ -4,14 +4,14 @@ using System; using System.Threading.Tasks; using Microsoft.PowerShell.EditorServices.Handlers; -using OmniSharp.Extensions.DebugAdapter.Client; +using OmniSharp.Extensions.DebugAdapter.Protocol.Client; using OmniSharp.Extensions.DebugAdapter.Protocol.Requests; namespace PowerShellEditorServices.Test.E2E { - public static class DebugAdapterClientExtensions + public static class IDebugAdapterClientExtensions { - public static async Task LaunchScript(this DebugAdapterClient debugAdapterClient, string script, TaskCompletionSource started, string executeMode = "DotSource") + public static async Task LaunchScript(this IDebugAdapterClient debugAdapterClient, string script, string executeMode = "DotSource") { _ = await debugAdapterClient.Launch( new PsesLaunchRequestArguments @@ -22,9 +22,6 @@ public static async Task LaunchScript(this DebugAdapterClient debugAdapterClient CreateTemporaryIntegratedConsole = false, ExecuteMode = executeMode, }) ?? throw new Exception("Launch response was null."); - - // This will check to see if we received the Initialized event from the server. - await started.Task; } } } diff --git a/test/PowerShellEditorServices.Test.E2E/Hosts/PsesStdioLanguageServerProcessHost.cs b/test/PowerShellEditorServices.Test.E2E/Hosts/PsesStdioLanguageServerProcessHost.cs new file mode 100644 index 000000000..3c58e6778 --- /dev/null +++ b/test/PowerShellEditorServices.Test.E2E/Hosts/PsesStdioLanguageServerProcessHost.cs @@ -0,0 +1,84 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; + +namespace PowerShellEditorServices.Test.E2E; + +/// +/// A is responsible for launching or attaching to a language server, providing access to its input and output streams, and tracking its lifetime. +/// +internal class PsesStdioLanguageServerProcessHost(bool isDebugAdapter) +: StdioLanguageServerProcessHost(PwshExe, GeneratePsesArguments(isDebugAdapter)) +{ + protected static readonly string s_binDir = + Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + + private static readonly string s_bundledModulePath = new FileInfo(Path.Combine( + s_binDir, "..", "..", "..", "..", "..", "module")).FullName; + + private static readonly string s_sessionDetailsPath = Path.Combine( + s_binDir, $"pses_test_sessiondetails_{Path.GetRandomFileName()}"); + + private static readonly string s_logPath = Path.Combine( + s_binDir, $"pses_test_logs_{Path.GetRandomFileName()}"); + + private const string s_logLevel = "Diagnostic"; + private static readonly string[] s_featureFlags = { "PSReadLine" }; + private const string s_hostName = "TestHost"; + private const string s_hostProfileId = "TestHost"; + private const string s_hostVersion = "1.0.0"; + + // Adjust the environment variable if wanting to test with 5.1 or a specific pwsh path + public static string PwshExe { get; } = Environment.GetEnvironmentVariable("PWSH_EXE_NAME") ?? "pwsh"; + public static bool IsWindowsPowerShell { get; } = PwshExe.EndsWith("powershell"); + public static bool RunningInConstrainedLanguageMode { get; } = + Environment.GetEnvironmentVariable("__PSLockdownPolicy", EnvironmentVariableTarget.Machine) != null; + + private static string[] GeneratePsesArguments(bool isDebugAdapter) + { + List args = new() + { + "&", + SingleQuoteEscape(Path.Combine(s_bundledModulePath, "PowerShellEditorServices", "Start-EditorServices.ps1")), + "-LogPath", + SingleQuoteEscape(s_logPath), + "-LogLevel", + s_logLevel, + "-SessionDetailsPath", + SingleQuoteEscape(s_sessionDetailsPath), + "-FeatureFlags", + string.Join(',', s_featureFlags), + "-HostName", + s_hostName, + "-HostProfileId", + s_hostProfileId, + "-HostVersion", + s_hostVersion, + "-BundledModulesPath", + SingleQuoteEscape(s_bundledModulePath), + "-Stdio" + }; + + if (isDebugAdapter) + { + args.Add("-DebugServiceOnly"); + } + + string base64Str = Convert.ToBase64String( + System.Text.Encoding.Unicode.GetBytes(string.Join(' ', args))); + + return + [ + "-NoLogo", + "-NoProfile", + "-EncodedCommand", + base64Str + ]; + } + + private static string SingleQuoteEscape(string str) => $"'{str.Replace("'", "''")}'"; +} diff --git a/test/PowerShellEditorServices.Test.E2E/Hosts/StdioLanguageServerProcessHost.cs b/test/PowerShellEditorServices.Test.E2E/Hosts/StdioLanguageServerProcessHost.cs new file mode 100644 index 000000000..447ae9b44 --- /dev/null +++ b/test/PowerShellEditorServices.Test.E2E/Hosts/StdioLanguageServerProcessHost.cs @@ -0,0 +1,116 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. +#nullable enable + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace PowerShellEditorServices.Test.E2E; + +/// +/// Hosts a language server process that communicates over stdio +/// +internal class StdioLanguageServerProcessHost(string fileName, IEnumerable argumentList) : IAsyncLanguageServerHost +{ + // The PSES process that will be started and managed + private readonly Process process = new() + { + EnableRaisingEvents = true, + StartInfo = new ProcessStartInfo(fileName, argumentList) + { + RedirectStandardInput = true, + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true + } + }; + + // Track the state of the startup + private TaskCompletionSource<(StreamReader, StreamWriter)>? startTcs; + private TaskCompletionSource? stopTcs; + + // Starts the process. Returns when the process has started and streams are available. + public async Task<(StreamReader, StreamWriter)> Start(CancellationToken token = default) + { + // Runs this once upon process exit to clean up the state. + EventHandler? exitHandler = null; + exitHandler = (sender, e) => + { + // Complete the stopTcs task when the process finally exits, allowing stop to complete + stopTcs?.TrySetResult(true); + stopTcs = null; + startTcs = null; + process.Exited -= exitHandler; + }; + process.Exited += exitHandler; + + if (stopTcs is not null) + { + throw new InvalidOperationException("The process is currently stopping and cannot be started."); + } + + // Await the existing task if we have already started, making this operation idempotent + if (startTcs is not null) + { + return await startTcs.Task; + } + + // Initiate a new startTcs to track the startup + startTcs = new(); + + token.ThrowIfCancellationRequested(); + + // Should throw if there are any startup problems such as invalid path, etc. + process.Start(); + + // According to the source the streams should be allocated synchronously after the process has started, however it's not super clear so we will put this here in case there is an explicit race condition. + if (process.StandardInput.BaseStream is null || process.StandardOutput.BaseStream is null) + { + throw new InvalidOperationException("The process has started but the StandardInput or StandardOutput streams are not available. This should never happen and is probably a race condition, please report it to PowerShellEditorServices."); + } + + startTcs.SetResult(( + process.StandardOutput, + process.StandardInput + )); + + // Return the result of the completion task + return await startTcs.Task; + } + + public async Task WaitForExit(CancellationToken token = default) + { + AssertStarting(); + await process.WaitForExitAsync(token); + } + + /// + /// Determines if the process is in the starting state and throws if not. + /// + private void AssertStarting() + { + if (startTcs is null) + { + throw new InvalidOperationException("The process is not starting/started, use Start() first."); + } + } + + public async Task Stop(CancellationToken token = default) + { + AssertStarting(); + if (stopTcs is not null) + { + return await stopTcs.Task; + } + stopTcs = new(); + token.ThrowIfCancellationRequested(); + process.Kill(); + await process.WaitForExitAsync(token); + return true; + } +} diff --git a/test/PowerShellEditorServices.Test.E2E/LSPTestsFixures.cs b/test/PowerShellEditorServices.Test.E2E/LSPTestsFixtures.cs similarity index 86% rename from test/PowerShellEditorServices.Test.E2E/LSPTestsFixures.cs rename to test/PowerShellEditorServices.Test.E2E/LSPTestsFixtures.cs index 9017eab4f..6eb8e4569 100644 --- a/test/PowerShellEditorServices.Test.E2E/LSPTestsFixures.cs +++ b/test/PowerShellEditorServices.Test.E2E/LSPTestsFixtures.cs @@ -8,9 +8,9 @@ using System.Reflection; using System.Threading; using System.Threading.Tasks; -using Microsoft.Extensions.Logging; using Microsoft.PowerShell.EditorServices.Logging; using Microsoft.PowerShell.EditorServices.Services.Configuration; +using Nerdbank.Streams; using Newtonsoft.Json.Linq; using OmniSharp.Extensions.LanguageServer.Client; using OmniSharp.Extensions.LanguageServer.Protocol; @@ -38,14 +38,16 @@ public class LSPTestsFixture : IAsyncLifetime internal List TelemetryEvents = new(); public ITestOutputHelper Output { get; set; } - protected PsesStdioProcess _psesProcess; - public int ProcessId => _psesProcess.Id; + internal PsesStdioLanguageServerProcessHost _psesHost = new(IsDebugAdapterTests); public async Task InitializeAsync() { - LoggerFactory factory = new(); - _psesProcess = new PsesStdioProcess(factory, IsDebugAdapterTests); - await _psesProcess.Start(); + (StreamReader stdout, StreamWriter stdin) = await _psesHost.Start(); + + // Splice the streams together and enable debug logging of all messages sent and received + DebugOutputStream psesStream = new( + FullDuplexStream.Splice(stdout.BaseStream, stdin.BaseStream) + ); DirectoryInfo testDir = Directory.CreateDirectory(Path.Combine(s_binDir, Path.GetRandomFileName())); @@ -53,12 +55,13 @@ public async Task InitializeAsync() PsesLanguageClient = LanguageClient.PreInit(options => { options - .WithInput(_psesProcess.OutputStream) - .WithOutput(_psesProcess.InputStream) + .WithInput(psesStream) + .WithOutput(psesStream) .WithWorkspaceFolder(DocumentUri.FromFileSystemPath(testDir.FullName), "testdir") .WithInitializationOptions(new { EnableProfileLoading = false }) .OnPublishDiagnostics(diagnosticParams => Diagnostics.AddRange(diagnosticParams.Diagnostics.Where(d => d != null))) - .OnLogMessage(logMessageParams => { + .OnLogMessage(logMessageParams => + { Output?.WriteLine($"{logMessageParams.Type}: {logMessageParams.Message}"); Messages.Add(logMessageParams); }) @@ -98,7 +101,7 @@ public async Task InitializeAsync() public async Task DisposeAsync() { await PsesLanguageClient.Shutdown(); - await _psesProcess.Stop(); + await _psesHost.Stop(); PsesLanguageClient?.Dispose(); } } diff --git a/test/PowerShellEditorServices.Test.E2E/LanguageServerProtocolMessageTests.cs b/test/PowerShellEditorServices.Test.E2E/LanguageServerProtocolMessageTests.cs index 83f150718..d6f50bbdb 100644 --- a/test/PowerShellEditorServices.Test.E2E/LanguageServerProtocolMessageTests.cs +++ b/test/PowerShellEditorServices.Test.E2E/LanguageServerProtocolMessageTests.cs @@ -7,7 +7,6 @@ using System.IO; using System.Linq; using System.Reflection; -using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -29,11 +28,10 @@ namespace PowerShellEditorServices.Test.E2E [Trait("Category", "LSP")] public class LanguageServerProtocolMessageTests : IClassFixture, IDisposable { - // Borrowed from `VersionUtils` which can't be used here due to an initialization problem. - private static bool IsLinux { get; } = RuntimeInformation.IsOSPlatform(OSPlatform.Linux); - private static readonly string s_binDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + private const string testCommand = "Expand-Archive"; + private const string testDescription = "Extracts files from a specified archive (zipped) file."; private readonly ILanguageClient PsesLanguageClient; private readonly List Messages; @@ -48,7 +46,7 @@ public LanguageServerProtocolMessageTests(ITestOutputHelper output, LSPTestsFixt Messages.Clear(); Diagnostics = data.Diagnostics; Diagnostics.Clear(); - PwshExe = PsesStdioProcess.PwshExe; + PwshExe = PsesStdioLanguageServerProcessHost.PwshExe; } public void Dispose() @@ -139,7 +137,7 @@ function CanSendWorkspaceSymbolRequest { [SkippableFact] public async Task CanReceiveDiagnosticsFromFileOpenAsync() { - Skip.If(PsesStdioProcess.RunningInConstrainedLanguageMode && PsesStdioProcess.IsWindowsPowerShell, + Skip.If(PsesStdioLanguageServerProcessHost.RunningInConstrainedLanguageMode && PsesStdioLanguageServerProcessHost.IsWindowsPowerShell, "Windows PowerShell doesn't trust PSScriptAnalyzer by default so it won't load."); NewTestFile("$a = 4"); @@ -161,7 +159,7 @@ public async Task WontReceiveDiagnosticsFromFileOpenThatIsNotPowerShellAsync() [SkippableFact] public async Task CanReceiveDiagnosticsFromFileChangedAsync() { - Skip.If(PsesStdioProcess.RunningInConstrainedLanguageMode && PsesStdioProcess.IsWindowsPowerShell, + Skip.If(PsesStdioLanguageServerProcessHost.RunningInConstrainedLanguageMode && PsesStdioLanguageServerProcessHost.IsWindowsPowerShell, "Windows PowerShell doesn't trust PSScriptAnalyzer by default so it won't load."); string filePath = NewTestFile("$a = 4"); @@ -212,7 +210,7 @@ public async Task CanReceiveDiagnosticsFromFileChangedAsync() [SkippableFact] public async Task CanReceiveDiagnosticsFromConfigurationChangeAsync() { - Skip.If(PsesStdioProcess.RunningInConstrainedLanguageMode && PsesStdioProcess.IsWindowsPowerShell, + Skip.If(PsesStdioLanguageServerProcessHost.RunningInConstrainedLanguageMode && PsesStdioLanguageServerProcessHost.IsWindowsPowerShell, "Windows PowerShell doesn't trust PSScriptAnalyzer by default so it won't load."); PsesLanguageClient.SendNotification("workspace/didChangeConfiguration", @@ -312,7 +310,7 @@ await PsesLanguageClient [SkippableFact] public async Task CanSendFormattingRequestAsync() { - Skip.If(PsesStdioProcess.RunningInConstrainedLanguageMode && PsesStdioProcess.IsWindowsPowerShell, + Skip.If(PsesStdioLanguageServerProcessHost.RunningInConstrainedLanguageMode && PsesStdioLanguageServerProcessHost.IsWindowsPowerShell, "Windows PowerShell doesn't trust PSScriptAnalyzer by default so it won't load."); string scriptPath = NewTestFile(@" @@ -348,7 +346,7 @@ public async Task CanSendFormattingRequestAsync() [SkippableFact] public async Task CanSendRangeFormattingRequestAsync() { - Skip.If(PsesStdioProcess.RunningInConstrainedLanguageMode && PsesStdioProcess.IsWindowsPowerShell, + Skip.If(PsesStdioLanguageServerProcessHost.RunningInConstrainedLanguageMode && PsesStdioLanguageServerProcessHost.IsWindowsPowerShell, "Windows PowerShell doesn't trust PSScriptAnalyzer by default so it won't load."); string scriptPath = NewTestFile(@" @@ -977,7 +975,7 @@ enum MyEnum { [SkippableFact] public async Task CanSendCodeActionRequestAsync() { - Skip.If(PsesStdioProcess.RunningInConstrainedLanguageMode && PsesStdioProcess.IsWindowsPowerShell, + Skip.If(PsesStdioLanguageServerProcessHost.RunningInConstrainedLanguageMode && PsesStdioLanguageServerProcessHost.IsWindowsPowerShell, "Windows PowerShell doesn't trust PSScriptAnalyzer by default so it won't load."); string filePath = NewTestFile("gci"); @@ -1030,73 +1028,80 @@ await PsesLanguageClient }); } - [SkippableFact] + [Fact] public async Task CanSendCompletionAndCompletionResolveRequestAsync() { - Skip.If(IsLinux, "This depends on the help system, which is flaky on Linux."); - Skip.If(PsesStdioProcess.IsWindowsPowerShell, "This help system isn't updated in CI."); - string filePath = NewTestFile("Write-H"); - CompletionList completionItems = await PsesLanguageClient.TextDocument.RequestCompletion( new CompletionParams { TextDocument = new TextDocumentIdentifier { - Uri = DocumentUri.FromFileSystemPath(filePath) + Uri = DocumentUri.FromFileSystemPath(NewTestFile(testCommand)) }, Position = new Position(line: 0, character: 7) }); CompletionItem completionItem = Assert.Single(completionItems, - completionItem1 => completionItem1.FilterText == "Write-Host"); + completionItem1 => completionItem1.FilterText == testCommand); CompletionItem updatedCompletionItem = await PsesLanguageClient .SendRequest("completionItem/resolve", completionItem) .Returning(CancellationToken.None); - Assert.Contains("Writes customized output to a host", updatedCompletionItem.Documentation.String); + Assert.Contains(testDescription, updatedCompletionItem.Documentation.String); } - [SkippableFact(Skip = "Completion for Expand-SlowArchive is flaky.")] + [Fact] public async Task CanSendCompletionResolveWithModulePrefixRequestAsync() { await PsesLanguageClient - .SendRequest( - "evaluate", - new EvaluateRequestArguments - { - Expression = "Import-Module Microsoft.PowerShell.Archive -Prefix Slow" - }) - .ReturningVoid(CancellationToken.None); + .SendRequest( + "evaluate", + new EvaluateRequestArguments + { + Expression = "Import-Module Microsoft.PowerShell.Archive -Prefix Test" + }) + .ReturningVoid(CancellationToken.None); - string filePath = NewTestFile("Expand-SlowArch"); + try + { + const string command = "Expand-TestArchive"; - CompletionList completionItems = await PsesLanguageClient.TextDocument.RequestCompletion( + CompletionList completionItems = await PsesLanguageClient.TextDocument.RequestCompletion( new CompletionParams { TextDocument = new TextDocumentIdentifier { - Uri = DocumentUri.FromFileSystemPath(filePath) + Uri = DocumentUri.FromFileSystemPath(NewTestFile(command)) }, - Position = new Position(line: 0, character: 15) + Position = new Position(line: 0, character: 12) }); - CompletionItem completionItem = Assert.Single(completionItems, - completionItem1 => completionItem1.Label == "Expand-SlowArchive"); + CompletionItem completionItem = Assert.Single(completionItems, + completionItem1 => completionItem1.Label == command); - CompletionItem updatedCompletionItem = await PsesLanguageClient - .SendRequest("completionItem/resolve", completionItem) - .Returning(CancellationToken.None); + CompletionItem updatedCompletionItem = await PsesLanguageClient.ResolveCompletion(completionItem); - Assert.Contains("Extracts files from a specified archive", updatedCompletionItem.Documentation.String); + Assert.Contains(testDescription, updatedCompletionItem.Documentation.String); + } + finally + { + // Reset the Archive module to the non-prefixed version + await PsesLanguageClient + .SendRequest( + "evaluate", + new EvaluateRequestArguments + { + Expression = "Remove-Module Microsoft.PowerShell.Archive;Import-Module Microsoft.PowerShell.Archive -Force" + }) + .ReturningVoid(CancellationToken.None); + } } [SkippableFact] public async Task CanSendHoverRequestAsync() { - Skip.If(IsLinux, "This depends on the help system, which is flaky on Linux."); - Skip.If(PsesStdioProcess.IsWindowsPowerShell, "This help system isn't updated in CI."); - string filePath = NewTestFile("Write-Host"); + string filePath = NewTestFile(testCommand); Hover hover = await PsesLanguageClient.TextDocument.RequestHover( new HoverParams @@ -1110,37 +1115,36 @@ public async Task CanSendHoverRequestAsync() Assert.True(hover.Contents.HasMarkedStrings); Assert.Collection(hover.Contents.MarkedStrings, - str1 => Assert.Equal("Write-Host", str1.Value), + str1 => Assert.Equal(testCommand, str1.Value), str2 => { Assert.Equal("markdown", str2.Language); - Assert.Equal("Writes customized output to a host.", str2.Value); + Assert.Equal(testDescription, str2.Value); }); } [Fact] public async Task CanSendSignatureHelpRequestAsync() { - string filePath = NewTestFile("Get-Date -"); + string filePath = NewTestFile($"{testCommand} -"); - SignatureHelp signatureHelp = await PsesLanguageClient - .SendRequest( - "textDocument/signatureHelp", - new SignatureHelpParams + SignatureHelp signatureHelp = await PsesLanguageClient.RequestSignatureHelp + ( + new SignatureHelpParams + { + TextDocument = new TextDocumentIdentifier { - TextDocument = new TextDocumentIdentifier - { - Uri = new Uri(filePath) - }, - Position = new Position - { - Line = 0, - Character = 10 - } - }) - .Returning(CancellationToken.None); + Uri = new Uri(filePath) + }, + Position = new Position + { + Line = 0, + Character = 10 + } + } + ); - Assert.Contains("Get-Date", signatureHelp.Signatures.First().Label); + Assert.Contains(testCommand, signatureHelp.Signatures.First().Label); } [Fact] @@ -1177,7 +1181,7 @@ await PsesLanguageClient [SkippableFact] public async Task CanSendGetCommentHelpRequestAsync() { - Skip.If(PsesStdioProcess.RunningInConstrainedLanguageMode && PsesStdioProcess.IsWindowsPowerShell, + Skip.If(PsesStdioLanguageServerProcessHost.RunningInConstrainedLanguageMode && PsesStdioLanguageServerProcessHost.IsWindowsPowerShell, "Windows PowerShell doesn't trust PSScriptAnalyzer by default so it won't load."); string scriptPath = NewTestFile(@" @@ -1231,7 +1235,8 @@ await PsesLanguageClient Assert.Equal(0, evaluateResponseBody.VariablesReference); } - [SkippableFact] + // getCommand gets all the commands in the system, and is not optimized and can take forever on CI systems + [SkippableFact(Timeout = 120000)] public async Task CanSendGetCommandRequestAsync() { Skip.If(Environment.GetEnvironmentVariable("TF_BUILD") is not null, @@ -1250,7 +1255,7 @@ await PsesLanguageClient [SkippableFact] public async Task CanSendExpandAliasRequestAsync() { - Skip.If(PsesStdioProcess.RunningInConstrainedLanguageMode, + Skip.If(PsesStdioLanguageServerProcessHost.RunningInConstrainedLanguageMode, "The expand alias request doesn't work in Constrained Language Mode."); ExpandAliasResult expandAliasResult = diff --git a/test/PowerShellEditorServices.Test.E2E/PowerShellEditorServices.Test.E2E.csproj b/test/PowerShellEditorServices.Test.E2E/PowerShellEditorServices.Test.E2E.csproj index 2ea39d3fd..82c0899f5 100644 --- a/test/PowerShellEditorServices.Test.E2E/PowerShellEditorServices.Test.E2E.csproj +++ b/test/PowerShellEditorServices.Test.E2E/PowerShellEditorServices.Test.E2E.csproj @@ -1,5 +1,6 @@ - + net8.0 @@ -18,8 +19,10 @@ - - + + diff --git a/test/PowerShellEditorServices.Test.E2E/Processes/LoggingStream.cs b/test/PowerShellEditorServices.Test.E2E/Processes/LoggingStream.cs deleted file mode 100644 index 9a29452b0..000000000 --- a/test/PowerShellEditorServices.Test.E2E/Processes/LoggingStream.cs +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System; -using System.Diagnostics; -using System.IO; -using System.Text; - -namespace PowerShellEditorServices.Test.E2E -{ - internal class LoggingStream : Stream - { - private static readonly string s_banner = new('=', 20); - - private readonly Stream _underlyingStream; - - public LoggingStream(Stream underlyingStream) => _underlyingStream = underlyingStream; - - protected override void Dispose(bool disposing) - { - base.Dispose(disposing); - if (disposing) - { - _underlyingStream.Dispose(); - } - } - - public override bool CanRead => _underlyingStream.CanRead; - - public override bool CanSeek => _underlyingStream.CanSeek; - - public override bool CanWrite => _underlyingStream.CanWrite; - - public override long Length => _underlyingStream.Length; - - public override long Position { get => _underlyingStream.Position; set => _underlyingStream.Position = value; } - - public override void Flush() => _underlyingStream.Flush(); - - public override int Read(byte[] buffer, int offset, int count) - { - int actualCount = _underlyingStream.Read(buffer, offset, count); - LogData("READ", buffer, offset, actualCount); - return actualCount; - } - - public override long Seek(long offset, SeekOrigin origin) => _underlyingStream.Seek(offset, origin); - - public override void SetLength(long value) => _underlyingStream.SetLength(value); - - public override void Write(byte[] buffer, int offset, int count) - { - LogData("WRITE", buffer, offset, count); - _underlyingStream.Write(buffer, offset, count); - } - - private static void LogData(string header, byte[] buffer, int offset, int count) - { - Debug.WriteLine($"{header} |{s_banner.Substring(0, Math.Max(s_banner.Length - header.Length - 2, 0))}"); - string data = Encoding.UTF8.GetString(buffer, offset, count); - Debug.WriteLine(data); - Debug.WriteLine(s_banner); - Debug.WriteLine("\n"); - } - } -} diff --git a/test/PowerShellEditorServices.Test.E2E/Processes/PsesStdioProcess.cs b/test/PowerShellEditorServices.Test.E2E/Processes/PsesStdioProcess.cs deleted file mode 100644 index 0aa651205..000000000 --- a/test/PowerShellEditorServices.Test.E2E/Processes/PsesStdioProcess.cs +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Reflection; -using Microsoft.Extensions.Logging; - -namespace PowerShellEditorServices.Test.E2E -{ - /// - /// A is responsible for launching or attaching to a language server, providing access to its input and output streams, and tracking its lifetime. - /// - public class PsesStdioProcess : StdioServerProcess - { - protected static readonly string s_binDir = - Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); - - #region private static or constants members - - private static readonly string s_bundledModulePath = new FileInfo(Path.Combine( - s_binDir, "..", "..", "..", "..", "..", "module")).FullName; - - private static readonly string s_sessionDetailsPath = Path.Combine( - s_binDir, $"pses_test_sessiondetails_{Path.GetRandomFileName()}"); - - private static readonly string s_logPath = Path.Combine( - s_binDir, $"pses_test_logs_{Path.GetRandomFileName()}"); - - private const string s_logLevel = "Diagnostic"; - private static readonly string[] s_featureFlags = { "PSReadLine" }; - private const string s_hostName = "TestHost"; - private const string s_hostProfileId = "TestHost"; - private const string s_hostVersion = "1.0.0"; - - #endregion - - #region public static properties - - // NOTE: Just hard-code this to "powershell" when testing with the code lens. - public static string PwshExe { get; } = Environment.GetEnvironmentVariable("PWSH_EXE_NAME") ?? "pwsh"; - public static bool IsWindowsPowerShell { get; } = PwshExe.EndsWith("powershell"); - public static bool RunningInConstrainedLanguageMode { get; } = - Environment.GetEnvironmentVariable("__PSLockdownPolicy", EnvironmentVariableTarget.Machine) != null; - - #endregion - - #region ctor - - public PsesStdioProcess(ILoggerFactory loggerFactory, bool isDebugAdapter) : base(loggerFactory, GeneratePsesStartInfo(isDebugAdapter)) - { - } - - #endregion - - #region helper private methods - - private static ProcessStartInfo GeneratePsesStartInfo(bool isDebugAdapter) - { - ProcessStartInfo processStartInfo = new() - { - FileName = PwshExe - }; - - foreach (string arg in GeneratePsesArguments(isDebugAdapter)) - { - processStartInfo.ArgumentList.Add(arg); - } - - return processStartInfo; - } - - private static string[] GeneratePsesArguments(bool isDebugAdapter) - { - List args = new() - { - "&", - SingleQuoteEscape(Path.Combine(s_bundledModulePath, "PowerShellEditorServices", "Start-EditorServices.ps1")), - "-LogPath", - SingleQuoteEscape(s_logPath), - "-LogLevel", - s_logLevel, - "-SessionDetailsPath", - SingleQuoteEscape(s_sessionDetailsPath), - "-FeatureFlags", - string.Join(',', s_featureFlags), - "-HostName", - s_hostName, - "-HostProfileId", - s_hostProfileId, - "-HostVersion", - s_hostVersion, - "-BundledModulesPath", - SingleQuoteEscape(s_bundledModulePath), - "-Stdio" - }; - - if (isDebugAdapter) - { - args.Add("-DebugServiceOnly"); - } - - string base64Str = Convert.ToBase64String( - System.Text.Encoding.Unicode.GetBytes(string.Join(' ', args))); - - return new string[] - { - "-NoLogo", - "-NoProfile", - "-EncodedCommand", - base64Str - }; - } - - private static string SingleQuoteEscape(string str) => $"'{str.Replace("'", "''")}'"; - - #endregion - } -} diff --git a/test/PowerShellEditorServices.Test.E2E/Processes/ServerProcess.cs b/test/PowerShellEditorServices.Test.E2E/Processes/ServerProcess.cs deleted file mode 100644 index 90ecaaf5c..000000000 --- a/test/PowerShellEditorServices.Test.E2E/Processes/ServerProcess.cs +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System; -using System.IO; -using System.Reactive.Subjects; -using System.Threading.Tasks; -using Microsoft.Extensions.Logging; - -namespace PowerShellEditorServices.Test.E2E -{ - /// - /// A is responsible for launching or attaching to a language server, providing access to its input and output streams, and tracking its lifetime. - /// - public abstract class ServerProcess : IDisposable - { - private readonly ISubject _exitedSubject; - - private readonly Lazy _inStreamLazy; - - private readonly Lazy _outStreamLazy; - - /// - /// Create a new . - /// - /// - /// The factory for loggers used by the process and its components. - /// - protected ServerProcess(ILoggerFactory loggerFactory) - { - LoggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory)); - Log = LoggerFactory.CreateLogger(categoryName: GetType().FullName); - - ServerStartCompletion = new TaskCompletionSource(); - - ServerExitCompletion = new TaskCompletionSource(); - ServerExitCompletion.SetResult(null); // Start out as if the server has already exited. - - Exited = _exitedSubject = new AsyncSubject(); - - _inStreamLazy = new Lazy(GetInputStream); - _outStreamLazy = new Lazy(GetOutputStream); - } - - /// - /// Finalizer for . - /// - ~ServerProcess() - { - Dispose(false); - } - - /// - /// Dispose of resources being used by the launcher. - /// - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - /// - /// Dispose of resources being used by the launcher. - /// - /// - /// Explicit disposal? - /// - protected virtual void Dispose(bool disposing) - { - } - - /// - /// The factory for loggers used by the process and its components. - /// - protected ILoggerFactory LoggerFactory { get; } - - /// - /// The process's logger. - /// - protected ILogger Log { get; } - - /// - /// The used to signal server startup. - /// - protected TaskCompletionSource ServerStartCompletion { get; set; } - - /// - /// The used to signal server exit. - /// - protected TaskCompletionSource ServerExitCompletion { get; set; } - - /// - /// Event raised when the server has exited. - /// - public IObservable Exited { get; } - - /// - /// Is the server running? - /// - public abstract bool IsRunning { get; } - - /// - /// A that completes when the server has started. - /// - public Task HasStarted => ServerStartCompletion.Task; - - /// - /// A that completes when the server has exited. - /// - public Task HasExited => ServerExitCompletion.Task; - - protected abstract Stream GetInputStream(); - - protected abstract Stream GetOutputStream(); - - /// - /// The server's input stream. - /// - /// - /// The connection will write to the server's input stream, and read from its output stream. - /// - public Stream InputStream => _inStreamLazy.Value; - - /// - /// The server's output stream. - /// - /// - /// The connection will read from the server's output stream, and write to its input stream. - /// - public Stream OutputStream => _outStreamLazy.Value; - - /// - /// Start or connect to the server. - /// - public abstract Task Start(); - - /// - /// Stop or disconnect from the server. - /// - public abstract Task Stop(); - - /// - /// Raise the event. - /// - protected virtual void OnExited() - { - _exitedSubject.OnNext(System.Reactive.Unit.Default); - _exitedSubject.OnCompleted(); - } - } -} diff --git a/test/PowerShellEditorServices.Test.E2E/Processes/StdioServerProcess.cs b/test/PowerShellEditorServices.Test.E2E/Processes/StdioServerProcess.cs deleted file mode 100644 index 9cc19810b..000000000 --- a/test/PowerShellEditorServices.Test.E2E/Processes/StdioServerProcess.cs +++ /dev/null @@ -1,191 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -using System; -using System.Diagnostics; -using System.IO; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Extensions.Logging; - -namespace PowerShellEditorServices.Test.E2E -{ - /// - /// A is a that launches its server as an external process and communicates with it over STDIN / STDOUT. - /// - public class StdioServerProcess : ServerProcess - { - /// - /// A that describes how to start the server. - /// - private readonly ProcessStartInfo _serverStartInfo; - - /// - /// The current server process (if any). - /// - [System.Diagnostics.CodeAnalysis.SuppressMessage("Usage", "CA2213:Disposable fields should be disposed", Justification = "It is diposed but with a lock.")] - private Process _serverProcess; - - /// - /// Create a new . - /// - /// - /// The factory for loggers used by the process and its components. - /// - /// - /// A that describes how to start the server. - /// - public StdioServerProcess(ILoggerFactory loggerFactory, ProcessStartInfo serverStartInfo) - : base(loggerFactory) => _serverStartInfo = serverStartInfo ?? throw new ArgumentNullException(nameof(serverStartInfo)); - - public int ProcessId => _serverProcess.Id; - - /// - /// The process ID of the server process, useful for attaching a debugger. - /// - public int Id => _serverProcess.Id; - - /// - /// Dispose of resources being used by the launcher. - /// - /// - /// Explicit disposal? - /// - protected override void Dispose(bool disposing) - { - if (disposing) - { - Process serverProcess = Interlocked.Exchange(ref _serverProcess, null); - if (serverProcess is not null) - { - if (!serverProcess.HasExited) - { - serverProcess.Kill(); - } - - serverProcess.Dispose(); - } - } - base.Dispose(disposing); - } - - /// - /// Is the server running? - /// - public override bool IsRunning => !ServerExitCompletion.Task.IsCompleted; - - /// - /// The server's input stream. - /// - protected override Stream GetInputStream() => _serverProcess?.StandardInput?.BaseStream; - - /// - /// The server's output stream. - /// - protected override Stream GetOutputStream() => _serverProcess?.StandardOutput?.BaseStream; - - /// - /// Start or connect to the server. - /// - public override Task Start() - { - ServerExitCompletion = new TaskCompletionSource(); - - _serverStartInfo.CreateNoWindow = true; - _serverStartInfo.UseShellExecute = false; - _serverStartInfo.RedirectStandardInput = true; - _serverStartInfo.RedirectStandardOutput = true; - _serverStartInfo.RedirectStandardError = true; - - Process serverProcess = _serverProcess = new Process - { - StartInfo = _serverStartInfo, - EnableRaisingEvents = true - }; - serverProcess.Exited += ServerProcess_Exit; - - if (!serverProcess.Start()) - { - throw new InvalidOperationException("Failed to launch language server ."); - } - - ServerStartCompletion.TrySetResult(null); - - return Task.CompletedTask; - } - - /// - /// Stop or disconnect from the server. - /// - public override Task Stop() - { - Process serverProcess = Interlocked.Exchange(ref _serverProcess, null); - ServerExitCompletion.TrySetResult(null); - if (serverProcess?.HasExited == false) - { - serverProcess.Kill(); - } - return ServerExitCompletion.Task; - } - - public event EventHandler ProcessExited; - - /// - /// Called when the server process has exited. - /// - /// - /// The event sender. - /// - /// - /// The event arguments. - /// - private void ServerProcess_Exit(object sender, EventArgs args) - { - Log.LogDebug("Server process has exited."); - - Process serverProcess = (Process)sender; - - int exitCode = serverProcess.ExitCode; - string errorMsg = serverProcess.StandardError.ReadToEnd(); - - OnExited(); - ProcessExited?.Invoke(this, new ProcessExitedEventArgs(exitCode, errorMsg)); - if (exitCode != 0) - { - ServerExitCompletion.TrySetException(new ProcessExitedException("Stdio server process exited unexpectedly", exitCode, errorMsg)); - } - else - { - ServerExitCompletion.TrySetResult(null); - } - ServerStartCompletion = new TaskCompletionSource(); - } - } - - public class ProcessExitedException : Exception - { - public ProcessExitedException(string message, int exitCode, string errorMessage) - : base(message) - { - ExitCode = exitCode; - ErrorMessage = errorMessage; - } - - public int ExitCode { get; init; } - - public string ErrorMessage { get; init; } - } - - public class ProcessExitedEventArgs : EventArgs - { - public ProcessExitedEventArgs(int exitCode, string errorMessage) - { - ExitCode = exitCode; - ErrorMessage = errorMessage; - } - - public int ExitCode { get; init; } - - public string ErrorMessage { get; init; } - } -} diff --git a/test/PowerShellEditorServices.Test.E2E/xunit.runner.json b/test/PowerShellEditorServices.Test.E2E/xunit.runner.json index 2719fd14a..f1c3b37cd 100644 --- a/test/PowerShellEditorServices.Test.E2E/xunit.runner.json +++ b/test/PowerShellEditorServices.Test.E2E/xunit.runner.json @@ -1,8 +1,10 @@ { "$schema": "https://xunit.net/schema/current/xunit.runner.schema.json", "appDomain": "denied", - "parallelizeTestCollections": false, + "parallelizeTestCollections": true, + "parallelAlgorithm": "conservative", "methodDisplay": "method", "diagnosticMessages": true, - "longRunningTestSeconds": 60 + "longRunningTestSeconds": 10, + "showLiveOutput": true } diff --git a/test/PowerShellEditorServices.Test.Shared/PSHelp/7/Microsoft.PowerShell.Archive_eb74e8da-9ae2-482a-a648-e96550fb8733_HelpInfo.xml b/test/PowerShellEditorServices.Test.Shared/PSHelp/7/Microsoft.PowerShell.Archive_eb74e8da-9ae2-482a-a648-e96550fb8733_HelpInfo.xml new file mode 100644 index 000000000..80a0b57ae --- /dev/null +++ b/test/PowerShellEditorServices.Test.Shared/PSHelp/7/Microsoft.PowerShell.Archive_eb74e8da-9ae2-482a-a648-e96550fb8733_HelpInfo.xml @@ -0,0 +1,10 @@ + + + https://aka.ms/powershell75-help + + + en-US + 7.5.0.0 + + + \ No newline at end of file diff --git a/test/PowerShellEditorServices.Test.Shared/PSHelp/7/Microsoft.PowerShell.Archive_eb74e8da-9ae2-482a-a648-e96550fb8733_en-US_HelpContent.cab b/test/PowerShellEditorServices.Test.Shared/PSHelp/7/Microsoft.PowerShell.Archive_eb74e8da-9ae2-482a-a648-e96550fb8733_en-US_HelpContent.cab new file mode 100644 index 0000000000000000000000000000000000000000..9be01fd7f35819eb07c66a332a4377f9045a20e8 GIT binary patch literal 5388 zcmbW5MNk|JkcIKVH4}n6gS!QH2=2jyyUhT>ok0T(7J|D&nBX!57%YKc!3hC^LvVNY z|95LIyN9jXS6%)3eWyNlwWhv;GRi-~2maepP`LifP|#6PQBePxc?eNZZ2ocde^L;~ zzvN%pnSwg#Q8b-xA)elz4n90Oo__WaeJ6W2Hy$~Nt&{V6d+vXN7mvTY8w%iJJhc)B zC0s%MkmeVJs_n8{@DY$f)FP$8y`@n(t;_6a$D$={JDQ`G3~H|FSAkj|MrLQG$&9Lf)<6d&KL7b_s3ZRo}r7V>zyldd4xjDDduL z29?tAM%M}IE{$_U+{8sBU29&n7weeTeZlz~!n5eSh*stQ5W#Dut-E7n)B$j=aAS8L z$|x<|;ifoo9ET8C+maA9ghQn3>ke=!|*#aP>PLy@qewDRK}MA&&x$qZ1+ z3FgL2TMnILPI@*y@sGdt_+`>|*wPMstw2GJ#O=OS^^=NS3b!Nfn;i*Hj~`!EmNJ+U zZN&A2Pmg+I={fIS>V0?>IjqvbRd!i~8wyJ7JV8+1miAst-=5hISPJie)QRo->eE|E zB#OcUE0qE-CR-he-fX1c-Lv0c5s`Z~^xPD55M7U|@Te8d!!=mr*@BcaYa~&3#y(PT zNw^P@VLt71oQ9RMQOA7cQ9N+}u4YJ!$g(f_Sd>Xk`>`rTBpnNbY)9C5j#Zi-@XO`+dU;btHIH{!Fnt?XL;4r)0V zZ)%Wy{^%rvnA86ZcGB>InD@wEmq9JsrY6sfmwT{Tb$>x&T#lKGd<#ueh#)4dH}v@^ zBxhi!rZud`1yv@gWHDF7&b+34@-49dWRjlSp|U+lBoM@rrkT+ETU*5AXPw&U@ti{B zyJ5Dk+q-Q8rAH>mP%LxTd-_H?my;mkqWaH+(Z3AE^m*7UC+m%s_vQ~Xv=rutDmdY*H0$O#3AOvi?QPgm4x zH|>|3AlWsb=L-@;boWthP?xItejZ+wVHuLIRA(^u5z%}T2g0GMabHbRal%>|{@mHV zwx*TOjvIErf$-lHQ1+B9qf?WPFy)**$Bkk>cn++%=~ zD||$V!d`!L=>5Dp}X{KKsSKKb;KL}hF43 z#Oa0mp{Y?PcjyMVTR4|tGV^`i-izCf?antp30PX{u0-R4Xn2)G%hisFS#2D!qH&3K zza5~t34W*Eu{;KvCeBB|T8~p`BWRwvj2=>#yx`+f6#S6F1D9_bX?_j2c37|Vb%z&= zo`x`LYUpn|N(dq4AY&Zi7K_!AZuTAsgFgzR>bUGFns8$#lrvPJ$o=8a3Bdmo(VOVNuwBuZfm#mjvy7;<0<>Y`lj@CF`JbcxJ}q9oxpq$XRc*4Bf$s zoh$%Sq4@7&(`$C>NJ(J?N)r_{97eTY0DkTp3vs7LY2_V2Q~_8iiUuXoBUEJdgo_0< zt68SAv&KlGyKh!Q?qS|dP58@)o2=KdzFx#Vd`CseU6?V8pFwA4$tLxLAsE#=VZfFm z^Y}qp`ONDe^a;Wh&EL4)Ge61Q*R?4BN}Uj5J}QLTIsW$VSN}?kDF)wdZXLN^DdDX8 zv~keLaOG$~<0t(bdpph|x-C9^Nt?0rp)EqXY^6%#EAAiZ?W$XuB5J_+R5{YbW5i2- zCGDY1c`nU%zSjkMx{!Hkah&=1TAW!aWFUdE^15uxp2PPGfE&78)oTR0;^8;^AZ6#L z;l`uqcKo-K>z8h}zWvW!l{!)N4nxls$K`^`d$x6fyj<=t`W-&*>G%mERr7XBe*Q&b z*5ZpAXXZKP`_xOQFW1RLmqUr~iQlhxr?e#sz%~ zs?Rm@9rq>mcd{!Q?`Nj{Zro*qvUen88LmBgXlitOZ*emPcfQ<{GCok!HKhN!-}uOatbFO zqPIapGR3zzW7n(mtb#HybwrU*T#b zC`lmQMq!(h@WY;z>od)%M!V6JGA_PmCYA(*WELVtVabs-*a7+fX%G4OPvh)iI~fxV zx9KvpqS8HA6r1x09J=N%T)d#oR!>0@LLY;uv#*%1TZz|=J;VEBMa?1A=362MbX{39 z6<@yub^Cn&IO;!`>AI!GY@1VI=IEkn?>@#a-So#s!TuHtHfAFzbgjL-F@+|LCU zSj2CqB|QjWoY@ zT#^9Sk&y+5eaBs~>%wFG#ad138&BHOQfZhLJzP6n`(~=@&1BWFc3o`VpNKB9Uf-Eb z5dbqPb-}c>m>7NI=dI?npfz89&I9yG=6%1d8wLmM@E{<|OlO>(L#nCz8e@v}AN#%A zA(){}Gv;~~JB}FBAXn~M#%sm8SrHO}Ci7oehqY#MxQmVsS;naF+yFk3FCB(uyOifO zXn(3Cg62asLAP!Ks`Cs5DS5=q`BEep!rm|JJCq`JU#2*;a>_X7D>8~uB&iw&(?eaf zfmw>hgRiS9#TC-?F-g8LE059vQUTz=v4fB=^~DZDO?zy6Q8L_84pKjD#2WA6^Vq2| zJ+PAVbC%1@h{2Zv$EZ2a1VM5>{I*L0Ygvls-lQJvPM{ZMK~EjdtuwL46HR!@KY zj?{{m;q03xsx=RrW2Dk;ugsJ$5?@aXQ#O19Q#;#Yfe1OB%buCB-|(T^aY|Ubj^O8F z8FgSUJn#F*gv~4{%<$Q{Z-7<#PdXyV=$r?9ESt=E-qF=UCY(Lu4$k8qPZD8 zEK>hUfCPy*lb30>Q2d7E!RP+k;dBE+`d zyjuSJ`{2;5#nIL!bhD85eZ!eQ(GvW1>Ljh>n05CU)Vgp(u&}8CwFfHwu$uL5L5I*X zL8}Q!2CyOEVfr*#SAv~$Yeq4)1%`etnS)~&UiDzRQ$Wfl2UBBz;14>GbdlhR`6FTb|iMauXw( za&?5q@TI0xFH?q`B`|9fyi2@g5LL68Bj1v`z%i|u<>MQurw3{kQc}LNM9djyH7n=c zy~yLzsS=Bi@fj)b>aLlqssB6kg?_3yz_l8Gk`jgimb*)Z>-ey9dg0no>#IsNKL=Ek z4_$Nma?PNUdKhI#6NXgo!BYE7VYsGMnk>;D1##tu3(!I9S<21*acRo&!dptFsf{HP z(Ww!pBr>f1t3%0E!gh2ndkyw_kY9as(;RMwcKb`cbCt1vK#Sm}{2vpNos-va_lNJ9 zwaXg-pselT7?iVaB6!=jwR7GpY0gngRewDj%h0?%DbI}^{oQCm74+wk#qb`o>;h{} z&AYbVl8@k|a~B7<=oh~ykgZ1s2FkEAKut@_(SSIw@C=obpnxMzUzM9LzqpSW%?n|v zi3;-t>GpNu4jP|a!tqWzkvRgSpNBKbvj)4lxZc^0^)gp@@U8V{o zx!a2g9qnZV7O>G>jyI>0VA(^D1h#IAkY6sK(bnxTr9&PWokX0)WN&SYn(lJoTY=q^ zSdh)@Hscr6xuiDFZ7*g4KFqbg*1Vr3}3MWO6p&By*X7{**%oUi75CI*A*E?FD>n2sgReYX_EX_<+@6W0xVxpGrcFzk;n>RiZKX0zrMS^iDJ$FW z0XtDFPu|Xy8XJ2^7Aqlb#P!gb>2@_&@>kCI`43s5ri%e zbsP!bI_JJ;|7P~UfSMm>JX9!@O5qT#D|={)|3Zx}emeC-6pL3dEpB*Nc`$2I4svaX zh;YB4#wu<9feY320}xrS3q440M5Ln%yOs?n4`ucsdTuZMhw&=zX;)z8;3YT{EbJgm=c!$k1vQA{pXXb?6d{riU%3G}hr=Mw^nN_tSPTVE zZ-VG^E?YERxsdzs?Iap15Lj9wfDSK~kwQs8t8>@gfh>@!J84DPa|3C=T2-Ng86~B` zGu9|+{`6vnzmyGV94hwX6Zq2~O1U{#3}$9YQ>>t7eBO638#N7ntZsv!UH%7ooC~k5 z`yZr?$5r7+oMfl0FxiQ&UW`f!Dz%6PSc^ zXL*CZ4cXNeWy$th(M z(sCA`)zu-*olks41(@h&AWUJG8K?USzvy3Jx6;KK($Q3T93tj;KuN$5JpuDL-TApF Op~S7b^Wka=(SHC&%}Xr+ literal 0 HcmV?d00001 diff --git a/test/PowerShellEditorServices.Test.Shared/PSHelp/7/Microsoft.PowerShell.Archive_eb74e8da-9ae2-482a-a648-e96550fb8733_en-US_HelpContent.zip b/test/PowerShellEditorServices.Test.Shared/PSHelp/7/Microsoft.PowerShell.Archive_eb74e8da-9ae2-482a-a648-e96550fb8733_en-US_HelpContent.zip new file mode 100644 index 0000000000000000000000000000000000000000..8d98199a7914080854cd9c3ca7c7c45670e0821c GIT binary patch literal 5529 zcma)=RZtwvwuK?M1W1Cr+YIi65Zv7f?n4-Ca0`UsFt`&exLXKL!Vqi*x51s@PS5~1 z|2gO3)UCQzx4Y|Gwf3&v&)rK)6%Cyj1qB5gg|*H0o$PqPyQ9B0fD;vkx-t2hj!Dfx+C;5F3!Aw;k7C&!FZS z!47Xhe|DZ8A2t?anOPlxJKE{AmwC_guCP@<0plk3r0a-M9!0ubEgsLwc4>AW*A zBj&holzPNizT|`d&0)pyis$6^P-5$UKQwwjGVnHh&3x^>IhtJo97nY>C4P?FWqkh?Xb(?#wc_VX|_(YODg#Cc;%(uSZ zFlxUelAVCJJHvV@uzjPu=2Wi3R zOL<>nA|eGbJh^nmI6`xL#PJb00Qzdc*p@|AAIfaYF|tI;4QIaQE<7Xt z#bbXg9M5CdgtTkAK8))_cl^xTbAH8j)J}+j1z$s9%b*S$UfbRLLGk`H15}$&A330i zUT*!Xs$7(Q?#)U}5%bH+sxWgo<)rfFi(NYW{D8;hDpWs*D;|}Pi8v(53!lBnAJ61R zS?{Z|-x$k7Ej0V+1{1#Dot|ADjmbS4Y2<^lVS!><@>YX7krk}Q)S;)WI|8l1iMZFe z2Y_FNcT~y@if#?O^mMw(_Kr^;sS)#H1<9}x;xl&p7g#WKcht`_!Y?;SwqJcMeug3h z)d|uk__R40=x_b{g9JH#a6RXy=xc{tobotwqSU5!hHtd9c@)f6REeYrWhT~JJI-BsU6%5L z@;<824<98tPs9i_kAWv>LyzVmOK2Ee=b^s`DMpyYt|x9As$Bv#cG8-H0;gy|z98nYy{ZYv5=O}`^Z;u{;mPyw4I*+jENW3k~; z?V`V5PN^=K*Se-Hu`3eAW1efZMr&h%@PA%U#c0xXHvGnQPBGWLq)mwq=1#2J(|iffn4o=RB%{s<&p(}$~|O%?mg0NyF5%KsXw;ChU~D%$R3#!MBjGG zX>C|bWGmBV&jR^+y1-V{4ZiY!Dtp_2gXn=^~E+Em0xMYwrgT)DO{=+-F)L^V;GgEY1cj94fP3 zldpqjD)Su7^v9_Br6W}-x)`|hQpQhvtF?zROOq=dX^EKY*^B(v6rAJ3K2=An)_fXM zk=49V?i=Z4pipAVjHb33ZfYf(6oONb^TKyH*w!n%G#GC{*0<&(&qNy~*LiKI+q@O5 z1XUE!$nCZyVBAu_02V3>F7QmuqvEKqtq(Ac6-K&MY_bz}LZ{;;qF0;yy|rEFbY@>$sk5*7aW&%LBHZ>i)?4JeP#N;qK3VBWtZ3^b#Uxd{G}Ncy0x0Wr! zF~-dkp?tS(NktmCx^2u?r|Vl1Hw^}F<{ZIv>S|LmmzK)Ypsm{tLew1`5g5?y*XM~| z>3!n_nR!l*TyBP;7-u=ndTGf4Btry~T(50z{b)JLpk{KW>^Mt3g%&J|;x?OD*^?Zq zQX$U?@RBO#7T3@vepz~hSpz5!i&cYJh1AA815fyo_9k$S>l~sQtIyVcH*;(`huX*pHNI>6zPm%;X$)K9|v=@YY+2q76_Z4x3AaUz10i zULK-;2>-M2De_A+;1oqv{Iw&$-y}E^K`Vto)mw2=HgUF4K@1QE{TcrUZiVRQXR>r} zFaM3+fa0dWe>yD_UEKt33;U;eK(xs-9Lg!Y!b{pKv9hyS@y@r)mAxR_;J8E(aZqban) zMzf}dXuES?IQ-C$3!OLoo^WT85&P6N7#3s2BKQ;<-jxMR9Ep``5%|h0)>l6r^?hCA2DN!x@kEC48#yvW8L+)@^*|xN@w9bbW9cTf?-*^c z3>XN9l>uqBZg%n(rX=mwbxHpNcS5gO(!cGkdBwb-f8aBqbCtB?vKvf~T2Q0D6AYUQ z5l$YlaLnBwFW_#7(&i6btz9$+2$qrS%TfTPGY&6iJPZMk4Bz z`1FM4Pm+s8A8Akx-GA0uDdawDV7aE<*|#yfqbcDM__$^DY;Z?2@bTx4Cao55KhHm0 zGI-;H?LUAJdZmx$-~5UGZ!8sIe@T!CSh^X!=tUoom(P2+7WngDhZL@NLhB+c2WOKF z;-6-dJ;{swmztn|(TupWE&m6*-&kdX>|qY9!Wc6&@x1rLVFS=HH3>D8+hMtbmAm1v zF}0ijji2%7_5YORVx=y#aPqTG|BYx&jK4P><`ELrVphKOfai-f-?Lxc3MJ$m^+Lz$ zjwD0Uw~+fS!`liDomq(;0XgnRQUegJl@|H|nlMop;UDY0RL-8poZBw*Z(YbL4(|Go z&KvdLnfC$AIRPz<6iqIirA?+CPmY;fnlN8`Gq$5fn$PVK6pdRslevDLy{jqR7(cxP z6GSivow7EOumeunKN=_<9|am_#a;?&hudJ|kT%SeT zVc;#J5ns0$_2hs%EE|{YE98(e(W6UE6O1?sh6%{`(Fz04pvR9tM~EGK*IY2%OpY^E z2s?0IY@8DR8rMOyK5-VUneINV%@n#qg}l5mGbJcK#PO^Hq0eG8XUW&6kIQRlomO7{ zSxDp>GGbFgVRGe|%9<#@k8NgRI2(S%S!5mVRDd6m;aK(aU+ zXch{ZrU|0%{G=|a!Zxp-xYNXq-8hmt&z!o z58x3|TK_5bLzk;~s5TTE_`GDBhpb0AGZzrBS}rt{WyP0Jg!15cz}JzK9>dfT+1{V% zc}er?0V!~r))3=d+=+Ggs0kq*W@%FEFsj_xS|N8>Dr`!{OAysC{W?tQjT?w#KnUep z$bJ7XRsMm!ZxGyp?-(o|gnYtmlA}llOG(0YqP|npWH3YkW5twrOH3vDOIarq$gVj4 z{snsXS)wJp8F+`okt9|uL8qE~;zRf^v7Yf(pTP`fI1ZC07GuS0i8UWw#)YZVWYK3Pb7s{>{gWgEe(+C|*2iTHn6NGF8gM_g_P6h?7F9 zg8n3Q>N^iM1zBG;U-IRwGwhAP*?w2+SqLRzggNj$A<|=L65l?)G8t?gLEY1r5pjix zzpx_3UwevOF+V!ie)bFNX|Jk>f-qoCv5WQP{gl4P`G+o2h392Hc~ukj-58WlCp^L0 zk^HwsSznVgAq>rZ+iI+WWQvf3TNA308Tar4V2$<*$(^#WZ_mY^d2YiM;rMCGDu+5G zZpS&69!eWgh>+`4oUY(kr$f|W@d**noU`0!%1s7MgHU=#d)fU%gvN*w;WY2xA%IR<6C5#nK!{VJ=jZ+txuQ?{<0DA!! za|@kYo|ACRtr6S^Tqf~wu7KLx_hN?2VwyDBjN*H6s3Z>pM6tdaD!~HIW_>jg-lu)Di19`|JH3DQNxneu5NiyR_9G(_HMp3 zRv^K7_x}CVO;d7}*ruXtNa>vkwqfd+|Bfun^6ORw5eE$;-HjFky^^)sEn6yz8;vVD zwp0RdnleDjWD7l@s?xjdM|DU`jYJ{(?s8@e3wv;j>#A0xHinvtxZwJ1rx|oW1*Q0T zTx2qQL*_6^*yAd#P5p6OJes95WBta6XDv4_#T;*}SxSS9H{XE2`2+-9Xl5gn!K)9<}db=G{E%V;Nnaf=6w3VUP!l&9D&mjIX&M8t``;=t#G?|@j zMPoZ6e9%l0UZi7dWLHNW;}5NBbm%TlAc55FqnMfeiZ|O$YgIYF$L-m+j-#)ZLzS6e(xUxI-%s_as&Xk-m3|->d!T2v zy#7$nauk*`M@w+^%7lO89HoU3pPoj&N==_YbpZWu>lbEAFoR*U?*<0iMdXog*A-`Y`1|gX$)nZsnx9b@R+O67VfRB*EMiZlp?(Z5*3xKqIUxbc1EfaZf?NIPfqO zhlC+%=x}ului-XUv!P}Pll}cSUGK;DF-QFzgP2Ua^bxVQ5{R>?s9f>&K0sV^+g09& zqwU%Fkqnj(^FMJK1uAgc4L|vk)ISHEmxca)=;`**v4#j=%q%-$u?jnHx*RF`I4J_S zH1h(coL}tv40v8h^V2aeGWMVSOO<8q0?xJ{oD*12TmzPTgBR}?0jOV_EY{mo2xla; z2!GASTP{P#dQE#B<|ljaj&BzEL^djJn*Io5`#ptc39TI?uwB~YegK%Cpy^J*Mca4l zcy-paUt;EAt`(kR8-7E6gv@1c@m3InX0WQiiiXU`II;HbYFZPyb~X!U{!>eXQ}@An zz2~$)sPa4TyENPWY(l&t*4)k1#L39sZZq2C?*jy!n>Vr;^eMA}1 tilE2yCsZv})Mvyf|94{gH#GgP_5aFGwNx=M|CvGkyLJC6FUddde*n|UwN(HB literal 0 HcmV?d00001 diff --git a/test/PowerShellEditorServices.Test.Shared/PSHelp/Microsoft.PowerShell.Archive_eb74e8da-9ae2-482a-a648-e96550fb8733_HelpInfo.xml b/test/PowerShellEditorServices.Test.Shared/PSHelp/Microsoft.PowerShell.Archive_eb74e8da-9ae2-482a-a648-e96550fb8733_HelpInfo.xml new file mode 100644 index 000000000..1b6473db8 --- /dev/null +++ b/test/PowerShellEditorServices.Test.Shared/PSHelp/Microsoft.PowerShell.Archive_eb74e8da-9ae2-482a-a648-e96550fb8733_HelpInfo.xml @@ -0,0 +1,10 @@ + + + https://aka.ms/powershell51-help + + + en-US + 5.2.0.0 + + + \ No newline at end of file diff --git a/test/PowerShellEditorServices.Test.Shared/PSHelp/Microsoft.PowerShell.Archive_eb74e8da-9ae2-482a-a648-e96550fb8733_en-US_HelpContent.cab b/test/PowerShellEditorServices.Test.Shared/PSHelp/Microsoft.PowerShell.Archive_eb74e8da-9ae2-482a-a648-e96550fb8733_en-US_HelpContent.cab new file mode 100644 index 0000000000000000000000000000000000000000..15ab9f029b0fa7babd0ee46f2c294776b978856a GIT binary patch literal 5137 zcmai&_cI&}*M@ag?%Q*u7o0hU<{A(1{tg}EKg7cW{WtIk@$vES|GGFe9v<{> z68>!n%6~Th%u^e9GdG^0o0GSvkEgS*xQS-~%-h@*=HVf(=I!L_<_{D5TfD>r;U0KF z&F-U$0K5ndeVpBJ8atY2Xg1-%D7auae3jJ@+K0Z}V4N(E0xGRhhrJ#PS< zIPZd{f<_WoQ8$!-j9wVb%hT4IiaV858$Bk8l}EU3?< zGbe1TnRkATGkUeCpxok93p3a4{Z7 zifM+^iSiBG30xja)ns;d3|CT_r-Gz+LH=VHj~N{PaU|hS+@W_MIX7m!YbdcKk9h`-VvlQ zc{-9e-NZy{aO(xv3=XzOYoEDcjrGr1e*fXBebRApsl6V)P|ei>im)G)%H}KHgjYPQ zB+8Ywg^lf2vsp2&Ru1rmYFnJMT{h9ie2{1$dE+T+()VP0fpX~UJpXri9$r;}XM9cj zOYF27b0JUuLRnnP2r+|uewG}+S>5|z;u1C4bh=EW1A5)<=Ec^(p6j~5Gb{{e4Vf-J zim6#p*$`WaGX;lC2JgGK(K}Nw*>*wiNMbsd8pe@A#{Sh?FS8~CK^S2Ud(V)Ku@rp2 z!Hqot)nda^M64Z#N)4uBu^h>5sbHP}z^pwuilM*Pww*Ke{(E8!&EZObu>Pw%?Vy2y zJmV$RyCLTuK5$>*qiQ{ zG;Kg%QC-&rP}t)ztwfsj*6k5Iy({$bSI+s(*VTb52Xw~tGT`}k?PM=@q5$-k9jZ+6 z)K-nTt|BeA71U~^*S9p|F+=iF7joZ{d(a3~wU-j2X!jnK=LCbKXaSVr{1)^+h);4+ zE|L&}%3FU79kb?EMphd$`yGY$AogOJbB@;RB6qp?KD4qo7&J@UD|g=p0}RXma4`Hk zl0_8(Ju+~6(6=td=j7EZ8u!u`9syu zQFN{*i#AkU(8o)@@mK*SE7(4N{DbR8z|4_5f#fWV%ilG|TIv6ua(yGXXz!Q%)^e*H-}Rp6X<11( z@y=~E6!zaE*cV5C+xuNQj2zIBVb^W*p;z(aHKSevN%#{#f%pQ!XOSaKI(<~SY6vXy zr1&{pV-%sGF>2MVPI;z$sblK8TC}2l*XclVUhNrUQ0LnS6T{V4q<4YY#P%hvAETV! zt~eJ^iiqc$MFbESU2{-WTC9a;K#BMyimo@2n{jPXb_cMzy{k^*-EWd#5}26-;9nhO zMxOH`*FMNBl;}^=)gab{^$=UXVVb{S0pLlv*AZVPYUh)q|W?YIbGku znFy4bH^&&JC<2hboB^o0qtnjaanGr@A>GNdQ%65OET1*o*#=E#5>QZlkb>2!y^y!s z9ZP4D1Pm#f-m?}DUOXRSs^&9k1fp5J16=7hrQJD+exvf($x>aIeQr949a{UQ3jKmYde1+z(U-KPA3LmI9e;bc&?paNW_6CM`L-|b z+$eKGSDJroIT7j2&#X;m(X~$nQ4Ev~6CE1(W`as+M2QD36OvzEU4QFpI(*F%D(vm$ zFs`-c+qqOM|8VGq|Dwbd(6Fy|v@d(VXNz;z=&c@ttIL~vbv2%whcB8=jynC1R9%b? zowT%tDJl+MSzZux5rK2&Kbspyvjt>rNqRf!Bpg0{rPy>d=}OWfQQ9Si%kpxNJH62N zv0Q23aTOqJosVdBQ8Xe{{)`}qgppcyvS#c=4b6Db=D+MtzGLcS`TUTuPN z0dh3Gzbx7u9%qq-v(GBuVY+7;;zJ7V)*rts)qAy}_oarO<9qv|Ptxsa%uIm@jvzL} z=a`x#ayM{)>|veLVxzL9D+_QksVj4VviW(-Cx<72;XOdC0&COdyoH~Iyb$#*_8rtW zWQ{?rjtn5chfH-)j|BW*LU2Mhc31TcUYqgi!Is#K;;m4balT33ca*2QYi=);@O$R# zzMJ=W=k_(;btN5^vEhfz(8kHp5CMDn%Y;ui8a0l#e+U5Kj zu>KZ;D&pp<2UDxI(rWM(P}XfstmFpu{E9a4!PHgACtNt!{`m*jNA+t~-2@tnrp4cW z1gt74=RfY8CJz1II8%G56c8h5w*ts&@^Yj22Z?P4wn)Qk@1lk(7)5@5b0Xj zF(-OizGm9f_eqJN`1{I**hT8AG@I$QPqkT7liqADCBD@Q39JE&WC3e_xEpPB0Hg_* z-e?34kp(x#vY8#-cg^ratrV!v|EA$OV(POOWj!|6er z(^zfiNJS69+qmds`8y$>S!&*btP@0<2`dLI-6Ao@^b3qyV{}BEYF*ge=jsMshJbuO&DV%X_dR$SgA@)8rv&R$Ky zk9#adqMv4qlID;_8-EsYZVAK7(Y&sqwAaJ|ylNwn)-11d@@U-wcB_)0&){2Y_Ik6V z52_$BV*D~wWqrZ(eh{yv%???%P0jG2Kk+Q13lz?9)FmEen!dhYV)t9{9?RF-z@I(g zIYm6WkLO+Ki^8d;qPdJ(y zwd#o?Jc>7l+ic#*a%h!4aFCq4czqHs&&DU$?6b%Fi%CIKbH|E}5`s?3L}GfnlZPUP zA*f#x^wa)%EdFo^L4PX?hTLnOcyB4uKz>)e<-` zcxgqKN}`NM$k#f|b51Z_?qI5XU<}@r^m<2!uc=xcfjQyf2)^mXrR(UWSV>5HUyki< zAno@s^Np9ZE=4dB96F0Xm4E5&2tA@ZFp`0kguH8>m1Zj3<_ExvRwzxG7hS|+jI;aX zTjnBFmWbQ>LPB>B_eGQnpkoAKpwP7B*S}#^AkBmEEtbfl7r)xhN%uNkyAuKmi5W+J zIHbnub{O7Zl;prR_xhfi4=F1@vv*m+KXEjBTd4BDvdjNIv7vomd+39oByKS8goR`P_KP7H~I2o$bE1@w<4|yT|@lQYD61qk&sqloofADvQgWIhG8gwMzn~ zocqNyHpWgz%A`CiF)(|^PHU{z^?{xN`XN)jlC4MxFeSfV7X8f$%m1xqn~xNTfkF7{ z1LJ9yMZu)U6$>t5RKRvJr2$vA#FR^+GIC1%dBJq{gmNiAUtNnbL1MpRee*)t@VQf? zpYB#qh4In_K@2(8K}UI(;e*whO`~6)0(OB3+)A18%7b?u7-FijtY&60K%blYMxDuw zN=^lI+Wpa|Jmo?}^?F!@VY+|NblAa`glVzNdk7vMJIb6W zJ-ZVQT@y(;ucR*=zgh2QnsWKQrqSAJ<&`|;Vnk;CE1ST=uDQ{`k>{RWfBwhl@4wrz zzK#{XgzoR#Co}IM?*zhieE?%PB$__`Cud?5K5qqHxs;YbwuC1O)|4V*rZX_sY{c_e zW7K)1eRX)LqXHqc@;DY7;6YF;5saqKPgXTzlK9ETL^(hae_6N{Tk4JEXd(4jQY7%9 zqlR{It^OFIx=GDqIZYv8CAn)}PnlRAp+F*W9oa170lcGg-OiElstznp^HsK=w#x-rRQka(;(XuNMC`K(Z()*Cf5&^5$E>Fz0L^_@e6yo+h+7Uog4g}DfOUNYrJ!Nj^B$Pd0+z>`rJL& z-)aq*dmL*nBW^#wV8U_Poy=I?vioTomQr1>D}A*m@j!Lq(Lrm!-%lMZ_go=7ozn5@ zKooJ3Iic}xv3o;*{BiunF|AsucaN%eBj+!Vnt|`!&*S|Q(+OLhWAZc*T1=95LUWjj zOmn%Fhtr#LbI(k?f%o6hwUN$1)hqjyV2SnT%zMr}lOF{$Ma&e{nq)Lh0L8B-TXk$aOh|0_!k<;)$1&@XBn^e2y$j3+7rC zB(S5H%CSaASp}9z?ao4rrYEM_+s~4y<`A1 zMFAPy#!r}ZX;~i=G?D-L^hHuZEz3v%C67!lEcaSemtyTATk2tGRQyWQoDz4gThxfB zQA}RYIu3t%=^trxNSXn$@6~L$SO6s(*B*uDa0V!p2P2eUDtBA(W}PK%^e) zgQr%&NA!Pm#w8s~rI~>|6b^5ccs+X)dzTQitEd?6}`>bu{N8PfFdB}#bfqa1d3KOvfu)j8B#_|q|5tci~4-8Drjk$s6$ zL6^E-lEKULCo04mLV^SesmtJRe*$=?$qZe;l3X8@coR{;H-)}Ib)vs^KHC}g?(*Wr z&}_}|?p&lbF{8^(D}J`_O$tx^1WEcQ!rt019ok4R*QbHs3OhHOs_xoQGLmy8jK4); zslA>tiR0bsT^f)}$8;xix|l0jjCel0c*KEX6^(|9wXh;kpRxFo?$LcIUo%9t>^ejy zXCp_$Xa*UxCIUWM?Y~eUK6@~)N$EVFFK2|sBciYbWV2_ zHV$YV_P>?2WtsAFr1~GINUT8kHhAP|`u}wH{1zK+oOB2;lqstWT}sbrDS_oQ*)fNS zHNCI=wfeej-{8@u_05MS4)HuJngI0uHsymiIlfenPih-mvy)y1?tJ^)c<{$ zY3Q>nsra2-PmCX%$E{qHPhh;Rkd$E_j3Rd z2ldqDx0GT;YD_`&`HEvCt2*Gj#k@>#RVJw+J#WgWFLWI5U=IqLOHCi9>?QL*^Yjqm b^C$T^VtsPyw0u@Pw;A=BDkoC3i4gBU$#KaY literal 0 HcmV?d00001 diff --git a/test/PowerShellEditorServices.Test.Shared/PSHelp/README b/test/PowerShellEditorServices.Test.Shared/PSHelp/README new file mode 100644 index 000000000..0feba607f --- /dev/null +++ b/test/PowerShellEditorServices.Test.Shared/PSHelp/README @@ -0,0 +1,3 @@ +Several CI platforms do not ship with PowerShell help. The build script updates help offline using this information. +As some of the CI platforms do not have internet access. +Linux servers use the zip file, while windows uses the cab files. diff --git a/test/PowerShellEditorServices.Test.Shared/SymbolDetails/SymbolDetails.ps1 b/test/PowerShellEditorServices.Test.Shared/SymbolDetails/SymbolDetails.ps1 index 31882d033..3143ede56 100644 --- a/test/PowerShellEditorServices.Test.Shared/SymbolDetails/SymbolDetails.ps1 +++ b/test/PowerShellEditorServices.Test.Shared/SymbolDetails/SymbolDetails.ps1 @@ -1,4 +1,6 @@ -Get-Process -ComputerName "test-computer" +Expand-Archive -Path $TEMP +# References Test uses this one +Get-Process -Name 'powershell*' <# .Synopsis @@ -10,19 +12,18 @@ .EXAMPLE Another example of how to use this cmdlet #> -function Get-Thing -{ +function Get-Thing { [Alias()] [OutputType([int])] Param ( # Param1 help description - [Parameter(Mandatory=$true, - ValueFromPipelineByPropertyName=$true, - Position=0)] + [Parameter(Mandatory = $true, + ValueFromPipelineByPropertyName = $true, + Position = 0)] $Name ) - + Begin { } diff --git a/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs b/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs index 28a51ae3a..038ac3378 100644 --- a/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs +++ b/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs @@ -21,7 +21,6 @@ using Microsoft.PowerShell.EditorServices.Test.Shared.References; using Microsoft.PowerShell.EditorServices.Test.Shared.SymbolDetails; using Microsoft.PowerShell.EditorServices.Test.Shared.Symbols; -using Microsoft.PowerShell.EditorServices.Utility; using OmniSharp.Extensions.LanguageServer.Protocol; using OmniSharp.Extensions.LanguageServer.Protocol.Models; using Xunit; @@ -34,7 +33,7 @@ public class SymbolsServiceTests : IAsyncLifetime private PsesInternalHost psesHost; private WorkspaceService workspace; private SymbolsService symbolsService; - private static readonly bool s_isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + private static readonly bool isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); public async Task InitializeAsync() { @@ -756,17 +755,16 @@ public async Task FindsReferencesOnEnumMember() Assert.Equal(symbols, GetOccurrences(FindsOccurrencesOnTypeSymbolsData.EnumMemberSourceDetails)); } - [SkippableFact] + [Fact] public async Task FindsDetailsForBuiltInCommand() { - Skip.IfNot(VersionUtils.IsMacOS, "macOS gets the right synopsis but others don't."); SymbolDetails symbolDetails = await symbolsService.FindSymbolDetailsAtLocationAsync( GetScriptFile(FindsDetailsForBuiltInCommandData.SourceDetails), FindsDetailsForBuiltInCommandData.SourceDetails.StartLineNumber, FindsDetailsForBuiltInCommandData.SourceDetails.StartColumnNumber, CancellationToken.None); - Assert.Equal("Gets the processes that are running on the local computer.", symbolDetails.Documentation); + Assert.Equal("Extracts files from a specified archive (zipped) file.", symbolDetails.Documentation); } [Fact] @@ -903,16 +901,17 @@ public void FindsSymbolsWithNewLineInFile() AssertIsRegion(symbol.ScriptRegion, 27, 5, 27, 10); } - [Fact(Skip = "DSC symbols don't work yet.")] + [SkippableFact()] public void FindsSymbolsInDSCFile() { - Skip.If(!s_isWindows, "DSC only works properly on Windows."); + Skip.If(!isWindows, "DSC only works properly on Windows."); IEnumerable symbols = FindSymbolsInFile(FindSymbolsInDSCFile.SourceDetails); SymbolReference symbol = Assert.Single(symbols, i => i.Type == SymbolType.Configuration); - Assert.Equal("AConfiguration", symbol.Id); + // The prefix "dsc" is added for sorting reasons. + Assert.Equal("dsc AConfiguration", symbol.Id); Assert.Equal(2, symbol.ScriptRegion.StartLineNumber); - Assert.Equal(15, symbol.ScriptRegion.StartColumnNumber); + Assert.Equal(1, symbol.ScriptRegion.StartColumnNumber); } [Fact] From f2b242fa97500b0cf92316c955641b0d9be9da6c Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:55:27 -0700 Subject: [PATCH 81/88] Test PowerShell Preview in CI instead of Daily (#2225) --- .github/workflows/ci-test.yml | 23 +++++------------------ PowerShellEditorServices.build.ps1 | 23 ++++++++++++----------- 2 files changed, 17 insertions(+), 29 deletions(-) diff --git a/.github/workflows/ci-test.yml b/.github/workflows/ci-test.yml index 6a2f09928..5d1e6031b 100644 --- a/.github/workflows/ci-test.yml +++ b/.github/workflows/ci-test.yml @@ -5,11 +5,6 @@ on: branches: [ main ] pull_request: branches: [ main ] - merge_group: - types: [ checks_requested ] - schedule: - # 6am UTC which should be after a new daily build posts - - cron: "0 6 * * *" jobs: ci: @@ -36,8 +31,7 @@ jobs: shell: pwsh run: ./tools/installPSResources.ps1 - - name: Download daily install script - if: ${{ github.event_name == 'schedule' || github.event_name == 'merge_group' }} + - name: Download PowerShell install script uses: actions/checkout@v4 with: repository: PowerShell/PowerShell @@ -45,13 +39,11 @@ jobs: sparse-checkout: tools/install-powershell.ps1 sparse-checkout-cone-mode: false - - name: Install daily - if: ${{ github.event_name == 'schedule' || github.event_name == 'merge_group' }} - continue-on-error: true + - name: Install preview shell: pwsh - run: ./pwsh/tools/install-powershell.ps1 -Daily + run: ./pwsh/tools/install-powershell.ps1 -Preview -Destination ./preview - - name: If Debugging, start upterm for interactive pipeline troubleshooting + - name: If debugging, start upterm for interactive pipeline troubleshooting if: ${{ runner.debug == 1 }} uses: lhotari/action-upterm@v1 with: @@ -59,12 +51,7 @@ jobs: - name: Build and test shell: pwsh - run: Invoke-Build -Configuration Release ${{ github.event_name == 'merge_group' && 'TestFull' || 'Test' }} - - - name: Test daily - if: ${{ github.event_name == 'schedule' }} - shell: pwsh - run: Invoke-Build -Configuration Release TestE2EDaily + run: Invoke-Build -Configuration Release TestFull - name: Upload build artifacts if: always() diff --git a/PowerShellEditorServices.build.ps1 b/PowerShellEditorServices.build.ps1 index 116ae70eb..ffb24dfb4 100644 --- a/PowerShellEditorServices.build.ps1 +++ b/PowerShellEditorServices.build.ps1 @@ -263,11 +263,11 @@ Task SetupHelpForTests { } } - if ($PwshDaily -and (Get-Command $PwshDaily -ea 0)) { - Write-Build DarkMagenta "Checking PowerShell Daily help at $PwshDaily" - Invoke-BuildExec { & $PwshDaily -NoProfile -NonInteractive -Command $installHelpScript -args $helpPath } + if ($PwshPreview -and (Get-Command $PwshPreview -ea 0)) { + Write-Build DarkMagenta "Checking PowerShell Preview help at $PwshPreview" + Invoke-BuildExec { & $PwshPreview -NoProfile -NonInteractive -Command $installHelpScript -args $helpPath } if ($LASTEXITCODE -ne 0) { - throw 'Failed to install PowerShell Daily help!' + throw 'Failed to install PowerShell Preview help!' } } @@ -307,16 +307,17 @@ Task TestE2EPwsh Build, SetupHelpForTests, { Invoke-BuildExec { & dotnet $script:dotnetTestArgs $script:NetFramework.PS74 } } -$PwshDaily = if ($script:IsNix) { - "$HOME/.powershell-daily/pwsh" +if ($env:GITHUB_ACTIONS) { + $PwshPreview = if ($script:IsNix) { "$PSScriptRoot/preview/pwsh" } else { "$PSScriptRoot/preview/pwsh.exe" } } else { - "$env:LOCALAPPDATA/Microsoft/powershell-daily/pwsh.exe" + $PwshPreview = if ($script:IsNix) { "$HOME/.powershell-preview/pwsh" } else { "$env:LOCALAPPDATA/Microsoft/powershell-preview/pwsh.exe" } } -Task TestE2EDaily -If (Test-Path $PwshDaily) Build, SetupHelpForTests, { +Task TestE2EPreview Build, SetupHelpForTests, { + Assert (Test-Path $PwshPreview) "PowerShell Preview not found at $PwshPreview, please install it: https://github.com/PowerShell/PowerShell/blob/master/tools/install-powershell.ps1" Set-Location ./test/PowerShellEditorServices.Test.E2E/ - $env:PWSH_EXE_NAME = $PwshDaily - Write-Build DarkGreen "Running end-to-end tests with: $(& $PwshDaily --version)" + $env:PWSH_EXE_NAME = $PwshPreview + Write-Build DarkGreen "Running end-to-end tests with: $(& $PwshPreview --version)" Invoke-BuildExec { & dotnet $script:dotnetTestArgs $script:NetFramework.PS74 } } @@ -394,6 +395,6 @@ Task BuildIfChanged -Inputs { Task Test TestPS74, TestE2EPwsh, TestPS51, TestE2EPowerShell -Task TestFull Test, TestE2EDaily, TestE2EPwshCLM, TestE2EPowerShellCLM +Task TestFull Test, TestE2EPreview, TestE2EPwshCLM, TestE2EPowerShellCLM Task . Clean, Build, Test From a222792ccb1879095f6b188851ffa6393cd6c68e Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Tue, 18 Mar 2025 09:25:04 -0700 Subject: [PATCH 82/88] Remove unmaintained build script --- build.ps1 | 103 ------------------------------------------------------ 1 file changed, 103 deletions(-) delete mode 100644 build.ps1 diff --git a/build.ps1 b/build.ps1 deleted file mode 100644 index 913e907e4..000000000 --- a/build.ps1 +++ /dev/null @@ -1,103 +0,0 @@ -#!/usr/bin/env pwsh - -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. - -param( - [Parameter()] - [switch] - $Bootstrap, - - [Parameter()] - [switch] - $Clean, - - [Parameter()] - [switch] - $Test -) - -$NeededTools = @{ - OpenSsl = "openssl for macOS" - PowerShellGet = "PowerShellGet latest" - InvokeBuild = "InvokeBuild latest" -} - -if ((-not $PSVersionTable["OS"]) -or $PSVersionTable["OS"].Contains("Windows")) { - $OS = "Windows" -} elseif ($PSVersionTable["OS"].Contains("Darwin")) { - $OS = "macOS" -} else { - $OS = "Linux" -} - - -function needsOpenSsl () { - if ($OS -eq "macOS") { - try { - $opensslVersion = (openssl version) - } catch { - return $true - } - } - return $false -} - -function needsPowerShellGet () { - if (Get-Module -ListAvailable -Name PowerShellGet) { - return $false - } - return $true -} - -function needsInvokeBuild () { - if (Get-Module -ListAvailable -Name InvokeBuild) { - return $false - } - return $true -} - -function getMissingTools () { - $missingTools = @() - - if (needsOpenSsl) { - $missingTools += $NeededTools.OpenSsl - } - if (needsPowerShellGet) { - $missingTools += $NeededTools.PowerShellGet - } - if (needsInvokeBuild) { - $missingTools += $NeededTools.InvokeBuild - } - - return $missingTools -} - -function hasMissingTools () { - return ((getMissingTools).Count -gt 0) -} - -if ($Bootstrap) { - $string = "Here is what your environment is missing:`n" - $missingTools = getMissingTools - if (($missingTools).Count -eq 0) { - $string += "* nothing!`n`n Run this script without a flag to build or a -Clean to clean." - } else { - $missingTools | ForEach-Object {$string += "* $_`n"} - $string += "`nAll instructions for installing these tools can be found on PowerShell Editor Services' Github:`n" ` - + "https://github.com/powershell/PowerShellEditorServices#development" - } - Write-Host "`n$string`n" -} elseif(hasMissingTools) { - Write-Host "You are missing needed tools. Run './build.ps1 -Bootstrap' to see what they are." -} else { - if($Clean) { - Invoke-Build Clean - } - - Invoke-Build Build - - if($Test) { - Invoke-Build Test - } -} From 28b113ea5cc34628c29e1626981e6c90e5cd210e Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Tue, 18 Mar 2025 09:26:27 -0700 Subject: [PATCH 83/88] Remove unmaintained documentation This info is in the readme. --- ADOPTERS.md | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 ADOPTERS.md diff --git a/ADOPTERS.md b/ADOPTERS.md deleted file mode 100644 index ff80c2205..000000000 --- a/ADOPTERS.md +++ /dev/null @@ -1,17 +0,0 @@ -# Adopters - - - -This is a list of adopters of using PowerShell Editor Services in production or in their products (in alphabetical order): - -* [vscode-powershell](https://github.com/PowerShell/vscode-powershell) - Provides rich PowerShell language support for Visual Studio Code. You can write and debug PowerShell scripts using the excellent IDE-like interface that Visual Studio Code provides. - -* [coc-powershell](https://github.com/coc-extensions/coc-powershell) - A Vim and NeoVim plugin powered by PowerShellEditorServices and [coc.nvim](https://github.com/neoclide/coc.nvim) to provide a rich PowerShell editing experience. From 560cca3034f333b5a836632a0214a76ffc2154a1 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Tue, 18 Mar 2025 09:32:05 -0700 Subject: [PATCH 84/88] Update bundled PSScriptAnalyzer to v1.24.0 --- PowerShellEditorServices.build.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PowerShellEditorServices.build.ps1 b/PowerShellEditorServices.build.ps1 index ffb24dfb4..d2c7b350a 100644 --- a/PowerShellEditorServices.build.ps1 +++ b/PowerShellEditorServices.build.ps1 @@ -120,7 +120,7 @@ namespace Microsoft.PowerShell.EditorServices.Hosting task RestorePsesModules -If (-not (Test-Path "module/PSReadLine") -or -not (Test-Path "module/PSScriptAnalyzer")) { Write-Build DarkMagenta "Restoring bundled modules" - Save-PSResource -Path module -Name PSScriptAnalyzer -Version "1.23.0" -Repository $PSRepository -TrustRepository -Verbose + Save-PSResource -Path module -Name PSScriptAnalyzer -Version "1.24.0" -Repository $PSRepository -TrustRepository -Verbose Save-PSResource -Path module -Name PSReadLine -Version "2.4.0-beta0" -Prerelease -Repository $PSRepository -TrustRepository -Verbose } From 62876c53f20469ba7155fc5b3054720a9a8db98b Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Tue, 18 Mar 2025 09:32:32 -0700 Subject: [PATCH 85/88] Update bundled PSReadLine to v2.4.1-beta1 --- PowerShellEditorServices.build.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PowerShellEditorServices.build.ps1 b/PowerShellEditorServices.build.ps1 index d2c7b350a..3e8830088 100644 --- a/PowerShellEditorServices.build.ps1 +++ b/PowerShellEditorServices.build.ps1 @@ -121,7 +121,7 @@ namespace Microsoft.PowerShell.EditorServices.Hosting task RestorePsesModules -If (-not (Test-Path "module/PSReadLine") -or -not (Test-Path "module/PSScriptAnalyzer")) { Write-Build DarkMagenta "Restoring bundled modules" Save-PSResource -Path module -Name PSScriptAnalyzer -Version "1.24.0" -Repository $PSRepository -TrustRepository -Verbose - Save-PSResource -Path module -Name PSReadLine -Version "2.4.0-beta0" -Prerelease -Repository $PSRepository -TrustRepository -Verbose + Save-PSResource -Path module -Name PSReadLine -Version "2.4.1-beta1" -Prerelease -Repository $PSRepository -TrustRepository -Verbose } Task Build FindDotNet, CreateBuildInfo, RestorePsesModules, { From 8aedc86d737b88ce4a60d6e5192c4148d98cf1b2 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:20:30 -0700 Subject: [PATCH 86/88] Update .NET packages Thanks dotnet-outdated. --- Directory.Packages.props | 10 +++++----- .../PowerShellEditorServices.Test.csproj | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 428e28735..b90360e52 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -1,10 +1,10 @@ - - - - + + + + @@ -29,7 +29,7 @@ - + diff --git a/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj b/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj index 8d4ce9c79..6cd7ae849 100644 --- a/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj +++ b/test/PowerShellEditorServices.Test/PowerShellEditorServices.Test.csproj @@ -18,7 +18,7 @@ - + From 22d6de3cb43905e8600766e0c6ac480f6db3a866 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Tue, 18 Mar 2025 12:37:05 -0700 Subject: [PATCH 87/88] v4.3.0: New packages! (#2227) --- CHANGELOG.md | 7 +++++++ PowerShellEditorServices.Common.props | 2 +- .../PowerShellEditorServices/PowerShellEditorServices.psd1 | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 00db279bc..e45c183ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # PowerShell Editor Services Release History +## v4.3.0 +### Tuesday, March 18, 2025 + +See more details at the GitHub Release for [v4.3.0](https://github.com/PowerShell/PowerShellEditorServices/releases/tag/v4.3.0). + +New packages! + ## v4.2.0 ### Thursday, January 16, 2025 diff --git a/PowerShellEditorServices.Common.props b/PowerShellEditorServices.Common.props index d61f9a96e..0ffff1cd4 100644 --- a/PowerShellEditorServices.Common.props +++ b/PowerShellEditorServices.Common.props @@ -1,6 +1,6 @@ - 4.2.0 + 4.3.0 Microsoft © Microsoft Corporation. diff --git a/module/PowerShellEditorServices/PowerShellEditorServices.psd1 b/module/PowerShellEditorServices/PowerShellEditorServices.psd1 index 9f4ca3920..4d8955f2b 100644 --- a/module/PowerShellEditorServices/PowerShellEditorServices.psd1 +++ b/module/PowerShellEditorServices/PowerShellEditorServices.psd1 @@ -19,7 +19,7 @@ RootModule = if ($PSEdition -eq 'Core') } # Version number of this module. -ModuleVersion = '4.2.0' +ModuleVersion = '4.3.0' # ID used to uniquely identify this module GUID = '9ca15887-53a2-479a-9cda-48d26bcb6c47' From 1a988a964d9803a4b82d2f0f56b5c8a225b11156 Mon Sep 17 00:00:00 2001 From: Andy Jordan <2226434+andyleejordan@users.noreply.github.com> Date: Tue, 18 Mar 2025 13:06:11 -0700 Subject: [PATCH 88/88] Skip PowerShell Preview tests on OneBranch (#2228) --- PowerShellEditorServices.build.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PowerShellEditorServices.build.ps1 b/PowerShellEditorServices.build.ps1 index 3e8830088..aeaeec7cf 100644 --- a/PowerShellEditorServices.build.ps1 +++ b/PowerShellEditorServices.build.ps1 @@ -313,7 +313,7 @@ if ($env:GITHUB_ACTIONS) { $PwshPreview = if ($script:IsNix) { "$HOME/.powershell-preview/pwsh" } else { "$env:LOCALAPPDATA/Microsoft/powershell-preview/pwsh.exe" } } -Task TestE2EPreview Build, SetupHelpForTests, { +Task TestE2EPreview -If (-not $env:TF_BUILD) Build, SetupHelpForTests, { Assert (Test-Path $PwshPreview) "PowerShell Preview not found at $PwshPreview, please install it: https://github.com/PowerShell/PowerShell/blob/master/tools/install-powershell.ps1" Set-Location ./test/PowerShellEditorServices.Test.E2E/ $env:PWSH_EXE_NAME = $PwshPreview