From b3bb6e0baef4ba01d0fc9441359457afe9483a91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vincent=20R=C3=A9mond?= Date: Mon, 30 Dec 2024 10:48:04 +0100 Subject: [PATCH] quickstart --- .config/dotnet-tools.json | 10 +- .editorconfig | 2 - .paket/Paket.Restore.targets | 1002 ++++++++++---------- Install-as-dotnet-tool.ps1 | 4 - build.cmd | 2 + extLauncher.Tests/AppTests.fs | 152 +-- extLauncher.Tests/ConsoleTests.fs | 420 ++++---- extLauncher.Tests/DomainTests.fs | 46 +- extLauncher.Tests/Program.fs | 4 +- extLauncher.Tests/extLauncher.Tests.fsproj | 2 +- extLauncher/App.fs | 64 +- extLauncher/Console.fs | 180 ++-- extLauncher/Domain.fs | 212 ++--- extLauncher/Infra.fs | 298 +++--- extLauncher/Program.fs | 739 ++++++++------- extLauncher/extLauncher.fsproj | 2 +- paket.lock | 106 +-- 17 files changed, 1619 insertions(+), 1626 deletions(-) delete mode 100644 Install-as-dotnet-tool.ps1 diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json index 328063f..c3d0385 100644 --- a/.config/dotnet-tools.json +++ b/.config/dotnet-tools.json @@ -3,16 +3,18 @@ "isRoot": true, "tools": { "fantomas": { - "version": "6.2.3", + "version": "6.3.16", "commands": [ "fantomas" - ] + ], + "rollForward": false }, "paket": { - "version": "8.0.0", + "version": "9.0.2", "commands": [ "paket" - ] + ], + "rollForward": false } } } \ No newline at end of file diff --git a/.editorconfig b/.editorconfig index b897426..4aaa3e9 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,5 +1,3 @@ -root = true - [paket.*] insert_final_newline = false diff --git a/.paket/Paket.Restore.targets b/.paket/Paket.Restore.targets index 4deb15b..17aeb63 100644 --- a/.paket/Paket.Restore.targets +++ b/.paket/Paket.Restore.targets @@ -1,322 +1,330 @@ - - - - - - $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - - $(MSBuildVersion) - 15.0.0 - false - true - - true - $(MSBuildThisFileDirectory) - $(MSBuildThisFileDirectory)..\ - $(PaketRootPath)paket-files\paket.restore.cached - $(PaketRootPath)paket.lock - classic - proj - assembly - native - /Library/Frameworks/Mono.framework/Commands/mono - mono - - - $(PaketRootPath)paket.bootstrapper.exe - $(PaketToolsPath)paket.bootstrapper.exe - $([System.IO.Path]::GetDirectoryName("$(PaketBootStrapperExePath)"))\ - - "$(PaketBootStrapperExePath)" - $(MonoPath) --runtime=v4.0.30319 "$(PaketBootStrapperExePath)" - - - - - true - true - - - True - - - False - - $(BaseIntermediateOutputPath.TrimEnd('\').TrimEnd('\/')) - - - - - - - - - $(PaketRootPath)paket - $(PaketToolsPath)paket - - - - - - $(PaketRootPath)paket.exe - $(PaketToolsPath)paket.exe - - - - - - <_DotnetToolsJson Condition="Exists('$(PaketRootPath)/.config/dotnet-tools.json')">$([System.IO.File]::ReadAllText("$(PaketRootPath)/.config/dotnet-tools.json")) - <_ConfigContainsPaket Condition=" '$(_DotnetToolsJson)' != ''">$(_DotnetToolsJson.Contains('"paket"')) - <_ConfigContainsPaket Condition=" '$(_ConfigContainsPaket)' == ''">false - - - - - - - - - - - <_PaketCommand>dotnet paket - - - - - - $(PaketToolsPath)paket - $(PaketBootStrapperExeDir)paket - - - paket - - - - - <_PaketExeExtension>$([System.IO.Path]::GetExtension("$(PaketExePath)")) - <_PaketCommand Condition=" '$(_PaketCommand)' == '' AND '$(_PaketExeExtension)' == '.dll' ">dotnet "$(PaketExePath)" - <_PaketCommand Condition=" '$(_PaketCommand)' == '' AND '$(OS)' != 'Windows_NT' AND '$(_PaketExeExtension)' == '.exe' ">$(MonoPath) --runtime=v4.0.30319 "$(PaketExePath)" - <_PaketCommand Condition=" '$(_PaketCommand)' == '' ">"$(PaketExePath)" - - - - - - - - - - - - - - - - - - - - - true - $(NoWarn);NU1603;NU1604;NU1605;NU1608 - false - true - - - - - - - - - $([System.IO.File]::ReadAllText('$(PaketRestoreCacheFile)')) - - - - - - - $([System.Text.RegularExpressions.Regex]::Split(`%(Identity)`, `": "`)[0].Replace(`"`, ``).Replace(` `, ``)) - $([System.Text.RegularExpressions.Regex]::Split(`%(Identity)`, `": "`)[1].Replace(`"`, ``).Replace(` `, ``)) - - - - - %(PaketRestoreCachedKeyValue.Value) - %(PaketRestoreCachedKeyValue.Value) - - - - - true - false - true - - - + + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + + $(MSBuildVersion) + 15.0.0 + false + true + + true + $(MSBuildThisFileDirectory) + $(MSBuildThisFileDirectory)..\ + $(PaketRootPath)paket-files\paket.restore.cached + $(PaketRootPath)paket.lock + classic + proj + assembly + native + /Library/Frameworks/Mono.framework/Commands/mono + mono + + + $(PaketRootPath)paket.bootstrapper.exe + $(PaketToolsPath)paket.bootstrapper.exe + $([System.IO.Path]::GetDirectoryName("$(PaketBootStrapperExePath)"))\ + + "$(PaketBootStrapperExePath)" + $(MonoPath) --runtime=v4.0.30319 "$(PaketBootStrapperExePath)" + + + + + true + true + + + True + + + False + + $(BaseIntermediateOutputPath.TrimEnd('\').TrimEnd('\/')) + + + + + + + + + $(PaketRootPath)paket + $(PaketToolsPath)paket + + + + + + $(PaketRootPath)paket.exe + $(PaketToolsPath)paket.exe + + + + + + <_DotnetToolsJson Condition="Exists('$(PaketRootPath)/.config/dotnet-tools.json')">$([System.IO.File]::ReadAllText("$(PaketRootPath)/.config/dotnet-tools.json")) + <_ConfigContainsPaket Condition=" '$(_DotnetToolsJson)' != ''">$(_DotnetToolsJson.Contains('"paket"')) + <_ConfigContainsPaket Condition=" '$(_ConfigContainsPaket)' == ''">false + + + + + + + + + + + <_PaketCommand>dotnet paket + + + + + + $(PaketToolsPath)paket + $(PaketBootStrapperExeDir)paket + + + paket + + + + + <_PaketExeExtension>$([System.IO.Path]::GetExtension("$(PaketExePath)")) + <_PaketCommand Condition=" '$(_PaketCommand)' == '' AND '$(_PaketExeExtension)' == '.dll' ">dotnet "$(PaketExePath)" + <_PaketCommand Condition=" '$(_PaketCommand)' == '' AND '$(OS)' != 'Windows_NT' AND '$(_PaketExeExtension)' == '.exe' ">$(MonoPath) --runtime=v4.0.30319 "$(PaketExePath)" + <_PaketCommand Condition=" '$(_PaketCommand)' == '' ">"$(PaketExePath)" + + + + + + + + + + + + + + + + + + + + + true + $(NoWarn);NU1603;NU1604;NU1605;NU1608 + false + true + + + + + + + + + $([System.IO.File]::ReadAllText('$(PaketRestoreCacheFile)')) + + + + + + + $([System.Text.RegularExpressions.Regex]::Split(`%(Identity)`, `": "`)[0].Replace(`"`, ``).Replace(` `, ``)) + $([System.Text.RegularExpressions.Regex]::Split(`%(Identity)`, `": "`)[1].Replace(`"`, ``).Replace(` `, ``)) + + + + + %(PaketRestoreCachedKeyValue.Value) + %(PaketRestoreCachedKeyValue.Value) + + + + + true + false + true + + + - - true - - - - - - - - - - - - - - - - - - - $(PaketIntermediateOutputPath)\$(MSBuildProjectFile).paket.references.cached - - $(MSBuildProjectFullPath).paket.references - - $(MSBuildProjectDirectory)\$(MSBuildProjectName).paket.references - - $(MSBuildProjectDirectory)\paket.references - - false - true - true - references-file-or-cache-not-found - - - - - $([System.IO.File]::ReadAllText('$(PaketReferencesCachedFilePath)')) - $([System.IO.File]::ReadAllText('$(PaketOriginalReferencesFilePath)')) - references-file - false - - - - - false - - - - - true - target-framework '$(TargetFramework)' or '$(TargetFrameworks)' files @(PaketResolvedFilePaths) - - - - - - - - - - - false - true - - - - - - - - - - - $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',').Length) - $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[0]) - $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[1]) - $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[4]) - $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[5]) - $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[6]) - $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[7]) - - - %(PaketReferencesFileLinesInfo.PackageVersion) - All - runtime - $(ExcludeAssets);contentFiles - $(ExcludeAssets);build;buildMultitargeting;buildTransitive - true - true - - - - - $(PaketIntermediateOutputPath)/$(MSBuildProjectFile).paket.clitools - - - - - - - - - $([System.String]::Copy('%(PaketCliToolFileLines.Identity)').Split(',')[0]) - $([System.String]::Copy('%(PaketCliToolFileLines.Identity)').Split(',')[1]) - - - %(PaketCliToolFileLinesInfo.PackageVersion) - - - - + + + + + + + + + + + + + + + + $(PaketIntermediateOutputPath)\$(MSBuildProjectFile).paket.references.cached + + $(MSBuildProjectFullPath).paket.references + + $(MSBuildProjectDirectory)\$(MSBuildProjectName).paket.references + + $(MSBuildProjectDirectory)\paket.references + + false + true + true + references-file-or-cache-not-found + + + + + $([System.IO.File]::ReadAllText('$(PaketReferencesCachedFilePath)')) + $([System.IO.File]::ReadAllText('$(PaketOriginalReferencesFilePath)')) + references-file + false + + + + + false + + + + + true + target-framework '$(TargetFramework)' or '$(TargetFrameworks)' files @(PaketResolvedFilePaths) + + + + + + + + + + + false + true + + + + + + + + + + + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',').Length) + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[0]) + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[1]) + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[2]) + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[4]) + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[5]) + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[6]) + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[7]) + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[8]) + + + %(PaketReferencesFileLinesInfo.PackageVersion) + All + runtime + $(ExcludeAssets);contentFiles + $(ExcludeAssets);build;buildMultitargeting;buildTransitive + %(PaketReferencesFileLinesInfo.Aliases) + true + true + + + + + %(PaketReferencesFileLinesInfo.PackageVersion) + + + + + $(PaketIntermediateOutputPath)/$(MSBuildProjectFile).paket.clitools + + + + + + + + + $([System.String]::Copy('%(PaketCliToolFileLines.Identity)').Split(',')[0]) + $([System.String]::Copy('%(PaketCliToolFileLines.Identity)').Split(',')[1]) + + + %(PaketCliToolFileLinesInfo.PackageVersion) + + + + - - - - - false - - - - - - <_NuspecFilesNewLocation Include="$(PaketIntermediateOutputPath)\$(Configuration)\*.nuspec"/> - - - - - - $(MSBuildProjectDirectory)/$(MSBuildProjectFile) - true - false - true - false - true - false - true - false - true - false - true - $(PaketIntermediateOutputPath)\$(Configuration) - $(PaketIntermediateOutputPath) - - - - <_NuspecFiles Include="$(AdjustedNuspecOutputPath)\*.$(PackageVersion.Split(`+`)[0]).nuspec"/> - - - - - - - - - + + + + + false + + + + + + <_NuspecFilesNewLocation Include="$(PaketIntermediateOutputPath)\$(Configuration)\*.nuspec"/> + + + + + + $(MSBuildProjectDirectory)/$(MSBuildProjectFile) + true + false + true + false + true + false + true + false + true + false + true + $(PaketIntermediateOutputPath)\$(Configuration) + $(PaketIntermediateOutputPath) + + + + <_NuspecFiles Include="$(AdjustedNuspecOutputPath)\*.$(PackageVersion.Split(`+`)[0]).nuspec"/> + + + + + + + + + - - - - - - - - - + + + + + + + + + diff --git a/Install-as-dotnet-tool.ps1 b/Install-as-dotnet-tool.ps1 deleted file mode 100644 index f496ca7..0000000 --- a/Install-as-dotnet-tool.ps1 +++ /dev/null @@ -1,4 +0,0 @@ -$ToolName = "ExtLauncher" -dotnet pack --configuration Release -dotnet tool uninstall $ToolName --global -dotnet tool install $ToolName --add-source .\$ToolName\nupkg\ --global diff --git a/build.cmd b/build.cmd index 5656039..df77550 100644 --- a/build.cmd +++ b/build.cmd @@ -2,3 +2,5 @@ dotnet tool restore dotnet build -- %* + +AddToPath ./extLauncher/bin/Debug/ diff --git a/extLauncher.Tests/AppTests.fs b/extLauncher.Tests/AppTests.fs index 08f9c64..735e24d 100644 --- a/extLauncher.Tests/AppTests.fs +++ b/extLauncher.Tests/AppTests.fs @@ -5,91 +5,91 @@ open Xunit [] let ``should load a folder`` () = - let folderPath = FolderPath "/test" - let pattern = "*.ext" - - let folder = - let loadFiles _ _ = [| - FilePath "/test/file2.ext", FileName "file2" - FilePath "/test/file1.ext", FileName "file1" - |] - - App.loadFolder loadFiles { - Path = folderPath - Pattern = Pattern.init pattern false - Launchers = Array.empty - } - - folder - =! Some { - Path = folderPath - Pattern = Pattern.init pattern false - Files = [| - File.create (FilePath "/test/file1.ext") (FileName "file1") - File.create (FilePath "/test/file2.ext") (FileName "file2") - |] - Launchers = Array.empty + let folderPath = FolderPath "/test" + let pattern = "*.ext" + + let folder = + let loadFiles _ _ = [| + FilePath "/test/file2.ext", FileName "file2" + FilePath "/test/file1.ext", FileName "file1" + |] + + App.loadFolder loadFiles { + Path = folderPath + Pattern = Pattern.init pattern false + Launchers = Array.empty } + folder + =! Some { + Path = folderPath + Pattern = Pattern.init pattern false + Files = [| + File.create (FilePath "/test/file1.ext") (FileName "file1") + File.create (FilePath "/test/file2.ext") (FileName "file2") + |] + Launchers = Array.empty + } + [] let ``should not load a folder if no result`` () = - let folder = - let loadFiles _ _ = Array.empty + let folder = + let loadFiles _ _ = Array.empty - App.loadFolder loadFiles { - Path = FolderPath "" - Pattern = Pattern.init "" false - Launchers = Array.empty - } + App.loadFolder loadFiles { + Path = FolderPath "" + Pattern = Pattern.init "" false + Launchers = Array.empty + } - folder =! None + folder =! None [] let ``refresh should synchronize files`` () = - let newFolder = - let loadFiles _ _ = [| - FilePath "file1", FileName "" - FilePath "file3", FileName "" - |] - - let save = id - - { - Path = FolderPath "" - Pattern = Pattern.init "" false - Files = [| - File.create (FilePath "file1") (FileName "") - File.create (FilePath "file2") (FileName "") - |] - Launchers = Array.empty - } - |> App.refresh loadFiles save - |> Option.get - - newFolder.Files.[0].Path.value =! "file1" - newFolder.Files.[1].Path.value =! "file3" + let newFolder = + let loadFiles _ _ = [| + FilePath "file1", FileName "" + FilePath "file3", FileName "" + |] + + let save = id + + { + Path = FolderPath "" + Pattern = Pattern.init "" false + Files = [| + File.create (FilePath "file1") (FileName "") + File.create (FilePath "file2") (FileName "") + |] + Launchers = Array.empty + } + |> App.refresh loadFiles save + |> Option.get + + newFolder.Files.[0].Path.value =! "file1" + newFolder.Files.[1].Path.value =! "file3" [] let ``refresh should keep triggers`` () = - let newFolder = - let loadFiles _ _ = [| - FilePath "file1", FileName "" - FilePath "file2", FileName "" - |] - - let save = id - - { - Path = FolderPath "" - Pattern = Pattern.init "" false - Files = [| - File.create (FilePath "file1") (FileName "") |> File.triggered - File.create (FilePath "file2") (FileName "") - |] - Launchers = Array.empty - } - |> App.refresh loadFiles save - |> Option.get - - newFolder.Files.[0].Triggered =! 1 - newFolder.Files.[1].Triggered =! 0 + let newFolder = + let loadFiles _ _ = [| + FilePath "file1", FileName "" + FilePath "file2", FileName "" + |] + + let save = id + + { + Path = FolderPath "" + Pattern = Pattern.init "" false + Files = [| + File.create (FilePath "file1") (FileName "") |> File.triggered + File.create (FilePath "file2") (FileName "") + |] + Launchers = Array.empty + } + |> App.refresh loadFiles save + |> Option.get + + newFolder.Files.[0].Triggered =! 1 + newFolder.Files.[1].Triggered =! 0 diff --git a/extLauncher.Tests/ConsoleTests.fs b/extLauncher.Tests/ConsoleTests.fs index 22f6766..0ac538c 100644 --- a/extLauncher.Tests/ConsoleTests.fs +++ b/extLauncher.Tests/ConsoleTests.fs @@ -6,45 +6,45 @@ open Swensen.Unquote open Xunit let Terminal (strReader: Queue) (keyReader: Queue) (buffer: ResizeArray) = - let mutable left = 0 - let mutable top = 0 - - { new Console.ITerminal with - member _.ShowCursor() = () - member _.HideCursor() = () - member _.ToggleCursorVisibility() = () - member _.GetCursorPosition() = left, top - - member _.SetCursorPosition(l, t) = - left <- l - top <- t - - member _.ReadKey() = keyReader.Dequeue() - member _.ReadLine() = strReader.Dequeue() - - member _.Write str = - if top < buffer.Count then - buffer[top] <- buffer[top].Insert(left, str) - else - buffer.Add str - left <- str.Length - - member _.WriteLine str = - if top < buffer.Count then - buffer[top] <- str - else - buffer.Add str - - top <- top + 1 - left <- 0 - - member this.Markup str = this.Write str - member this.MarkupLine str = this.WriteLine str - - member _.ClearLine() = - buffer[top] <- String.Empty - left <- 0 - } + let mutable left = 0 + let mutable top = 0 + + { new Console.ITerminal with + member _.ShowCursor() = () + member _.HideCursor() = () + member _.ToggleCursorVisibility() = () + member _.GetCursorPosition() = left, top + + member _.SetCursorPosition(l, t) = + left <- l + top <- t + + member _.ReadKey() = keyReader.Dequeue() + member _.ReadLine() = strReader.Dequeue() + + member _.Write str = + if top < buffer.Count then + buffer[top] <- buffer[top].Insert(left, str) + else + buffer.Add str + left <- str.Length + + member _.WriteLine str = + if top < buffer.Count then + buffer[top] <- str + else + buffer.Add str + + top <- top + 1 + left <- 0 + + member this.Markup str = this.Write str + member this.MarkupLine str = this.WriteLine str + + member _.ClearLine() = + buffer[top] <- String.Empty + left <- 0 + } let newTerminal = Terminal(Queue()) let noConsoleModifier = enum 0 @@ -53,12 +53,12 @@ let downKey = ConsoleKey.DownArrow, char ConsoleKey.DownArrow, noConsoleModifier let upKey = ConsoleKey.UpArrow, char ConsoleKey.UpArrow, noConsoleModifier let backspaceKey = - ConsoleKey.Backspace, char ConsoleKey.Backspace, noConsoleModifier + ConsoleKey.Backspace, char ConsoleKey.Backspace, noConsoleModifier let escapeKey = ConsoleKey.Escape, char ConsoleKey.Escape, ConsoleModifiers.Alt let aKey k = - enum (Char.ToUpper k |> int), k, noConsoleModifier + enum (Char.ToUpper k |> int), k, noConsoleModifier [] let PromptTitle = "Search and choose" @@ -67,228 +67,228 @@ let PromptTitle = "Search and choose" let PrintedTitle = "[teal]" + PromptTitle + "[/] " let printedLines maxChoices itemsCount chosenNum = [ - PrintedTitle - for n in 1..itemsCount do - $"""[yellow]%s{if n = chosenNum then ">" else " "} [/]{n}""" - for _ in itemsCount + 1 .. maxChoices do - "" + PrintedTitle + for n in 1..itemsCount do + $"""[yellow]%s{if n = chosenNum then ">" else " "} [/]{n}""" + for _ in itemsCount + 1 .. maxChoices do + "" ] [] let ``prompt should print choices`` () = - let lines = ResizeArray() - let keyReader = Queue [ escapeKey ] - let term = newTerminal keyReader lines + let lines = ResizeArray() + let keyReader = Queue [ escapeKey ] + let term = newTerminal keyReader lines - let _ = - fun _ -> [| - 1 - 2 - 3 - |] - |> Console.prompt term PromptTitle (sprintf "%i") 5 + let _ = + fun _ -> [| + 1 + 2 + 3 + |] + |> Console.prompt term PromptTitle (sprintf "%i") 5 - List.ofSeq lines =! printedLines 5 3 1 + List.ofSeq lines =! printedLines 5 3 1 [] let ``prompt should go down`` () = - let lines = ResizeArray() + let lines = ResizeArray() - let keyReader = - Queue [ - downKey - escapeKey - ] + let keyReader = + Queue [ + downKey + escapeKey + ] - let term = newTerminal keyReader lines + let term = newTerminal keyReader lines - let _ = - fun _ -> [| - 1 - 2 - 3 - |] - |> Console.prompt term PromptTitle (sprintf "%i") 5 + let _ = + fun _ -> [| + 1 + 2 + 3 + |] + |> Console.prompt term PromptTitle (sprintf "%i") 5 - List.ofSeq lines =! printedLines 5 3 2 + List.ofSeq lines =! printedLines 5 3 2 [] let ``prompt should go up`` () = - let lines = ResizeArray() + let lines = ResizeArray() - let keyReader = - Queue [ - downKey - upKey - escapeKey - ] + let keyReader = + Queue [ + downKey + upKey + escapeKey + ] - let term = newTerminal keyReader lines + let term = newTerminal keyReader lines - let _ = - fun _ -> [| - 1 - 2 - 3 - |] - |> Console.prompt term PromptTitle (sprintf "%i") 5 + let _ = + fun _ -> [| + 1 + 2 + 3 + |] + |> Console.prompt term PromptTitle (sprintf "%i") 5 - List.ofSeq lines =! printedLines 5 3 1 + List.ofSeq lines =! printedLines 5 3 1 [] let ``prompt should stay up`` () = - let lines = ResizeArray() + let lines = ResizeArray() - let keyReader = - Queue [ - upKey - upKey - escapeKey - ] + let keyReader = + Queue [ + upKey + upKey + escapeKey + ] - let term = newTerminal keyReader lines + let term = newTerminal keyReader lines - let _ = - fun _ -> [| - 1 - 2 - 3 - |] - |> Console.prompt term PromptTitle (sprintf "%i") 5 + let _ = + fun _ -> [| + 1 + 2 + 3 + |] + |> Console.prompt term PromptTitle (sprintf "%i") 5 - List.ofSeq lines =! printedLines 5 3 1 + List.ofSeq lines =! printedLines 5 3 1 [] let ``prompt should stay down`` () = - let lines = ResizeArray() - - let keyReader = - Queue [ - downKey - downKey - downKey - downKey - downKey - escapeKey - ] - - let term = newTerminal keyReader lines - - let _ = - fun _ -> [| - 1 - 2 - 3 - |] - |> Console.prompt term PromptTitle (sprintf "%i") 5 - - List.ofSeq lines =! printedLines 5 3 3 + let lines = ResizeArray() + + let keyReader = + Queue [ + downKey + downKey + downKey + downKey + downKey + escapeKey + ] + + let term = newTerminal keyReader lines + + let _ = + fun _ -> [| + 1 + 2 + 3 + |] + |> Console.prompt term PromptTitle (sprintf "%i") 5 + + List.ofSeq lines =! printedLines 5 3 3 [] let ``prompt should choose the second choice and clear`` () = - let lines = ResizeArray() + let lines = ResizeArray() - let keyReader = - Queue [ - downKey - enterKey - ] + let keyReader = + Queue [ + downKey + enterKey + ] - let term = newTerminal keyReader lines + let term = newTerminal keyReader lines - let chosen = - fun _ -> [| - 1 - 2 - 3 - |] - |> Console.prompt term PromptTitle (sprintf "%i") 5 + let chosen = + fun _ -> [| + 1 + 2 + 3 + |] + |> Console.prompt term PromptTitle (sprintf "%i") 5 - chosen =! Some 2 - Seq.forall ((=) "") lines =! true + chosen =! Some 2 + Seq.forall ((=) "") lines =! true [] let ``prompt should print error if no match`` () = - let lines = ResizeArray() - let keyReader = Queue [ escapeKey ] - let term = newTerminal keyReader lines - - let _ = - fun _ -> Array.empty - |> Console.prompt term PromptTitle (sprintf "%i") 1 - - List.ofSeq lines - =! [ - PrintedTitle - "No items match your search." - ] + let lines = ResizeArray() + let keyReader = Queue [ escapeKey ] + let term = newTerminal keyReader lines + + let _ = + fun _ -> Array.empty + |> Console.prompt term PromptTitle (sprintf "%i") 1 + + List.ofSeq lines + =! [ + PrintedTitle + "No items match your search." + ] [] let ``prompt should print the search title`` () = - let lines = ResizeArray() - - let keyReader = - Queue [ - aKey 't' - aKey 'e' - aKey 's' - aKey 't' - escapeKey - ] + let lines = ResizeArray() + + let keyReader = + Queue [ + aKey 't' + aKey 'e' + aKey 's' + aKey 't' + escapeKey + ] - let term = newTerminal keyReader lines + let term = newTerminal keyReader lines - let _ = - fun _ -> [| - 1 - 2 - 3 - |] - |> Console.prompt term PromptTitle (sprintf "%i") 1 + let _ = + fun _ -> [| + 1 + 2 + 3 + |] + |> Console.prompt term PromptTitle (sprintf "%i") 1 - Seq.head lines =! $"%s{PrintedTitle}test" + Seq.head lines =! $"%s{PrintedTitle}test" [] let ``prompt should print the search chars supporting backspace`` () = - let lines = ResizeArray() - - let keyReader = - Queue [ - aKey 't' - aKey 'e' - backspaceKey - aKey 's' - aKey 't' - escapeKey - ] - - let term = newTerminal keyReader lines - - let _ = - fun _ -> [| - 1 - 2 - 3 - |] - |> Console.prompt term PromptTitle (sprintf "%i") 1 - - Seq.head lines =! $"%s{PrintedTitle}tst" + let lines = ResizeArray() + + let keyReader = + Queue [ + aKey 't' + aKey 'e' + backspaceKey + aKey 's' + aKey 't' + escapeKey + ] + + let term = newTerminal keyReader lines + + let _ = + fun _ -> [| + 1 + 2 + 3 + |] + |> Console.prompt term PromptTitle (sprintf "%i") 1 + + Seq.head lines =! $"%s{PrintedTitle}tst" [] let ``prompt should clear when exit`` () = - let lines = ResizeArray() + let lines = ResizeArray() - let keyReader = - Queue [ ConsoleKey.Escape, char ConsoleKey.Escape, noConsoleModifier ] + let keyReader = + Queue [ ConsoleKey.Escape, char ConsoleKey.Escape, noConsoleModifier ] - let term = newTerminal keyReader lines + let term = newTerminal keyReader lines - let _ = - fun _ -> [| - 1 - 2 - 3 - |] - |> Console.prompt term PromptTitle (sprintf "%i") 5 + let _ = + fun _ -> [| + 1 + 2 + 3 + |] + |> Console.prompt term PromptTitle (sprintf "%i") 5 - Seq.forall ((=) "") lines =! true + Seq.forall ((=) "") lines =! true diff --git a/extLauncher.Tests/DomainTests.fs b/extLauncher.Tests/DomainTests.fs index 73e1402..e760107 100644 --- a/extLauncher.Tests/DomainTests.fs +++ b/extLauncher.Tests/DomainTests.fs @@ -6,48 +6,48 @@ open Swensen.Unquote [] let ``File with the same Path should be equal`` (file1: File) (file2: File) = - let file1 = { file1 with Path = file2.Path } - file1 =! file2 + let file1 = { file1 with Path = file2.Path } + file1 =! file2 [] let ``File with different Path should not be equal`` (file1: File) (file2: File) = - let file1 = { file1 with Path = Guid.NewGuid().ToString() |> FilePath } + let file1 = { file1 with Path = Guid.NewGuid().ToString() |> FilePath } - let file2 = { file2 with Path = Guid.NewGuid().ToString() |> FilePath } + let file2 = { file2 with Path = Guid.NewGuid().ToString() |> FilePath } - file1 <>! file2 + file1 <>! file2 [] let ``File with a higher trigger should precede in the sort order`` (file1: File) (file2: File) = - let file1 = { file1 with Triggered = file2.Triggered + 1 } + let file1 = { file1 with Triggered = file2.Triggered + 1 } - compare file1 file2 =! -1 + compare file1 file2 =! -1 [] let ``File with a lower trigger should follow in the sort order`` (file1: File) (file2: File) = - let file1 = { file1 with Triggered = file2.Triggered - 1 } + let file1 = { file1 with Triggered = file2.Triggered - 1 } - compare file1 file2 =! 1 + compare file1 file2 =! 1 [] let ``File with the same trigger should be sorted alphabetically`` (file1: File) (file2: File) = - let file1 = { - file1 with - Triggered = 0 - Name = FileName "a" - } + let file1 = { + file1 with + Triggered = 0 + Name = FileName "a" + } - let file2 = { - file2 with - Triggered = 0 - Name = FileName "b" - } + let file2 = { + file2 with + Triggered = 0 + Name = FileName "b" + } - compare file1 file2 =! -1 + compare file1 file2 =! -1 [] let ``searchByName should search for the containing string ignoring case`` (file: File) (files: File array) = - let file = { file with Name = FileName "Hello World" } + let file = { file with Name = FileName "Hello World" } - let files = Array.insertAt 0 file files - Helpers.searchByName files (fun f -> f.Name.value) "world" =! [| file |] + let files = Array.insertAt 0 file files + Helpers.searchByName files (fun f -> f.Name.value) "world" =! [| file |] diff --git a/extLauncher.Tests/Program.fs b/extLauncher.Tests/Program.fs index 80c6d84..32063d1 100644 --- a/extLauncher.Tests/Program.fs +++ b/extLauncher.Tests/Program.fs @@ -1,3 +1,3 @@ module Program = - [] - let main _ = 0 + [] + let main _ = 0 diff --git a/extLauncher.Tests/extLauncher.Tests.fsproj b/extLauncher.Tests/extLauncher.Tests.fsproj index 8f74f8a..0114675 100644 --- a/extLauncher.Tests/extLauncher.Tests.fsproj +++ b/extLauncher.Tests/extLauncher.Tests.fsproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 false false FS0025 diff --git a/extLauncher/App.fs b/extLauncher/App.fs index 13854e9..7c859d0 100644 --- a/extLauncher/App.fs +++ b/extLauncher/App.fs @@ -1,45 +1,45 @@ module extLauncher.App type FolderConf = { - Path: FolderPath - Pattern: Pattern - Launchers: Launcher array + Path: FolderPath + Pattern: Pattern + Launchers: Launcher array } let loadFolder loadFiles conf : Folder option = - loadFiles conf.Path conf.Pattern - |> Array.map ((<||) File.create) - |> Array.sort - |> function - | [||] -> None - | files -> - { - Path = conf.Path - Pattern = conf.Pattern - Files = files - Launchers = conf.Launchers - } - |> Some - -let index loadFiles save conf : Folder option = - loadFolder loadFiles conf |> Option.map save + loadFiles conf.Path conf.Pattern + |> Array.map ((<||) File.create) + |> Array.sort + |> function + | [||] -> None + | files -> + { + Path = conf.Path + Pattern = conf.Pattern + Files = files + Launchers = conf.Launchers + } + |> Some + +let index loadFiles save (conf: FolderConf) : Folder option = + loadFolder loadFiles conf |> Option.map save let refresh loadFiles save (folder: Folder) : Folder option = - let newFiles = - folder.Pattern |> loadFiles folder.Path |> Array.map ((<||) File.create) + let newFiles = + folder.Pattern |> loadFiles folder.Path |> Array.map ((<||) File.create) - let currentFiles = folder.Files |> Array.map (fun f -> f.Path, f) |> Map + let currentFiles = folder.Files |> Array.map (fun f -> f.Path, f) |> Map - newFiles - |> Array.map (fun newFile -> - match currentFiles.TryFind newFile.Path with - | Some current -> { newFile with Triggered = current.Triggered } - | None -> newFile - ) - |> fun files -> { folder with Files = files } - |> save - |> Some + newFiles + |> Array.map (fun newFile -> + match currentFiles.TryFind newFile.Path with + | Some current -> { newFile with Triggered = current.Triggered } + | None -> newFile + ) + |> fun files -> { folder with Files = files } + |> save + |> Some let makeSearcher folder str = - Helpers.searchByName folder.Files (fun f -> f.Name.value) str |> Array.sort + Helpers.searchByName folder.Files (fun f -> f.Name.value) str |> Array.sort diff --git a/extLauncher/Console.fs b/extLauncher/Console.fs index abe946c..ee9ae57 100644 --- a/extLauncher/Console.fs +++ b/extLauncher/Console.fs @@ -6,116 +6,116 @@ open Spectre.Console type TerminalKey = ConsoleKey * char * ConsoleModifiers type ITerminal = - abstract member ShowCursor: unit -> unit - abstract member HideCursor: unit -> unit - abstract member ToggleCursorVisibility: unit -> unit - abstract member GetCursorPosition: unit -> int32 * int32 - abstract member SetCursorPosition: int32 * int32 -> unit - abstract member ReadKey: unit -> TerminalKey - abstract member ReadLine: unit -> string - abstract member Write: string -> unit - abstract member WriteLine: string -> unit - abstract member Markup: string -> unit - abstract member MarkupLine: string -> unit - abstract member ClearLine: unit -> unit + abstract member ShowCursor: unit -> unit + abstract member HideCursor: unit -> unit + abstract member ToggleCursorVisibility: unit -> unit + abstract member GetCursorPosition: unit -> int32 * int32 + abstract member SetCursorPosition: int32 * int32 -> unit + abstract member ReadKey: unit -> TerminalKey + abstract member ReadLine: unit -> string + abstract member Write: string -> unit + abstract member WriteLine: string -> unit + abstract member Markup: string -> unit + abstract member MarkupLine: string -> unit + abstract member ClearLine: unit -> unit let Terminal = - { new ITerminal with - member _.ShowCursor() = Console.CursorVisible <- true - member _.HideCursor() = Console.CursorVisible <- false + { new ITerminal with + member _.ShowCursor() = Console.CursorVisible <- true + member _.HideCursor() = Console.CursorVisible <- false - member _.ToggleCursorVisibility() = - Console.CursorVisible <- not Console.CursorVisible + member _.ToggleCursorVisibility() = + Console.CursorVisible <- not Console.CursorVisible - member _.GetCursorPosition() = Console.CursorLeft, Console.CursorTop + member _.GetCursorPosition() = Console.CursorLeft, Console.CursorTop - member _.SetCursorPosition(left, top) = - Console.SetCursorPosition((if left < 0 then 0 else left), (if top < 0 then 0 else top)) + member _.SetCursorPosition(left, top) = + Console.SetCursorPosition((if left < 0 then 0 else left), (if top < 0 then 0 else top)) - member _.ReadKey() = - let k = Console.ReadKey() - k.Key, k.KeyChar, k.Modifiers + member _.ReadKey() = + let k = Console.ReadKey() + k.Key, k.KeyChar, k.Modifiers - member _.ReadLine() = Console.ReadLine() - member _.Write str = AnsiConsole.Write str - member _.WriteLine str = AnsiConsole.WriteLine str - member _.Markup str = AnsiConsole.Markup str - member _.MarkupLine str = AnsiConsole.MarkupLine str + member _.ReadLine() = Console.ReadLine() + member _.Write str = AnsiConsole.Write str + member _.WriteLine str = AnsiConsole.WriteLine str + member _.Markup str = AnsiConsole.Markup str + member _.MarkupLine str = AnsiConsole.MarkupLine str - member this.ClearLine() = - String(' ', Console.BufferWidth - 1) |> this.WriteLine - } + member this.ClearLine() = + String(' ', Console.BufferWidth - 1) |> this.WriteLine + } [] let NoMatch = "No items match your search." let clearUp (term: ITerminal) cursorTop count = - for top = cursorTop to cursorTop + count do - term.SetCursorPosition(0, top) - term.ClearLine() + for top = cursorTop to cursorTop + count do + term.SetCursorPosition(0, top) + term.ClearLine() - term.SetCursorPosition(0, cursorTop) + term.SetCursorPosition(0, cursorTop) let checkNoMatch (term: ITerminal) (search: string -> 'T array) = - if search String.Empty |> Array.isEmpty then - term.MarkupLine NoMatch - None - else - Some search + if search String.Empty |> Array.isEmpty then + term.MarkupLine NoMatch + None + else + Some search let prompt<'T> (term: ITerminal) title (displayChoice: 'T -> string) maxChoices (search: string -> 'T array) = - for _ in 0..maxChoices do - term.WriteLine "" // allocate buffer area + for _ in 0..maxChoices do + term.WriteLine "" // allocate buffer area + + let cursorTop = + let _, top = term.GetCursorPosition() + top - maxChoices - 1 - let cursorTop = - let _, top = term.GetCursorPosition() - top - maxChoices - 1 + let search str = + let choices = search str |> Array.truncate maxChoices + (choices, str, 0) - let search str = - let choices = search str |> Array.truncate maxChoices - (choices, str, 0) + let print (choices: 'T array, str, pos) = + term.HideCursor() + let pos = max 0 (min (Array.length choices - 1) pos) + clearUp term cursorTop maxChoices + term.WriteLine "" - let print (choices: 'T array, str, pos) = - term.HideCursor() - let pos = max 0 (min (Array.length choices - 1) pos) + if Array.isEmpty choices then + term.MarkupLine NoMatch + else + choices + |> Array.iteri (fun i choice -> + sprintf "[yellow]%s[/]%s" (if i = pos then "> " else " ") (displayChoice choice) + |> term.MarkupLine + ) + + term.SetCursorPosition(0, cursorTop) + term.Markup $"[teal]%s{title}[/] %s{str}" + term.ShowCursor() + (choices, str, pos) + + let rec read (choices: 'T array, str, pos) = + match term.ReadKey() with + | ConsoleKey.Escape, _, ConsoleModifiers.Alt -> None // no clear alternative + | ConsoleKey.Escape, _, _ -> + term.Write(string '\u200B') // hack to force the clear + clearUp term cursorTop maxChoices + None + | ConsoleKey.Enter, _, _ -> + if Array.isEmpty choices then + read (choices, str, pos) + else clearUp term cursorTop maxChoices - term.WriteLine "" - - if Array.isEmpty choices then - term.MarkupLine NoMatch - else - choices - |> Array.iteri (fun i choice -> - sprintf "[yellow]%s[/]%s" (if i = pos then "> " else " ") (displayChoice choice) - |> term.MarkupLine - ) - - term.SetCursorPosition(0, cursorTop) - term.Markup $"[teal]%s{title}[/] %s{str}" - term.ShowCursor() - (choices, str, pos) - - let rec read (choices: 'T array, str, pos) = - match term.ReadKey() with - | ConsoleKey.Escape, _, ConsoleModifiers.Alt -> None // no clear alternative - | ConsoleKey.Escape, _, _ -> - term.Write(string '\u200B') // hack to force the clear - clearUp term cursorTop maxChoices - None - | ConsoleKey.Enter, _, _ -> - if Array.isEmpty choices then - read (choices, str, pos) - else - clearUp term cursorTop maxChoices - Some choices[pos] - | ConsoleKey.UpArrow, _, _ -> read ((choices, str, pos - 1) |> print) - | ConsoleKey.DownArrow, _, _ -> read ((choices, str, pos + 1) |> print) - | ConsoleKey.Backspace, _, _ -> - if str.Length = 0 then - read (choices, str, pos) - else - read (search str[..^1] |> print) - | _, key, _ -> read (search $"%s{str}%c{key}" |> print) - - search String.Empty |> print |> read + Some choices[pos] + | ConsoleKey.UpArrow, _, _ -> read ((choices, str, pos - 1) |> print) + | ConsoleKey.DownArrow, _, _ -> read ((choices, str, pos + 1) |> print) + | ConsoleKey.Backspace, _, _ -> + if str.Length = 0 then + read (choices, str, pos) + else + read (search str[..^1] |> print) + | _, key, _ -> read (search $"%s{str}%c{key}" |> print) + + search String.Empty |> print |> read diff --git a/extLauncher/Domain.fs b/extLauncher/Domain.fs index fa2d610..4b00007 100644 --- a/extLauncher/Domain.fs +++ b/extLauncher/Domain.fs @@ -3,146 +3,146 @@ open System type FileName = - | FileName of string + | FileName of string - member this.value = - match this with - | FileName v -> v + member this.value = + match this with + | FileName v -> v type FolderPath = - | FolderPath of string + | FolderPath of string - member this.value = - match this with - | FolderPath v -> v + member this.value = + match this with + | FolderPath v -> v type FilePath = - | FilePath of string + | FilePath of string - member this.value = - match this with - | FilePath v -> v + member this.value = + match this with + | FilePath v -> v - member this.folder = - match this with - | FilePath v -> v |> System.IO.Path.GetDirectoryName |> FolderPath + member this.folder = + match this with + | FilePath v -> v |> System.IO.Path.GetDirectoryName |> FolderPath [] type File = { - Path: FilePath - Name: FileName - Triggered: int32 + Path: FilePath + Name: FileName + Triggered: int32 } with - override this.GetHashCode() = this.Path.GetHashCode() - - override this.Equals other = - match other with - | :? File as other -> this.Path.value = other.Path.value - | _ -> ArgumentException() |> raise - - interface IComparable with - member this.CompareTo other = - match other with - | :? File as other -> - if this.Triggered = other.Triggered then - String.Compare(this.Name.value, other.Name.value, true) - elif this.Triggered > other.Triggered then - -1 - else - 1 - | _ -> ArgumentException() |> raise + override this.GetHashCode() = this.Path.GetHashCode() + + override this.Equals other = + match other with + | :? File as other -> this.Path.value = other.Path.value + | _ -> ArgumentException() |> raise + + interface IComparable with + member this.CompareTo other = + match other with + | :? File as other -> + if this.Triggered = other.Triggered then + String.Compare(this.Name.value, other.Name.value, true) + elif this.Triggered > other.Triggered then + -1 + else + 1 + | _ -> ArgumentException() |> raise module File = - let create (FilePath id) (FileName name) = { - Path = FilePath id - Name = FileName name - Triggered = 0 - } + let create (FilePath id) (FileName name) = { + Path = FilePath id + Name = FileName name + Triggered = 0 + } - let triggered file = { file with Triggered = file.Triggered + 1 } + let triggered file = { file with Triggered = file.Triggered + 1 } type Choose = - | File = 0 - | Directory = 1 + | File = 0 + | Directory = 1 module Choose = - let init = - function - | 0 -> Choose.File - | 1 -> Choose.Directory - | _ -> failwith "Invalid value" + let init = + function + | 0 -> Choose.File + | 1 -> Choose.Directory + | _ -> failwith "Invalid value" type Launcher = { - Name: string - Path: FilePath - Arguments: string - Choose: Choose + Name: string + Path: FilePath + Arguments: string + Choose: Choose } with - static member name this = this.Name + static member name this = this.Name module Launcher = - let buildArgs launcher tolaunch = - if String.IsNullOrEmpty launcher.Arguments then - tolaunch - else - launcher.Arguments.Replace("%s", $"\"%s{tolaunch}\"") + let buildArgs launcher tolaunch = + if String.IsNullOrEmpty launcher.Arguments then + tolaunch + else + launcher.Arguments.Replace("%s", $"\"%s{tolaunch}\"") type Pattern = - | WildcardPattern of string - | RegexPattern of string - - member this.value = - match this with - | WildcardPattern v - | RegexPattern v -> v - - member this.isRegex = - match this with - | WildcardPattern _ -> false - | RegexPattern _ -> true - - static member from value isRegex = - if isRegex then - RegexPattern value - else - WildcardPattern value + | WildcardPattern of string + | RegexPattern of string + + member this.value = + match this with + | WildcardPattern v + | RegexPattern v -> v + + member this.isRegex = + match this with + | WildcardPattern _ -> false + | RegexPattern _ -> true + + static member from value isRegex = + if isRegex then + RegexPattern value + else + WildcardPattern value module Pattern = - let value = - function - | WildcardPattern p - | RegexPattern p -> p - - let isRegex = - function - | WildcardPattern _ -> false - | RegexPattern _ -> true - - let init value isRegex = - if isRegex then - RegexPattern value - else - WildcardPattern value + let value = + function + | WildcardPattern p + | RegexPattern p -> p + + let isRegex = + function + | WildcardPattern _ -> false + | RegexPattern _ -> true + + let init value isRegex = + if isRegex then + RegexPattern value + else + WildcardPattern value type Folder = { - Path: FolderPath - Pattern: Pattern - Files: File array - Launchers: Launcher array + Path: FolderPath + Pattern: Pattern + Files: File array + Launchers: Launcher array } module Helpers = - let inline searchByName (items: 't array) (getName: 't -> string) (str: string) : 't array = - if String.IsNullOrEmpty str then - items - else - items - |> Array.filter (fun item -> - match item |> getName |> Option.ofObj with - | Some name -> name.Contains(str, StringComparison.OrdinalIgnoreCase) - | None -> false - ) + let inline searchByName (items: 't array) (getName: 't -> string) (str: string) : 't array = + if String.IsNullOrEmpty str then + items + else + items + |> Array.filter (fun item -> + match item |> getName |> Option.ofObj with + | Some name -> name.Contains(str, StringComparison.OrdinalIgnoreCase) + | None -> false + ) diff --git a/extLauncher/Infra.fs b/extLauncher/Infra.fs index 866222b..35f6503 100644 --- a/extLauncher/Infra.fs +++ b/extLauncher/Infra.fs @@ -3,159 +3,151 @@ open System module IO = - open System.IO - open System.Text.RegularExpressions - - [] - let AppName = "extLauncher" - - let userPath = - let path = - Path.Combine(Environment.GetFolderPath Environment.SpecialFolder.ApplicationData, AppName) - - Directory.CreateDirectory path |> ignore - path - - let userPathCombine path = Path.Combine(userPath, path) - - let private enumerateFiles (FolderPath path) = - function - | WildcardPattern pattern -> - Directory.EnumerateFiles( - path, - pattern, - EnumerationOptions( - RecurseSubdirectories = true, - IgnoreInaccessible = true, - MatchType = MatchType.Simple - ) - ) - | RegexPattern pattern -> - let regex = Regex pattern - - Directory.EnumerateFiles( - path, - "*", - EnumerationOptions( - RecurseSubdirectories = true, - IgnoreInaccessible = true, - MatchType = MatchType.Simple - ) - ) - |> Seq.filter (Path.GetFileName >> regex.IsMatch) - - let getFiles folderPath pattern = - enumerateFiles folderPath pattern - |> Seq.map (fun path -> FilePath path, path |> Path.GetFileNameWithoutExtension |> FileName) - |> Seq.toArray + open System.IO + open System.Text.RegularExpressions + + [] + let AppName = "extLauncher" + + let userPath = + let path = + Path.Combine(Environment.GetFolderPath Environment.SpecialFolder.ApplicationData, AppName) + + Directory.CreateDirectory path |> ignore + path + + let userPathCombine path = Path.Combine(userPath, path) + + let private enumerateFiles (FolderPath path) = + function + | WildcardPattern pattern -> + Directory.EnumerateFiles( + path, + pattern, + EnumerationOptions(RecurseSubdirectories = true, IgnoreInaccessible = true, MatchType = MatchType.Simple) + ) + | RegexPattern pattern -> + let regex = Regex pattern + + Directory.EnumerateFiles( + path, + "*", + EnumerationOptions(RecurseSubdirectories = true, IgnoreInaccessible = true, MatchType = MatchType.Simple) + ) + |> Seq.filter (Path.GetFileName >> regex.IsMatch) + + let getFiles folderPath pattern = + enumerateFiles folderPath pattern + |> Seq.map (fun path -> FilePath path, path |> Path.GetFileNameWithoutExtension |> FileName) + |> Seq.toArray module Db = - type LauncherDb = { - Name: string - Path: string - Arguments: string - Choose: int - } with - - static member fromDomain(launcher: Launcher) = { - Name = launcher.Name - Path = launcher.Path.value - Arguments = launcher.Arguments - Choose = int launcher.Choose - } - - static member toDomain(launcherDb: LauncherDb) : Launcher = { - Name = launcherDb.Name - Path = FilePath launcherDb.Path - Arguments = launcherDb.Arguments - Choose = Choose.init launcherDb.Choose - } - - type FileDb = { - Id: string - Name: string - Triggered: int32 - } with - - static member fromDomain(file: File) = { - Id = file.Path.value - Name = file.Name.value - Triggered = file.Triggered - } - - static member toDomain(fileDb: FileDb) = { - Path = FilePath fileDb.Id - Name = FileName fileDb.Name - Triggered = fileDb.Triggered - } - - // Should be serializable to BSON - [] - type FolderDb = { - Id: string - Pattern: string - IsRegex: bool - Launchers: LauncherDb array - Files: FileDb array - } with - - static member fromDomain(folder: Folder) = { - Id = folder.Path.value - Pattern = folder.Pattern.value - IsRegex = folder.Pattern.isRegex - Launchers = folder.Launchers |> Array.map LauncherDb.fromDomain - Files = folder.Files |> Array.map FileDb.fromDomain - } - - static member toDomain(folderDb: FolderDb) = { - Path = FolderPath folderDb.Id - Pattern = Pattern.init folderDb.Pattern folderDb.IsRegex - Launchers = folderDb.Launchers |> Array.map LauncherDb.toDomain - Files = folderDb.Files |> Array.map FileDb.toDomain - } - - open LiteDB - - BsonMapper.Global.Entity().DbRef(fun f -> f.Files) |> ignore - - let dbPath = IO.userPathCombine $"%s{IO.AppName}.db" - - let newReadOnlyDb () = - new LiteDatabase($"Filename=%s{dbPath}; Mode=ReadOnly") - - let newSharedDb () = - new LiteDatabase($"Filename=%s{dbPath}; Mode=Shared") - - let private tryFindFolder (path: string) = - use db = newReadOnlyDb () - let doc = db.GetCollection().Include(fun f -> f.Files).FindById path - if box doc <> null then doc |> Some else None - - let findFolder (FolderPath path) = - path |> tryFindFolder |> Option.map FolderDb.toDomain - - let updateFile (file: File) = - let fileDb = file |> FileDb.fromDomain - use db = newSharedDb () - fileDb |> db.GetCollection().Update |> ignore - file - - let deleteFolder (FolderPath path) = - match tryFindFolder path with - | None -> () - | Some folder -> - use db = newSharedDb () - - for file in folder.Files do - db.GetCollection().Delete file.Id |> ignore - - db.GetCollection().Delete folder.Id |> ignore - - let upsertFolder (folder: Folder) = - let folderDb = FolderDb.fromDomain folder - deleteFolder folder.Path - use db = newSharedDb () - folderDb.Files |> db.GetCollection().InsertBulk |> ignore - folderDb |> db.GetCollection().Insert |> ignore - folder + type LauncherDb = { + Name: string + Path: string + Arguments: string + Choose: int + } with + + static member fromDomain(launcher: Launcher) = { + Name = launcher.Name + Path = launcher.Path.value + Arguments = launcher.Arguments + Choose = int launcher.Choose + } + + static member toDomain(launcherDb: LauncherDb) : Launcher = { + Name = launcherDb.Name + Path = FilePath launcherDb.Path + Arguments = launcherDb.Arguments + Choose = Choose.init launcherDb.Choose + } + + type FileDb = { + Id: string + Name: string + Triggered: int32 + } with + + static member fromDomain(file: File) = { + Id = file.Path.value + Name = file.Name.value + Triggered = file.Triggered + } + + static member toDomain(fileDb: FileDb) = { + Path = FilePath fileDb.Id + Name = FileName fileDb.Name + Triggered = fileDb.Triggered + } + + // Should be serializable to BSON + [] + type FolderDb = { + Id: string + Pattern: string + IsRegex: bool + Launchers: LauncherDb array + Files: FileDb array + } with + + static member fromDomain(folder: Folder) = { + Id = folder.Path.value + Pattern = folder.Pattern.value + IsRegex = folder.Pattern.isRegex + Launchers = folder.Launchers |> Array.map LauncherDb.fromDomain + Files = folder.Files |> Array.map FileDb.fromDomain + } + + static member toDomain(folderDb: FolderDb) = { + Path = FolderPath folderDb.Id + Pattern = Pattern.init folderDb.Pattern folderDb.IsRegex + Launchers = folderDb.Launchers |> Array.map LauncherDb.toDomain + Files = folderDb.Files |> Array.map FileDb.toDomain + } + + open LiteDB + + BsonMapper.Global.Entity().DbRef(fun f -> f.Files) |> ignore + + let dbPath = IO.userPathCombine $"%s{IO.AppName}.db" + + let newReadOnlyDb () = + new LiteDatabase($"Filename=%s{dbPath}; Mode=ReadOnly") + + let newSharedDb () = + new LiteDatabase($"Filename=%s{dbPath}; Mode=Shared") + + let private tryFindFolder (path: string) = + use db = newReadOnlyDb () + let doc = db.GetCollection().Include(fun f -> f.Files).FindById path + if box doc <> null then doc |> Some else None + + let findFolder (FolderPath path) = + path |> tryFindFolder |> Option.map FolderDb.toDomain + + let updateFile (file: File) = + let fileDb = file |> FileDb.fromDomain + use db = newSharedDb () + fileDb |> db.GetCollection().Update |> ignore + file + + let deleteFolder (FolderPath path) = + match tryFindFolder path with + | None -> () + | Some folder -> + use db = newSharedDb () + + for file in folder.Files do + db.GetCollection().Delete file.Id |> ignore + + db.GetCollection().Delete folder.Id |> ignore + + let upsertFolder (folder: Folder) = + let folderDb = FolderDb.fromDomain folder + deleteFolder folder.Path + use db = newSharedDb () + folderDb.Files |> db.GetCollection().InsertBulk |> ignore + folderDb |> db.GetCollection().Insert |> ignore + folder diff --git a/extLauncher/Program.fs b/extLauncher/Program.fs index 3c09b64..505b2ef 100644 --- a/extLauncher/Program.fs +++ b/extLauncher/Program.fs @@ -7,418 +7,419 @@ open Spectre.Console.Cli [] module private Implementations = - open System.Diagnostics - type Path = System.IO.Path - - let markup value = AnsiConsole.MarkupLine value - - let notInitialized () = - markup $"Folder not yet indexed: [yellow]%s{IO.AppName}[/] index [gray]--help[/]" - 1 - - let run (file: File) launcher = - markup $"""Launching [green]%s{file.Name.value}[/] [gray]%s{file.Path.value}[/]...""" - let file = file |> File.triggered |> Db.updateFile - - match launcher with - | None -> - let psi = ProcessStartInfo file.Path.value - psi.UseShellExecute <- true - Process.Start psi |> ignore - | Some launcher -> - let path = - match launcher.Choose with - | Choose.File -> file.Path.value - | Choose.Directory -> Path.GetDirectoryName file.Path.value - | _ -> NotImplementedException() |> raise - - let psi = ProcessStartInfo launcher.Path.value - psi.Arguments <- Launcher.buildArgs launcher path - Process.Start psi |> ignore - - let chooseLauncher folder file = - match folder.Launchers with - | [||] -> run file None - | [| launcher |] -> run file (Some launcher) - | launchers -> - Helpers.searchByName launchers (fun l -> l.Name) - |> Console.prompt Console.Terminal "With which launcher?" Launcher.name 10 - |> function - | Some launcher -> run file (Some launcher) - | None -> () - - let filePrompt (file: File) : string = - $"""[white]%s{file.Name.value}[/] [gray](%s{file.Path.folder.value})[/]""" - - let prompt folder = - folder - |> App.makeSearcher - |> Console.prompt Console.Terminal "Search and launch:" filePrompt 10 - |> Option.iter (chooseLauncher folder) - - let withLoader<'T> (worker: StatusContext -> 'T) = - AnsiConsole.Status().Start("Indexing...", worker) - - let currentPath = FolderPath Environment.CurrentDirectory - - let findFolder () = - let rec find path = - match Db.findFolder path with - | Some f -> Some f - | None -> - let parentFolder = - (path.value |> Path.GetDirectoryName |> Option.ofObj |> (Option.map FolderPath)) - - match parentFolder with - | None -> None - | Some p -> find p - - find currentPath - - let toCount str num = - if num > 1 then $"%i{num} %s{str}s" else $"%i{num} %s{str}" - - let noNull s = if isNull s then "" else s - - let printLaunchers folder = - let launchers = - Table() - .AddColumns( - [| - "Name" - "Choose" - "Path" - "Arguments" - |] - ) - - launchers.Border <- TableBorder.Minimal - - for l in folder.Launchers do - launchers.AddRow( - [| - l.Name - string l.Choose - l.Path.value - noNull l.Arguments - |] - ) - |> ignore - - AnsiConsole.Write launchers + open System.Diagnostics + type Path = System.IO.Path + + let markup value = AnsiConsole.MarkupLine value + + let notInitialized () = + markup $"Folder not yet indexed: [yellow]%s{IO.AppName}[/] index [gray]--help[/]" + 1 + + let run (file: File) launcher = + markup $"""Launching [green]%s{file.Name.value}[/] [gray]%s{file.Path.value}[/]...""" + let file = file |> File.triggered |> Db.updateFile + + match launcher with + | None -> + let psi = ProcessStartInfo file.Path.value + psi.UseShellExecute <- true + Process.Start psi |> ignore + | Some launcher -> + let path = + match launcher.Choose with + | Choose.File -> file.Path.value + | Choose.Directory -> Path.GetDirectoryName file.Path.value + | _ -> NotImplementedException() |> raise + + let psi = ProcessStartInfo launcher.Path.value + psi.Arguments <- Launcher.buildArgs launcher path + Process.Start psi |> ignore + + let chooseLauncher folder file = + match folder.Launchers with + | [||] -> run file None + | [| launcher |] -> run file (Some launcher) + | launchers -> + Helpers.searchByName launchers (fun l -> l.Name) + |> Console.prompt Console.Terminal "With which launcher?" Launcher.name 10 + |> function + | Some launcher -> run file (Some launcher) + | None -> () + + let filePrompt (file: File) : string = + $"""[white]%s{file.Name.value}[/] [gray](%s{file.Path.folder.value})[/]""" + + let prompt folder = + folder + |> App.makeSearcher + |> Console.prompt Console.Terminal "Search and launch:" filePrompt 10 + |> Option.iter (chooseLauncher folder) + + let withLoader<'T> (worker: StatusContext -> 'T) = + AnsiConsole.Status().Start("Indexing...", worker) + + let currentPath = FolderPath Environment.CurrentDirectory + + let findFolder () = + let rec find path = + match Db.findFolder path with + | Some f -> Some f + | None -> + let parentFolder = + (path.value |> Path.GetDirectoryName |> Option.ofObj |> (Option.map FolderPath)) + + match parentFolder with + | None -> None + | Some p -> find p + + find currentPath + + let toCount str num = + if num > 1 then $"%i{num} %s{str}s" else $"%i{num} %s{str}" + + let noNull s = if isNull s then "" else s + + let printLaunchers (folder: Folder) = + let launchers = + Table() + .AddColumns( + [| + "Name" + "Choose" + "Path" + "Arguments" + |] + ) + + launchers.Border <- TableBorder.Minimal + + for l in folder.Launchers do + launchers.AddRow( + [| + l.Name + string l.Choose + l.Path.value + noNull l.Arguments + |] + ) + |> ignore + + AnsiConsole.Write launchers type PromptCommand() = - inherit Command() + inherit Command() - override _.Execute c = - findFolder () - |> Option.map (prompt >> fun () -> 0) - |> Option.defaultWith notInitialized + override _.Execute c = + findFolder () + |> Option.map (prompt >> fun () -> 0) + |> Option.defaultWith notInitialized type IndexSettings() = - inherit CommandSettings() + inherit CommandSettings() - [")>] - [] - member val Pattern = "" with get, set + [")>] + [] + member val Pattern = "" with get, set - [] - [] - member val IsRegex = false with get, set + [] + [] + member val IsRegex = false with get, set type IndexCommand() = - inherit Command() - - override _.Execute(_, settings) = - fun _ -> - App.index IO.getFiles Db.upsertFolder { - Path = currentPath - Pattern = Pattern.init settings.Pattern settings.IsRegex - Launchers = Array.empty - } - |> withLoader - |> function - | Some folder -> - printfn $"""%s{toCount "file" folder.Files.Length} indexed.""" - markup $"Start to search and launch: [yellow]%s{IO.AppName}[/]" - markup $"Add a specific launcher: [yellow]%s{IO.AppName}[/] launcher [gray]--help[/]" - 0 - | None -> - printfn $"%s{Console.NoMatch}" - -1 + inherit Command() + + override _.Execute(_, settings) = + (fun _ -> + App.index IO.getFiles Db.upsertFolder { + Path = currentPath + Pattern = Pattern.init settings.Pattern settings.IsRegex + Launchers = Array.empty + } + ) + |> withLoader + |> function + | Some folder -> + printfn $"""%s{toCount "file" folder.Files.Length} indexed.""" + markup $"Start to search and launch: [yellow]%s{IO.AppName}[/]" + markup $"Add a specific launcher: [yellow]%s{IO.AppName}[/] launcher [gray]--help[/]" + 0 + | None -> + printfn $"%s{Console.NoMatch}" + -1 type LauncherSettings() = - inherit CommandSettings() + inherit CommandSettings() - [")>] - [] - member val Name = "" with get, set + [")>] + [] + member val Name = "" with get, set type SetLauncherSettings() = - inherit LauncherSettings() + inherit LauncherSettings() - [")>] - [] - member val Path = "" with get, set + [")>] + [] + member val Path = "" with get, set - [] - [] - member val Arguments = "" with get, set + [] + [] + member val Arguments = "" with get, set - [] - [] - member val Choose = Choose.File with get, set + [] + [] + member val Choose = Choose.File with get, set type RemoveLauncherSettings() = - inherit LauncherSettings() + inherit LauncherSettings() type SetLauncherCommand() = - inherit Command() - - override _.Execute(_, settings) = - match findFolder () with - | None -> notInitialized () - | Some folder -> - markup $"[teal]%s{settings.Name}[/] launcher updated." - - { - Name = settings.Name - Path = FilePath settings.Path - Arguments = settings.Arguments - Choose = settings.Choose - } - |> fun launcher -> - match folder.Launchers |> Array.tryFindIndex (fun l -> l.Name = launcher.Name) with - | Some index -> - folder.Launchers.[index] <- launcher - folder - | None -> { folder with Launchers = Array.insertAt 0 launcher folder.Launchers } - |> Db.upsertFolder - |> printLaunchers - - 0 - - interface ICommandLimiter + inherit Command() + + override _.Execute(_, settings) = + match findFolder () with + | None -> notInitialized () + | Some folder -> + markup $"[teal]%s{settings.Name}[/] launcher updated." + + { + Name = settings.Name + Path = FilePath settings.Path + Arguments = settings.Arguments + Choose = settings.Choose + } + |> fun launcher -> + match folder.Launchers |> Array.tryFindIndex (fun l -> l.Name = launcher.Name) with + | Some index -> + folder.Launchers.[index] <- launcher + folder + | None -> { folder with Launchers = Array.insertAt 0 launcher folder.Launchers } + |> Db.upsertFolder + |> printLaunchers + + 0 + + interface ICommandLimiter type RemoveLauncherCommand() = - inherit Command() + inherit Command() - override _.Execute(_, settings) = - match findFolder () with - | None -> notInitialized () - | Some folder -> - match folder.Launchers |> Array.tryFindIndex (fun l -> l.Name = settings.Name) with - | Some index -> - markup $"[green]%s{settings.Name}[/] launcher removed." + override _.Execute(_, settings) = + match findFolder () with + | None -> notInitialized () + | Some folder -> + match folder.Launchers |> Array.tryFindIndex (fun l -> l.Name = settings.Name) with + | Some index -> + markup $"[green]%s{settings.Name}[/] launcher removed." - { folder with Launchers = Array.removeAt index folder.Launchers } - |> Db.upsertFolder - |> printLaunchers + { folder with Launchers = Array.removeAt index folder.Launchers } + |> Db.upsertFolder + |> printLaunchers - 0 - | None -> - markup $"[green]%s{settings.Name}[/] launcher not found." - printLaunchers folder - 0 + 0 + | None -> + markup $"[green]%s{settings.Name}[/] launcher not found." + printLaunchers folder + 0 - interface ICommandLimiter + interface ICommandLimiter type DeindexCommand() = - inherit Command() + inherit Command() - override _.Execute _ = - match Db.findFolder currentPath with - | None -> notInitialized () - | Some folder -> - Db.deleteFolder folder.Path - printfn "Deindexed" - 0 + override _.Execute _ = + match Db.findFolder currentPath with + | None -> notInitialized () + | Some folder -> + Db.deleteFolder folder.Path + printfn "Deindexed" + 0 type InfoCommand() = - inherit Command() - - override _.Execute _ = - match findFolder () with - | None -> notInitialized () - | Some folder -> - markup $"[teal]Path:[/]\n %s{folder.Path.value.EscapeMarkup()}" - - markup $"\n[teal]Pattern:[/]\n %s{folder.Pattern.value.EscapeMarkup()}" - - markup "\n[teal]Launchers:[/]" - - if Array.isEmpty folder.Launchers then - printfn " -\n" - else - printLaunchers folder - - markup "[teal]Indexed files:[/]" - - let files = - Table() - .AddColumns( - [| - "Name" - "Triggered" - "Path" - |] - ) + inherit Command() + + override _.Execute _ = + match findFolder () with + | None -> notInitialized () + | Some folder -> + markup $"[teal]Path:[/]\n %s{folder.Path.value.EscapeMarkup()}" + + markup $"\n[teal]Pattern:[/]\n %s{folder.Pattern.value.EscapeMarkup()}" + + markup "\n[teal]Launchers:[/]" + + if Array.isEmpty folder.Launchers then + printfn " -\n" + else + printLaunchers folder + + markup "[teal]Indexed files:[/]" + + let files = + Table() + .AddColumns( + [| + "Name" + "Triggered" + "Path" + |] + ) + + files.Border <- TableBorder.Minimal + + for f in folder.Files do + let path = f.Path.value.Remove(0, folder.Path.value.Length) + + files.AddRow( + [| + f.Name.value + string f.Triggered + path + |] + ) + |> ignore - files.Border <- TableBorder.Minimal + AnsiConsole.Write files - for f in folder.Files do - let path = f.Path.value.Remove(0, folder.Path.value.Length) + 0 - files.AddRow( - [| - f.Name.value - string f.Triggered - path - |] - ) - |> ignore +type RefreshCommand() = + inherit Command() - AnsiConsole.Write files + override _.Execute _ = + match findFolder () with + | None -> notInitialized () + | Some folder -> + fun _ -> folder |> App.refresh IO.getFiles Db.upsertFolder + |> withLoader + |> Option.iter prompt - 0 + 0 -type RefreshCommand() = - inherit Command() +module Program = - override _.Execute _ = - match findFolder () with - | None -> notInitialized () - | Some folder -> - fun _ -> folder |> App.refresh IO.getFiles Db.upsertFolder - |> withLoader - |> Option.iter prompt + [] + let main args = + let app = CommandApp() - 0 + app.Configure(fun conf -> + conf.SetApplicationName(IO.AppName) |> ignore -module Program = + conf + .AddCommand("prompt") + .WithDescription( + "[italic](default command)[/] Type to search. Arrows Up/Down to navigate. Enter to launch. Escape to quit." + ) + |> ignore - [] - let main args = - let app = CommandApp() - - app.Configure(fun conf -> - conf.SetApplicationName(IO.AppName) |> ignore - - conf - .AddCommand("prompt") - .WithDescription( - "[italic](default command)[/] Type to search. Arrows Up/Down to navigate. Enter to launch. Escape to quit." - ) - |> ignore - - conf - .AddCommand("index") - .WithDescription( - "Indexes all files recursively with a specific pattern which can be a wildcard [italic](default)[/] or a regular expression." - ) - |> ignore - - conf.AddBranch( - "launcher", - fun launcher -> - launcher.SetDescription("Add, update or remove a launcher [italic](optional)[/].") - - launcher - .AddCommand("set") - .WithDescription("Add or update a launcher.") - |> ignore - - launcher - .AddCommand("remove") - .WithDescription("Remove a launcher.") - |> ignore - ) - |> ignore - - conf - .AddCommand("deindex") - .WithDescription("Clears the current index.") - |> ignore - - conf - .AddCommand("info") - .WithDescription("Prints the current pattern and all the indexed files.") - |> ignore - - conf - .AddCommand("refresh") - .WithDescription("Updates the current index.") - |> ignore - - conf.AddExample( - [| - "index" - "*.sln" - |] - ) - - conf.AddExample( - [| - "index" - "\"(.*)[.](fs|cs)proj$\"" - "--regex" - |] - ) - - conf.AddExample( - [| - "launcher" - "mylauncher" - "set" - "execpath" - |] - ) - - conf.AddExample( - [| - "launcher" - "mylauncher" - "remove" - |] - ) - - conf.AddExample( - [| - "launcher" - "vscode" - "set" - "/usr/bin/code" - "--choose" - "file" - "--args=\"-r %s\"" - |] - ) - - conf.AddExample( - [| - "launcher" - "vscode" - "set" - @"""$env:LOCALAPPDATA\Programs\Microsoft VS Code\bin\code.cmd""" - "--choose" - "directory" - |] - ) - - conf.AddExample( - [| - "launcher" - "explorer" - "set" - "explorer.exe" - "--choose" - "directory" - |] - ) + conf + .AddCommand("index") + .WithDescription( + "Indexes all files recursively with a specific pattern which can be a wildcard [italic](default)[/] or a regular expression." + ) + |> ignore + + conf.AddBranch( + "launcher", + fun launcher -> + launcher.SetDescription("Add, update or remove a launcher [italic](optional)[/].") + + launcher + .AddCommand("set") + .WithDescription("Add or update a launcher.") + |> ignore + + launcher + .AddCommand("remove") + .WithDescription("Remove a launcher.") + |> ignore + ) + |> ignore + + conf + .AddCommand("deindex") + .WithDescription("Clears the current index.") + |> ignore + + conf + .AddCommand("info") + .WithDescription("Prints the current pattern and all the indexed files.") + |> ignore + + conf + .AddCommand("refresh") + .WithDescription("Updates the current index.") + |> ignore + + conf.AddExample( + [| + "index" + "*.sln" + |] + ) + + conf.AddExample( + [| + "index" + "\"(.*)[.](fs|cs)proj$\"" + "--regex" + |] + ) + + conf.AddExample( + [| + "launcher" + "mylauncher" + "set" + "execpath" + |] + ) + + conf.AddExample( + [| + "launcher" + "mylauncher" + "remove" + |] + ) + + conf.AddExample( + [| + "launcher" + "vscode" + "set" + "/usr/bin/code" + "--choose" + "file" + "--args=\"-r %s\"" + |] + ) + + conf.AddExample( + [| + "launcher" + "vscode" + "set" + @"""$env:LOCALAPPDATA\Programs\Microsoft VS Code\bin\code.cmd""" + "--choose" + "directory" + |] + ) + + conf.AddExample( + [| + "launcher" + "explorer" + "set" + "explorer.exe" + "--choose" + "directory" + |] + ) #if DEBUG - conf.ValidateExamples() |> ignore + conf.ValidateExamples() |> ignore #endif - ) + ) - app.Run args + app.Run args diff --git a/extLauncher/extLauncher.fsproj b/extLauncher/extLauncher.fsproj index a040178..dc2114d 100644 --- a/extLauncher/extLauncher.fsproj +++ b/extLauncher/extLauncher.fsproj @@ -2,7 +2,7 @@ Exe - net6.0;net8.0 + net9.0 preview true true diff --git a/paket.lock b/paket.lock index 0199022..d341d31 100644 --- a/paket.lock +++ b/paket.lock @@ -1,35 +1,35 @@ STORAGE: NONE NUGET remote: https://api.nuget.org/v3/index.json - coverlet.collector (6.0) + coverlet.collector (6.0.3) FsCheck (2.16.6) FSharp.Core (>= 4.0.0.1) - restriction: && (< net452) (>= netstandard1.0) (< netstandard1.6) FSharp.Core (>= 4.2.3) - restriction: || (>= net452) (>= netstandard1.6) FsCheck.Xunit (2.16.6) FsCheck (2.16.6) xunit.extensibility.execution (>= 2.2 < 3.0) - FSharp.Core (8.0.101) - restriction: >= netstandard1.0 - LiteDB (5.0.17) + FSharp.Core (9.0.100) - restriction: >= netstandard1.0 + LiteDB (5.0.21) NETStandard.Library (>= 1.6.1) - restriction: && (< net45) (>= netstandard1.3) (< netstandard2.0) + System.Buffers (>= 4.5.1) - restriction: || (>= net45) (>= netstandard1.3) System.Reflection.TypeExtensions (>= 4.5.1) - restriction: && (< net45) (>= netstandard1.3) (< netstandard2.0) System.Security.Cryptography.Algorithms (>= 4.3.1) - restriction: && (< net45) (>= netstandard1.3) (< netstandard2.0) - Microsoft.CodeCoverage (17.8) - restriction: || (>= net462) (>= netcoreapp3.1) - Microsoft.NET.Test.Sdk (17.8) - Microsoft.CodeCoverage (>= 17.8) - restriction: || (>= net462) (>= netcoreapp3.1) - Microsoft.TestPlatform.TestHost (>= 17.8) - restriction: >= netcoreapp3.1 + Microsoft.CodeCoverage (17.12) - restriction: || (>= net462) (>= netcoreapp3.1) + Microsoft.NET.Test.Sdk (17.12) + Microsoft.CodeCoverage (>= 17.12) - restriction: || (>= net462) (>= netcoreapp3.1) + Microsoft.TestPlatform.TestHost (>= 17.12) - restriction: >= netcoreapp3.1 Microsoft.NETCore.Platforms (7.0.4) - restriction: || (&& (< monoandroid) (< net45) (< netstandard1.3) (>= netstandard1.4) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (< netstandard1.3) (>= netstandard1.5) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (< netstandard1.3) (>= netstandard1.6) (< win8) (< wpa81)) (&& (< monoandroid) (< netstandard1.1) (>= netstandard1.3) (< win8)) (&& (< monoandroid) (< netstandard1.1) (>= netstandard1.4) (< win8)) (&& (< monoandroid) (< netstandard1.1) (>= netstandard1.5) (< win8)) (&& (< monoandroid) (< netstandard1.1) (>= netstandard1.6) (< win8)) (&& (< monotouch) (< net45) (>= netstandard1.6) (< netstandard2.0) (< xamarintvos) (< xamarinwatchos)) (&& (< net45) (>= net46) (< netstandard1.4)) (&& (< net45) (>= net461) (< netstandard2.0)) (&& (< net45) (< netstandard1.2) (>= netstandard1.3) (< win8)) (&& (< net45) (< netstandard1.2) (>= netstandard1.6) (< win8)) (&& (< net45) (>= netstandard1.3) (< netstandard1.4) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.4) (< netstandard1.5) (< win8) (< wpa81)) (&& (< net45) (< netstandard1.4) (>= netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.5) (< netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (< netstandard1.5) (>= netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.6) (< netstandard2.0) (< win8) (< wpa81)) (&& (>= netcoreapp2.0) (< netstandard2.0)) (&& (< netstandard1.0) (>= netstandard1.3) (< portable-net45+win8)) (&& (< netstandard1.0) (>= netstandard1.3) (>= win8)) (&& (< netstandard1.0) (>= netstandard1.3) (< win8)) (&& (< netstandard1.1) (>= uap10.0) (< win8)) (&& (>= netstandard1.3) (< portable-net45+win8+wpa81)) (&& (>= netstandard1.3) (>= wp8)) (&& (< netstandard1.3) (>= uap10.0) (< win8) (< wpa81)) (&& (< netstandard1.5) (>= uap10.0)) (>= uap10.1) Microsoft.NETCore.Targets (5.0) - restriction: || (&& (< monoandroid) (< net45) (< netstandard1.2) (>= netstandard1.3) (< win8)) (&& (< monoandroid) (< net45) (< netstandard1.2) (>= netstandard1.4) (< win8)) (&& (< monoandroid) (< net45) (>= netstandard1.3) (< netstandard1.4) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (< netstandard1.3) (>= netstandard1.4) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (< netstandard1.3) (>= netstandard1.5) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (< netstandard1.3) (>= netstandard1.6) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (>= netstandard1.4) (< netstandard1.5) (< win8) (< wpa81)) (&& (< monoandroid) (< netstandard1.1) (>= netstandard1.3) (< win8)) (&& (< monoandroid) (< netstandard1.1) (>= netstandard1.4) (< win8)) (&& (< monoandroid) (< netstandard1.1) (>= netstandard1.5) (< win8)) (&& (< monoandroid) (< netstandard1.1) (>= netstandard1.6) (< win8)) (&& (< monotouch) (< net45) (>= netstandard1.6) (< netstandard2.0) (< win8) (< wpa81) (< xamarintvos) (< xamarinwatchos)) (&& (< net45) (>= net46) (< netstandard1.4)) (&& (< net45) (< netstandard1.2) (>= netstandard1.5) (< win8)) (&& (< net45) (< netstandard1.2) (>= netstandard1.6) (< win8)) (&& (< net45) (< netstandard1.4) (>= netstandard1.5) (< win8) (< wpa81)) (&& (< net45) (< netstandard1.4) (>= netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.5) (< netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (< netstandard1.5) (>= netstandard1.6) (< win8) (< wpa81)) (&& (< netstandard1.1) (>= uap10.0) (< win8)) (&& (< netstandard1.2) (>= uap10.0) (< win8)) (&& (>= netstandard1.3) (< portable-net45+win8+wpa81)) (&& (< netstandard1.3) (>= uap10.0) (< win8) (< wpa81)) (&& (>= netstandard1.5) (< portable-net45+win8+wpa81)) (&& (< netstandard1.5) (>= netstandard1.6) (>= uap10.0)) (&& (< netstandard1.5) (>= uap10.0) (< uap10.1)) (&& (< netstandard1.5) (>= uap10.0) (< win8) (< wpa81)) - Microsoft.TestPlatform.ObjectModel (17.8) - restriction: || (>= net462) (>= netcoreapp3.1) - NuGet.Frameworks (>= 6.5) - restriction: || (>= net462) (>= netstandard2.0) + Microsoft.TestPlatform.ObjectModel (17.12) - restriction: || (>= net472) (>= netcoreapp3.1) System.Reflection.Metadata (>= 1.6) - restriction: || (>= net462) (>= netstandard2.0) - Microsoft.TestPlatform.TestHost (17.8) - restriction: >= netcoreapp3.1 - Microsoft.TestPlatform.ObjectModel (>= 17.8) - restriction: >= netcoreapp3.1 + Microsoft.TestPlatform.TestHost (17.12) - restriction: >= netcoreapp3.1 + Microsoft.TestPlatform.ObjectModel (>= 17.12) - restriction: >= netcoreapp3.1 Newtonsoft.Json (>= 13.0.1) - restriction: >= netcoreapp3.1 Microsoft.Win32.Primitives (4.3) - restriction: || (&& (< monoandroid) (< net45) (< netstandard1.2) (>= netstandard1.3) (< win8)) (&& (< net45) (>= net46) (< netstandard1.4)) (&& (< net45) (>= netstandard1.3) (< netstandard1.4) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.4) (< netstandard1.5) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.5) (< netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.6) (< netstandard2.0) (< win8) (< wpa81)) (&& (< netstandard1.5) (>= uap10.0) (< uap10.1)) (&& (< netstandard1.5) (>= uap10.0) (< win8) (< wpa81)) Microsoft.NETCore.Platforms (>= 1.1) - restriction: && (< monoandroid) (< monotouch) (< net46) (>= netstandard1.3) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos) Microsoft.NETCore.Targets (>= 1.1) - restriction: && (< monoandroid) (< monotouch) (< net46) (>= netstandard1.3) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos) System.Runtime (>= 4.3) - restriction: && (< monoandroid) (< monotouch) (< net46) (>= netstandard1.3) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos) - NETStandard.Library (2.0.3) - restriction: || (&& (< net35) (>= netstandard1.1) (< netstandard2.0)) (&& (< net45) (>= netstandard1.3) (< netstandard2.0)) (&& (< net452) (>= netstandard1.1)) + NETStandard.Library (2.0.3) - restriction: || (&& (< net35) (>= netstandard1.1) (< netstandard2.0)) (&& (< net45) (>= netstandard1.3) (< netstandard2.0)) (&& (< net452) (>= netstandard1.1) (< netstandard2.0)) Microsoft.NETCore.Platforms (>= 1.1) - restriction: || (&& (>= net45) (< netstandard1.3)) (&& (< net45) (>= netstandard1.1) (< netstandard1.2) (< win8)) (&& (< net45) (>= netstandard1.2) (< netstandard1.3) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.3) (< netstandard1.4) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.4) (< netstandard1.5) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.5) (< netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.6) (< netstandard2.0) (< win8) (< wpa81)) (&& (< net45) (>= netstandard2.0)) (&& (>= net46) (< netstandard1.4)) (>= net461) (>= netcoreapp2.0) (&& (>= netstandard1.0) (< portable-net45+win8+wpa81)) (&& (< netstandard1.0) (>= portable-net45+win8) (< win8)) (&& (< netstandard1.0) (< portable-net45+win8) (>= portable-net45+win8+wpa81)) (&& (< netstandard1.0) (>= portable-net45+win8+wp8+wpa81) (< portable-net45+win8+wpa81)) (&& (< netstandard1.0) (>= win8)) (&& (< netstandard1.3) (< win8) (>= wpa81)) (&& (< netstandard1.5) (>= uap10.0)) (>= uap10.1) (>= wp8) Microsoft.Win32.Primitives (>= 4.3) - restriction: || (&& (< net45) (>= netstandard1.3) (< netstandard1.4) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.4) (< netstandard1.5) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.5) (< netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.6) (< netstandard2.0) (< win8) (< wpa81)) (&& (>= net46) (< netstandard1.4)) (&& (< netstandard1.5) (>= uap10.0) (< uap10.1)) System.AppContext (>= 4.3) - restriction: || (&& (< net45) (>= netstandard1.3) (< netstandard1.4) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.4) (< netstandard1.5) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.5) (< netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.6) (< netstandard2.0) (< win8) (< wpa81)) (&& (>= net46) (< netstandard1.4)) (&& (< netstandard1.5) (>= uap10.0) (< uap10.1)) @@ -75,7 +75,6 @@ NUGET System.Xml.ReaderWriter (>= 4.3) - restriction: || (&& (< net45) (>= netstandard1.1) (< netstandard1.2) (< win8)) (&& (< net45) (>= netstandard1.2) (< netstandard1.3) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.3) (< netstandard1.4) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.4) (< netstandard1.5) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.5) (< netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.6) (< netstandard2.0) (< win8) (< wpa81)) (&& (>= net46) (< netstandard1.4)) (&& (>= netstandard1.0) (< portable-net45+win8+wpa81) (< wp8)) (&& (< netstandard1.5) (>= uap10.0) (< uap10.1)) System.Xml.XDocument (>= 4.3) - restriction: || (&& (< net45) (>= netstandard1.1) (< netstandard1.2) (< win8)) (&& (< net45) (>= netstandard1.2) (< netstandard1.3) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.3) (< netstandard1.4) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.4) (< netstandard1.5) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.5) (< netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.6) (< netstandard2.0) (< win8) (< wpa81)) (&& (>= netstandard1.0) (< portable-net45+win8+wpa81) (< wp8)) (&& (< netstandard1.5) (>= uap10.0) (< uap10.1)) Newtonsoft.Json (13.0.3) - restriction: >= netcoreapp3.1 - NuGet.Frameworks (6.8) - restriction: >= net462 runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) - restriction: && (< monotouch) (< net45) (>= netstandard1.6) (< netstandard2.0) (< xamarintvos) (< xamarinwatchos) runtime.debian.9-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) - restriction: && (< monotouch) (< net45) (>= netstandard1.6) (< netstandard2.0) (< xamarintvos) (< xamarinwatchos) runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) - restriction: && (< monotouch) (< net45) (>= netstandard1.6) (< netstandard2.0) (< xamarintvos) (< xamarinwatchos) @@ -119,13 +118,13 @@ NUGET runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) - restriction: && (< monotouch) (< net45) (>= netstandard1.6) (< netstandard2.0) (< xamarintvos) (< xamarinwatchos) runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) - restriction: && (< monotouch) (< net45) (>= netstandard1.6) (< netstandard2.0) (< xamarintvos) (< xamarinwatchos) runtime.ubuntu.18.04-x64.runtime.native.System.Security.Cryptography.OpenSsl (4.3.3) - restriction: && (< monotouch) (< net45) (>= netstandard1.6) (< netstandard2.0) (< xamarintvos) (< xamarinwatchos) - Spectre.Console (0.48) - System.Memory (>= 4.5.5) - restriction: >= netstandard2.0 - Spectre.Console.Cli (0.48) - Spectre.Console (>= 0.48) - restriction: >= netstandard2.0 + Spectre.Console (0.49.1) + System.Memory (>= 4.5.5) - restriction: && (< net6.0) (>= netstandard2.0) + Spectre.Console.Cli (0.49.1) + Spectre.Console (>= 0.49.1) - restriction: >= netstandard2.0 System.AppContext (4.3) - restriction: || (&& (< net45) (>= net46) (< netstandard1.4)) (&& (< net45) (>= netstandard1.3) (< netstandard1.4) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.4) (< netstandard1.5) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.5) (< netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.6) (< netstandard2.0) (< win8) (< wpa81)) (&& (< netstandard1.5) (>= uap10.0) (< uap10.1)) System.Runtime (>= 4.3) - restriction: || (&& (< monoandroid) (< net46) (>= netstandard1.3) (< netstandard1.6)) (&& (< monotouch) (< net46) (>= netstandard1.6) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos)) - System.Buffers (4.5.1) - restriction: || (&& (>= monoandroid) (< netstandard1.1) (>= netstandard2.0)) (&& (< monoandroid) (< monotouch) (< net45) (>= netstandard1.6) (< netstandard2.0) (< win8) (< wpa81) (< xamarintvos) (< xamarinwatchos)) (&& (< monoandroid) (< net45) (< netstandard1.2) (>= netstandard1.3) (< win8)) (&& (< monoandroid) (< net45) (>= netstandard1.3) (< netstandard1.4) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (>= netstandard1.4) (< netstandard1.5) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (>= netstandard1.5) (< netstandard1.6) (< win8) (< wpa81)) (&& (< monoandroid) (< netstandard1.1) (>= netstandard2.0) (< win8)) (&& (>= monotouch) (>= netstandard2.0)) (&& (< net45) (>= net46) (< netstandard1.4)) (&& (< net45) (< netcoreapp2.0) (>= netstandard2.0)) (&& (>= net461) (>= netstandard2.0)) (&& (< netstandard1.1) (>= netstandard2.0) (>= win8)) (&& (< netstandard1.5) (>= uap10.0) (< uap10.1)) (&& (< netstandard1.5) (>= uap10.0) (< win8) (< wpa81)) (&& (>= netstandard2.0) (>= xamarintvos)) (&& (>= netstandard2.0) (>= xamarinwatchos)) (>= xamarinios) (>= xamarinmac) + System.Buffers (4.6) - restriction: || (&& (< monoandroid) (< monotouch) (>= netstandard1.6) (< netstandard2.0) (< win8) (< wpa81) (< xamarintvos) (< xamarinwatchos)) (&& (< monoandroid) (>= netstandard1.4) (< netstandard1.5) (< win8) (< wpa81)) (&& (< monoandroid) (>= netstandard1.5) (< netstandard1.6) (< win8) (< wpa81)) (>= net45) (&& (>= net46) (< netstandard1.4)) (&& (>= net462) (>= netstandard2.0)) (&& (< netcoreapp2.1) (>= netstandard2.0)) (>= netstandard1.3) (&& (< netstandard1.5) (>= uap10.0) (< uap10.1)) (&& (< netstandard1.5) (>= uap10.0) (< win8) (< wpa81)) System.Collections (4.3) - restriction: || (&& (< monotouch) (< net45) (>= netstandard1.6) (< netstandard2.0) (< xamarintvos) (< xamarinwatchos)) (&& (< net45) (>= net46) (< netstandard1.4)) (&& (< net45) (< netstandard1.2) (>= netstandard1.3) (< win8)) (&& (< net45) (< netstandard1.2) (>= netstandard1.6) (< win8)) (&& (< net45) (>= netstandard1.3) (< netstandard1.4) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.4) (< netstandard1.5) (< win8) (< wpa81)) (&& (< net45) (< netstandard1.4) (>= netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.5) (< netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (< netstandard1.5) (>= netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.6) (< netstandard2.0) (< win8) (< wpa81)) (&& (>= netstandard1.3) (< portable-net45+win8+wpa81)) (&& (< netstandard1.5) (>= netstandard1.6) (>= uap10.0)) (&& (< netstandard1.5) (>= uap10.0) (< uap10.1)) (&& (< netstandard1.5) (>= uap10.0) (< win8) (< wpa81)) (&& (>= netstandard1.6) (< portable-net45+win8+wpa81)) Microsoft.NETCore.Platforms (>= 1.1) - restriction: || (&& (< monoandroid) (< monotouch) (< net45) (>= netstandard1.3) (< win8) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos)) (&& (< monoandroid) (< net45) (>= netstandard1.0) (< netstandard1.3) (< win8) (< wp8) (< wpa81)) Microsoft.NETCore.Targets (>= 1.1) - restriction: || (&& (< monoandroid) (< monotouch) (< net45) (>= netstandard1.3) (< win8) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos)) (&& (< monoandroid) (< net45) (>= netstandard1.0) (< netstandard1.3) (< win8) (< wp8) (< wpa81)) @@ -141,9 +140,9 @@ NUGET System.Runtime.Extensions (>= 4.3) - restriction: && (< monoandroid) (< monotouch) (< net45) (>= netstandard1.3) (< win8) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos) System.Threading (>= 4.3) - restriction: && (< monoandroid) (< monotouch) (< net45) (>= netstandard1.3) (< win8) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos) System.Threading.Tasks (>= 4.3) - restriction: || (&& (< monoandroid) (< monotouch) (< net45) (>= netstandard1.3) (< win8) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos)) (&& (< monoandroid) (< net45) (>= netstandard1.1) (< netstandard1.3) (< win8) (< wpa81)) - System.Collections.Immutable (8.0) - restriction: >= net462 - System.Memory (>= 4.5.5) - restriction: || (>= net462) (&& (< net6.0) (>= netstandard2.0)) - System.Runtime.CompilerServices.Unsafe (>= 6.0) - restriction: || (>= net462) (&& (>= net6.0) (< net7.0)) (&& (< net6.0) (>= netstandard2.0)) + System.Collections.Immutable (9.0) - restriction: >= net472 + System.Memory (>= 4.5.5) - restriction: || (>= net462) (&& (< net8.0) (>= netstandard2.0)) + System.Runtime.CompilerServices.Unsafe (>= 6.0) - restriction: || (>= net462) (&& (< net8.0) (>= netstandard2.0)) System.Console (4.3.1) - restriction: || (&& (< net45) (>= net46) (< netstandard1.4)) (&& (< net45) (>= netstandard1.3) (< netstandard1.4) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.4) (< netstandard1.5) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.5) (< netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.6) (< netstandard2.0) (< win8) (< wpa81)) (&& (< netstandard1.5) (>= uap10.0) (< uap10.1)) Microsoft.NETCore.Platforms (>= 1.1) - restriction: && (< monoandroid) (< monotouch) (< net46) (>= netstandard1.3) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos) Microsoft.NETCore.Targets (>= 1.1.2) - restriction: && (< monoandroid) (< monotouch) (< net46) (>= netstandard1.3) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos) @@ -154,7 +153,7 @@ NUGET Microsoft.NETCore.Platforms (>= 1.1) - restriction: || (&& (< monoandroid) (< monotouch) (< net45) (>= netstandard1.3) (< win8) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos)) (&& (< monoandroid) (< net45) (>= netstandard1.0) (< netstandard1.3) (< win8) (< wp8) (< wpa81)) Microsoft.NETCore.Targets (>= 1.1) - restriction: || (&& (< monoandroid) (< monotouch) (< net45) (>= netstandard1.3) (< win8) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos)) (&& (< monoandroid) (< net45) (>= netstandard1.0) (< netstandard1.3) (< win8) (< wp8) (< wpa81)) System.Runtime (>= 4.3) - restriction: || (&& (< monoandroid) (< monotouch) (< net45) (>= netstandard1.3) (< win8) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos)) (&& (< monoandroid) (< net45) (>= netstandard1.0) (< netstandard1.3) (< win8) (< wp8) (< wpa81)) - System.Diagnostics.DiagnosticSource (8.0) - restriction: || (&& (< monoandroid) (< net45) (< netstandard1.2) (>= netstandard1.3) (< win8)) (&& (< monoandroid) (< net45) (>= netstandard1.3) (< netstandard1.4) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (>= netstandard1.4) (< netstandard1.5) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (>= netstandard1.5) (< netstandard1.6) (< win8) (< wpa81)) (&& (< monotouch) (< net45) (>= netstandard1.6) (< netstandard2.0) (< win8) (< wpa81) (< xamarintvos) (< xamarinwatchos)) (&& (< net45) (>= net46) (< netstandard1.4)) (&& (< net45) (< netstandard1.2) (>= netstandard1.6) (< win8)) (&& (< net45) (< netstandard1.4) (>= netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (< netstandard1.5) (>= netstandard1.6) (< win8) (< wpa81)) (&& (< netstandard1.5) (>= netstandard1.6) (>= uap10.0)) (&& (< netstandard1.5) (>= uap10.0) (< win8) (< wpa81)) + System.Diagnostics.DiagnosticSource (9.0) - restriction: || (&& (< monoandroid) (< net45) (< netstandard1.2) (>= netstandard1.3) (< win8)) (&& (< monoandroid) (< net45) (>= netstandard1.3) (< netstandard1.4) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (>= netstandard1.4) (< netstandard1.5) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (>= netstandard1.5) (< netstandard1.6) (< win8) (< wpa81)) (&& (< monotouch) (< net45) (>= netstandard1.6) (< netstandard2.0) (< win8) (< wpa81) (< xamarintvos) (< xamarinwatchos)) (&& (< net45) (>= net46) (< netstandard1.4)) (&& (< net45) (< netstandard1.2) (>= netstandard1.6) (< win8)) (&& (< net45) (< netstandard1.4) (>= netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (< netstandard1.5) (>= netstandard1.6) (< win8) (< wpa81)) (&& (< netstandard1.5) (>= netstandard1.6) (>= uap10.0)) (&& (< netstandard1.5) (>= uap10.0) (< win8) (< wpa81)) System.Diagnostics.Tools (4.3) - restriction: || (&& (< net45) (< netstandard1.2) (>= netstandard1.3) (< win8)) (&& (< net45) (>= netstandard1.3) (< netstandard1.4) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.4) (< netstandard1.5) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.5) (< netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.6) (< netstandard2.0) (< win8) (< wpa81)) (&& (>= netstandard1.3) (< portable-net45+win8+wpa81)) (&& (< netstandard1.5) (>= uap10.0) (< uap10.1)) (&& (< netstandard1.5) (>= uap10.0) (< win8) (< wpa81)) Microsoft.NETCore.Platforms (>= 1.1) - restriction: && (< monoandroid) (< monotouch) (< net45) (>= netstandard1.0) (< win8) (< wp8) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos) Microsoft.NETCore.Targets (>= 1.1) - restriction: && (< monoandroid) (< monotouch) (< net45) (>= netstandard1.0) (< win8) (< wp8) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos) @@ -246,11 +245,10 @@ NUGET System.Runtime (>= 4.3) - restriction: || (&& (< monoandroid) (< net45) (>= netstandard1.0) (< netstandard1.3) (< win8) (< wp8) (< wpa81)) (&& (< monoandroid) (< net45) (>= netstandard1.3) (< netstandard1.6) (< win8) (< wpa81)) (&& (< monotouch) (< net45) (>= netstandard1.6) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos)) System.Runtime.Extensions (>= 4.3) - restriction: && (< monotouch) (< net45) (>= netstandard1.6) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos) System.Threading (>= 4.3) - restriction: && (< monotouch) (< net45) (>= netstandard1.6) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos) - System.Memory (4.5.5) - restriction: || (>= net462) (>= netstandard2.0) - System.Buffers (>= 4.5.1) - restriction: || (&& (>= monoandroid) (< netstandard1.1)) (&& (< monoandroid) (< net45) (>= netstandard1.1) (< netstandard2.0) (< win8) (< wpa81)) (&& (< monoandroid) (< netstandard1.1) (>= portable-net45+win8+wpa81) (< win8)) (>= monotouch) (&& (>= net45) (< netstandard2.0)) (&& (< net45) (< netcoreapp2.0) (>= netstandard2.0)) (>= net461) (&& (< netstandard1.1) (>= win8)) (&& (< netstandard2.0) (< uap10.1) (>= wpa81)) (>= xamarinios) (>= xamarinmac) (>= xamarintvos) (>= xamarinwatchos) - System.Numerics.Vectors (>= 4.4) - restriction: && (< net45) (< netcoreapp2.0) (>= netstandard2.0) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos) - System.Numerics.Vectors (>= 4.5) - restriction: >= net461 - System.Runtime.CompilerServices.Unsafe (>= 4.5.3) - restriction: || (&& (>= monoandroid) (< netstandard1.1)) (&& (< monoandroid) (< net45) (>= netstandard1.1) (< netstandard2.0) (< win8) (< wpa81)) (&& (< monoandroid) (>= netcoreapp2.0) (< netcoreapp2.1)) (&& (< monoandroid) (< netstandard1.1) (>= portable-net45+win8+wpa81) (< win8)) (>= monotouch) (&& (>= net45) (< netstandard2.0)) (&& (< net45) (< netcoreapp2.0) (>= netstandard2.0)) (>= net461) (&& (< netstandard1.1) (>= win8)) (&& (< netstandard2.0) (>= wpa81)) (>= uap10.1) (>= xamarinios) (>= xamarinmac) (>= xamarintvos) (>= xamarinwatchos) + System.Memory (4.6) - restriction: || (>= net472) (&& (< net6.0) (>= netstandard2.0)) + System.Buffers (>= 4.6) - restriction: || (>= net462) (&& (< netcoreapp2.1) (>= netstandard2.0)) + System.Numerics.Vectors (>= 4.6) - restriction: || (>= net462) (&& (< netcoreapp2.1) (>= netstandard2.0)) + System.Runtime.CompilerServices.Unsafe (>= 6.1) - restriction: || (>= net462) (&& (< netcoreapp2.1) (>= netstandard2.0)) System.Net.Http (4.3.4) - restriction: || (&& (< net45) (>= net46) (< netstandard1.4)) (&& (< net45) (< netstandard1.2) (>= netstandard1.3) (< win8)) (&& (< net45) (>= netstandard1.3) (< netstandard1.4) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.4) (< netstandard1.5) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.5) (< netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.6) (< netstandard2.0) (< win8) (< wpa81)) (&& (< netstandard1.5) (>= uap10.0) (< uap10.1)) Microsoft.NETCore.Platforms (>= 1.1.1) - restriction: || (&& (< monoandroid) (< net45) (>= netstandard1.3) (< netstandard1.6) (< win8) (< wpa81)) (&& (< monotouch) (< net45) (>= netstandard1.6) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos)) Microsoft.Win32.Primitives (>= 4.3) - restriction: && (< monoandroid) (< net45) (>= netstandard1.3) (< netstandard1.6) (< win8) (< wpa81) @@ -292,7 +290,7 @@ NUGET System.Net.Primitives (>= 4.3) - restriction: && (< monoandroid) (< monotouch) (< net46) (>= netstandard1.3) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos) System.Runtime (>= 4.3) - restriction: && (< monoandroid) (< monotouch) (< net46) (>= netstandard1.3) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos) System.Threading.Tasks (>= 4.3) - restriction: && (< monoandroid) (< monotouch) (< net46) (>= netstandard1.3) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos) - System.Numerics.Vectors (4.5) - restriction: || (&& (< net45) (< netcoreapp2.0) (>= netstandard2.0) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos)) (&& (>= net461) (>= netstandard2.0)) + System.Numerics.Vectors (4.6) - restriction: || (&& (>= net462) (>= netstandard2.0)) (&& (< netcoreapp2.1) (>= netstandard2.0)) System.ObjectModel (4.3) - restriction: || (&& (< net45) (< netstandard1.2) (>= netstandard1.3) (< win8)) (&& (< net45) (< netstandard1.2) (>= netstandard1.6) (< win8)) (&& (< net45) (>= netstandard1.3) (< netstandard1.4) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.4) (< netstandard1.5) (< win8) (< wpa81)) (&& (< net45) (< netstandard1.4) (>= netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.5) (< netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (< netstandard1.5) (>= netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.6) (< netstandard2.0) (< win8) (< wpa81)) (&& (>= netstandard1.3) (< portable-net45+win8+wpa81)) (&& (< netstandard1.5) (>= netstandard1.6) (>= uap10.0)) (&& (< netstandard1.5) (>= uap10.0) (< uap10.1)) (&& (>= netstandard1.6) (< portable-net45+win8+wpa81)) System.Collections (>= 4.3) - restriction: && (< monoandroid) (< monotouch) (< net45) (>= netstandard1.3) (< win8) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos) System.Diagnostics.Debug (>= 4.3) - restriction: && (< monoandroid) (< monotouch) (< net45) (>= netstandard1.3) (< win8) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos) @@ -329,9 +327,9 @@ NUGET Microsoft.NETCore.Targets (>= 1.1) - restriction: && (< monoandroid) (< monotouch) (< net45) (>= netstandard1.0) (< win8) (< wp8) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos) System.Reflection (>= 4.3) - restriction: && (< monoandroid) (< monotouch) (< net45) (>= netstandard1.0) (< win8) (< wp8) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos) System.Runtime (>= 4.3) - restriction: && (< monoandroid) (< monotouch) (< net45) (>= netstandard1.0) (< win8) (< wp8) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos) - System.Reflection.Metadata (8.0) - restriction: >= net462 - System.Collections.Immutable (>= 8.0) - restriction: || (>= net462) (>= netstandard2.0) - System.Memory (>= 4.5.5) - restriction: || (>= net462) (&& (< net6.0) (>= netstandard2.0)) + System.Reflection.Metadata (9.0) - restriction: >= net472 + System.Collections.Immutable (>= 9.0) - restriction: || (>= net462) (&& (>= net8.0) (< net9.0)) (&& (< net8.0) (>= netstandard2.0)) + System.Memory (>= 4.5.5) - restriction: || (>= net462) (&& (< net8.0) (>= netstandard2.0)) System.Reflection.Primitives (4.3) - restriction: || (&& (< monoandroid) (< net45) (< netstandard1.3) (>= netstandard1.4) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (< netstandard1.3) (>= netstandard1.5) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (< netstandard1.3) (>= netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (< netstandard1.2) (>= netstandard1.3) (< win8)) (&& (< net45) (< netstandard1.2) (>= netstandard1.5) (< win8)) (&& (< net45) (< netstandard1.2) (>= netstandard1.6) (< win8)) (&& (< net45) (>= netstandard1.3) (< netstandard1.4) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.4) (< netstandard1.5) (< win8) (< wpa81)) (&& (< net45) (< netstandard1.4) (>= netstandard1.5) (< win8) (< wpa81)) (&& (< net45) (< netstandard1.4) (>= netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.5) (< netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (< netstandard1.5) (>= netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.6) (< netstandard2.0) (< win8) (< wpa81)) (&& (>= netstandard1.3) (< portable-net45+win8+wpa81)) (&& (< netstandard1.3) (>= uap10.0) (< win8) (< wpa81)) (&& (>= netstandard1.5) (< portable-net45+win8+wpa81)) (&& (< netstandard1.5) (>= netstandard1.6) (>= uap10.0)) (&& (< netstandard1.5) (>= uap10.0) (< uap10.1)) (&& (< netstandard1.5) (>= uap10.0) (< win8) (< wpa81)) (&& (>= netstandard1.6) (< portable-net45+win8+wpa81)) Microsoft.NETCore.Platforms (>= 1.1) - restriction: && (< monoandroid) (< monotouch) (< net45) (>= netstandard1.0) (< win8) (< wp8) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos) Microsoft.NETCore.Targets (>= 1.1) - restriction: && (< monoandroid) (< monotouch) (< net45) (>= netstandard1.0) (< win8) (< wp8) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos) @@ -349,7 +347,7 @@ NUGET System.Runtime (4.3.1) - restriction: || (&& (< monoandroid) (< monotouch) (< net45) (>= netstandard1.5) (< netstandard2.0) (< xamarintvos) (< xamarinwatchos)) (&& (< monoandroid) (< net45) (>= netstandard1.3) (< netstandard1.4)) (&& (< monoandroid) (< net45) (>= netstandard1.3) (< netstandard1.5) (< uap10.1)) (&& (< monoandroid) (< net45) (< netstandard1.3) (>= netstandard1.4) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (< netstandard1.3) (>= netstandard1.5) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (< netstandard1.3) (>= netstandard1.6) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (>= netstandard1.4) (< netstandard1.6)) (&& (< monoandroid) (< netstandard1.1) (>= netstandard1.3) (< win8)) (&& (< monoandroid) (< netstandard1.1) (>= netstandard1.4) (< win8)) (&& (< monoandroid) (< netstandard1.1) (>= netstandard1.5) (< win8)) (&& (< monoandroid) (< netstandard1.1) (>= netstandard1.6) (< win8)) (&& (< monotouch) (< net45) (>= netstandard1.6) (< netstandard2.0) (< xamarintvos) (< xamarinwatchos)) (&& (< net45) (>= net46) (< netstandard1.4)) (&& (< net45) (>= net463) (< netstandard2.0)) (&& (< net45) (< netstandard1.2) (>= netstandard1.3) (< win8)) (&& (< net45) (< netstandard1.2) (>= netstandard1.5) (< win8)) (&& (< net45) (< netstandard1.2) (>= netstandard1.6) (< win8)) (&& (< net45) (>= netstandard1.3) (< netstandard1.4) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.4) (< netstandard1.5) (< win8) (< wpa81)) (&& (< net45) (< netstandard1.4) (>= netstandard1.5) (< win8) (< wpa81)) (&& (< net45) (< netstandard1.4) (>= netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.5) (< netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (< netstandard1.5) (>= netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.6) (< netstandard2.0) (< win8) (< wpa81)) (&& (< netstandard1.1) (>= uap10.0) (< win8)) (&& (>= netstandard1.3) (< portable-net45+win8+wpa81)) (&& (< netstandard1.3) (>= uap10.0) (< win8) (< wpa81)) (&& (>= netstandard1.5) (< portable-net45+win8+wpa81)) (&& (< netstandard1.5) (>= netstandard1.6) (>= uap10.0)) (&& (< netstandard1.5) (>= uap10.0) (< uap10.1)) (&& (< netstandard1.5) (>= uap10.0) (< win8) (< wpa81)) (&& (>= netstandard1.6) (< portable-net45+win8+wpa81)) Microsoft.NETCore.Platforms (>= 1.1.1) - restriction: || (&& (< monoandroid) (< net45) (>= netstandard1.0) (< netstandard1.2) (< win8) (< wp8)) (&& (< monoandroid) (< net45) (>= netstandard1.2) (< netstandard1.3) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (>= netstandard1.3) (< netstandard1.5) (< win8) (< wpa81)) (&& (< monotouch) (< net45) (>= netstandard1.5) (< win8) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos)) Microsoft.NETCore.Targets (>= 1.1.3) - restriction: || (&& (< monoandroid) (< net45) (>= netstandard1.0) (< netstandard1.2) (< win8) (< wp8)) (&& (< monoandroid) (< net45) (>= netstandard1.2) (< netstandard1.3) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (>= netstandard1.3) (< netstandard1.5) (< win8) (< wpa81)) (&& (< monotouch) (< net45) (>= netstandard1.5) (< win8) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos)) - System.Runtime.CompilerServices.Unsafe (6.0) - restriction: || (&& (>= monoandroid) (< netstandard1.1) (>= netstandard2.0)) (&& (< monoandroid) (< monotouch) (< net45) (>= netstandard1.6) (< netstandard2.0) (< win8) (< wpa81) (< xamarintvos) (< xamarinwatchos)) (&& (< monoandroid) (< net45) (< netstandard1.2) (>= netstandard1.3) (< win8)) (&& (< monoandroid) (< net45) (< netstandard1.2) (>= netstandard2.0) (< win8)) (&& (< monoandroid) (< net45) (>= netstandard1.3) (< netstandard1.4) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (>= netstandard1.4) (< netstandard1.5) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (< netstandard1.4) (>= netstandard2.0) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (>= netstandard1.5) (< netstandard1.6) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (< netstandard1.5) (>= netstandard2.0) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (< netstandard1.6) (>= netstandard2.0) (< win8) (< wpa81)) (&& (< monoandroid) (>= netcoreapp2.0) (< netcoreapp2.1)) (&& (< monoandroid) (< netstandard1.0) (>= netstandard1.3) (< win8)) (&& (< monoandroid) (< netstandard1.0) (>= netstandard1.4) (< win8)) (&& (< monoandroid) (< netstandard1.0) (>= netstandard1.5) (< win8)) (&& (< monoandroid) (< netstandard1.0) (>= netstandard1.6) (< win8)) (&& (< monoandroid) (< netstandard1.1) (>= netstandard2.0) (< win8)) (&& (>= monotouch) (>= netstandard2.0)) (&& (>= net45) (< netstandard1.5) (>= uap10.0)) (&& (< net45) (>= net46) (< netstandard1.4)) (&& (< net45) (>= net461) (< netstandard1.2)) (&& (< net45) (>= net461) (< netstandard1.4)) (&& (< net45) (>= net461) (>= netstandard1.5) (< netstandard1.6)) (&& (< net45) (>= net461) (< netstandard1.5)) (&& (< net45) (>= net461) (>= netstandard1.6) (< netstandard2.0)) (&& (< net45) (< netcoreapp2.0) (>= netstandard2.0)) (&& (>= net46) (< netstandard1.0)) (&& (>= net46) (< netstandard1.4) (>= wpa81)) (&& (>= net46) (>= wp8)) (&& (>= net461) (< netstandard1.5) (>= uap10.0)) (&& (>= net461) (>= netstandard2.0)) (&& (>= net461) (< portable-net45+win8+wpa81)) (>= net462) (&& (< netstandard1.0) (>= uap10.0) (< win8)) (&& (< netstandard1.1) (>= netstandard2.0) (>= win8)) (&& (< netstandard1.2) (>= netstandard1.3) (< win8) (>= wpa81)) (&& (>= netstandard1.3) (< portable-net45+win8+wpa81)) (&& (>= netstandard1.3) (>= wp8)) (&& (>= netstandard1.4) (>= wp8)) (&& (>= netstandard1.5) (>= wp8)) (&& (< netstandard1.5) (>= uap10.0) (< win8) (< wpa81)) (&& (>= netstandard1.6) (>= wp8)) (&& (>= netstandard2.0) (< portable-net45+win8+wpa81)) (&& (>= netstandard2.0) (>= uap10.1)) (&& (>= netstandard2.0) (>= xamarintvos)) (&& (>= netstandard2.0) (>= xamarinwatchos)) (&& (>= uap10.0) (>= wp8)) (>= xamarinios) (>= xamarinmac) + System.Runtime.CompilerServices.Unsafe (6.1) - restriction: || (&& (>= net462) (>= netstandard2.0)) (>= net472) (&& (< netcoreapp2.1) (>= netstandard2.0)) System.Runtime.Extensions (4.3.1) - restriction: || (&& (< monotouch) (< net45) (>= netstandard1.6) (< netstandard2.0) (< xamarintvos) (< xamarinwatchos)) (&& (< net45) (>= net46) (< netstandard1.4)) (&& (< net45) (< netstandard1.2) (>= netstandard1.3) (< win8)) (&& (< net45) (< netstandard1.2) (>= netstandard1.6) (< win8)) (&& (< net45) (>= netstandard1.3) (< netstandard1.4) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.4) (< netstandard1.5) (< win8) (< wpa81)) (&& (< net45) (< netstandard1.4) (>= netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.5) (< netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (< netstandard1.5) (>= netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.6) (< netstandard2.0) (< win8) (< wpa81)) (&& (>= netstandard1.3) (< portable-net45+win8+wpa81)) (&& (< netstandard1.5) (>= netstandard1.6) (>= uap10.0)) (&& (< netstandard1.5) (>= uap10.0) (< uap10.1)) (&& (< netstandard1.5) (>= uap10.0) (< win8) (< wpa81)) (&& (>= netstandard1.6) (< portable-net45+win8+wpa81)) Microsoft.NETCore.Platforms (>= 1.1.1) - restriction: || (&& (< monoandroid) (< net45) (>= netstandard1.0) (< netstandard1.3) (< win8) (< wp8) (< wpa81)) (&& (< monoandroid) (< net45) (>= netstandard1.3) (< netstandard1.5) (< win8) (< wpa81)) (&& (< monotouch) (< net45) (>= netstandard1.5) (< win8) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos)) Microsoft.NETCore.Targets (>= 1.1.3) - restriction: || (&& (< monoandroid) (< net45) (>= netstandard1.0) (< netstandard1.3) (< win8) (< wp8) (< wpa81)) (&& (< monoandroid) (< net45) (>= netstandard1.3) (< netstandard1.5) (< win8) (< wpa81)) (&& (< monotouch) (< net45) (>= netstandard1.5) (< win8) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos)) @@ -501,11 +499,7 @@ NUGET Microsoft.NETCore.Platforms (>= 1.1) - restriction: || (&& (< monoandroid) (< monotouch) (< net45) (>= netstandard1.3) (< win8) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos)) (&& (< monoandroid) (< net45) (>= netstandard1.0) (< netstandard1.3) (< win8) (< wp8) (< wpa81)) Microsoft.NETCore.Targets (>= 1.1) - restriction: || (&& (< monoandroid) (< monotouch) (< net45) (>= netstandard1.3) (< win8) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos)) (&& (< monoandroid) (< net45) (>= netstandard1.0) (< netstandard1.3) (< win8) (< wp8) (< wpa81)) System.Runtime (>= 4.3) - restriction: || (&& (< monoandroid) (< monotouch) (< net45) (>= netstandard1.3) (< win8) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos)) (&& (< monoandroid) (< net45) (>= netstandard1.0) (< netstandard1.3) (< win8) (< wp8) (< wpa81)) - System.Threading.Tasks.Extensions (4.5.4) - restriction: || (&& (< monoandroid) (< monotouch) (< net45) (>= netstandard1.6) (< netstandard2.0) (< win8) (< wpa81) (< xamarintvos) (< xamarinwatchos)) (&& (< monoandroid) (< net45) (< netstandard1.2) (>= netstandard1.3) (< win8)) (&& (< monoandroid) (< net45) (>= netstandard1.3) (< netstandard1.4) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (>= netstandard1.4) (< netstandard1.5) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (>= netstandard1.5) (< netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (>= net46) (< netstandard1.4)) (&& (>= netstandard1.3) (< portable-net45+win8+wpa81)) (&& (< netstandard1.5) (>= uap10.0) (< win8) (< wpa81)) - System.Collections (>= 4.3) - restriction: && (< monoandroid) (< monotouch) (< net45) (>= netstandard1.0) (< netstandard2.0) (< win8) (< wp8) (< wpa81) (< xamarintvos) (< xamarinwatchos) - System.Runtime (>= 4.3) - restriction: && (< monoandroid) (< monotouch) (< net45) (>= netstandard1.0) (< netstandard2.0) (< win8) (< wp8) (< wpa81) (< xamarintvos) (< xamarinwatchos) - System.Runtime.CompilerServices.Unsafe (>= 4.5.3) - restriction: || (&& (< monoandroid) (< monotouch) (< net45) (>= netstandard1.0) (< netstandard2.0) (< win8) (< wpa81) (< xamarintvos) (< xamarinwatchos)) (&& (< monoandroid) (< netstandard1.0) (>= portable-net45+win8+wp8+wpa81) (< win8)) (&& (>= net45) (< netstandard2.0)) (&& (< net45) (< netcoreapp2.1) (>= netstandard2.0) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos)) (>= net461) (&& (< netstandard1.0) (>= win8)) (&& (< netstandard2.0) (>= wpa81)) (>= wp8) - System.Threading.Tasks (>= 4.3) - restriction: && (< monoandroid) (< monotouch) (< net45) (>= netstandard1.0) (< netstandard2.0) (< win8) (< wp8) (< wpa81) (< xamarintvos) (< xamarinwatchos) + System.Threading.Tasks.Extensions (4.6) - restriction: || (&& (< monoandroid) (< monotouch) (< net45) (>= netstandard1.6) (< netstandard2.0) (< win8) (< wpa81) (< xamarintvos) (< xamarinwatchos)) (&& (< monoandroid) (< net45) (< netstandard1.2) (>= netstandard1.3) (< win8)) (&& (< monoandroid) (< net45) (>= netstandard1.3) (< netstandard1.4) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (>= netstandard1.4) (< netstandard1.5) (< win8) (< wpa81)) (&& (< monoandroid) (< net45) (>= netstandard1.5) (< netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (>= net46) (< netstandard1.4)) (&& (>= netstandard1.3) (< portable-net45+win8+wpa81)) (&& (< netstandard1.5) (>= uap10.0) (< win8) (< wpa81)) System.Threading.Timer (4.3) - restriction: || (&& (< net45) (>= netstandard1.3) (< netstandard1.4) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.4) (< netstandard1.5) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.5) (< netstandard1.6) (< win8) (< wpa81)) (&& (< net45) (>= netstandard1.6) (< netstandard2.0) (< win8) (< wpa81)) (&& (< netstandard1.5) (>= uap10.0) (< uap10.1)) Microsoft.NETCore.Platforms (>= 1.1) - restriction: && (< monoandroid) (< monotouch) (< net451) (>= netstandard1.2) (< win81) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos) Microsoft.NETCore.Targets (>= 1.1) - restriction: && (< monoandroid) (< monotouch) (< net451) (>= netstandard1.2) (< win81) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos) @@ -539,25 +533,25 @@ NUGET System.Text.Encoding (>= 4.3) - restriction: && (< monoandroid) (< monotouch) (< net45) (>= netstandard1.3) (< win8) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos) System.Threading (>= 4.3) - restriction: && (< monoandroid) (< monotouch) (< net45) (>= netstandard1.3) (< win8) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos) System.Xml.ReaderWriter (>= 4.3) - restriction: || (&& (< monoandroid) (< monotouch) (< net45) (>= netstandard1.3) (< win8) (< wpa81) (< xamarinios) (< xamarinmac) (< xamarintvos) (< xamarinwatchos)) (&& (< monoandroid) (< net45) (>= netstandard1.0) (< netstandard1.3) (< win8) (< wp8) (< wpa81)) - Unquote (7.0) - FSharp.Core (>= 8.0.100) - restriction: >= netstandard2.0 - xunit (2.6.5) - xunit.analyzers (>= 1.9) - xunit.assert (>= 2.6.5) - xunit.core (2.6.5) + Unquote (7.0.1) + FSharp.Core (>= 6.0) - restriction: >= netstandard2.0 + xunit (2.9.2) + xunit.analyzers (>= 1.16) + xunit.assert (>= 2.9.2) + xunit.core (2.9.2) xunit.abstractions (2.0.3) - restriction: >= netstandard1.1 NETStandard.Library (>= 1.6) - restriction: && (< net35) (>= netstandard1.0) (< netstandard2.0) - xunit.analyzers (1.9) - xunit.assert (2.6.5) - NETStandard.Library (>= 1.6.1) - restriction: && (< net452) (< net6.0) (>= netstandard1.1) - xunit.core (2.6.5) - xunit.extensibility.core (2.6.5) - xunit.extensibility.execution (2.6.5) - xunit.extensibility.core (2.6.5) - NETStandard.Library (>= 1.6.1) - restriction: && (< net452) (>= netstandard1.1) + xunit.analyzers (1.18) + xunit.assert (2.9.2) + NETStandard.Library (>= 1.6.1) - restriction: && (< net452) (>= netstandard1.1) (< netstandard2.0) + xunit.core (2.9.2) + xunit.extensibility.core (2.9.2) + xunit.extensibility.execution (2.9.2) + xunit.extensibility.core (2.9.2) + NETStandard.Library (>= 1.6.1) - restriction: && (< net452) (>= netstandard1.1) (< netstandard2.0) xunit.abstractions (>= 2.0.3) - restriction: >= netstandard1.1 - xunit.extensibility.execution (2.6.5) - NETStandard.Library (>= 1.6.1) - restriction: && (< net452) (>= netstandard1.1) - xunit.extensibility.core (2.6.5) - restriction: >= netstandard1.1 - xunit.runner.visualstudio (2.5.6) - Microsoft.TestPlatform.ObjectModel (>= 17.8) - restriction: >= net462 + xunit.extensibility.execution (2.9.2) + NETStandard.Library (>= 1.6.1) - restriction: && (< net452) (>= netstandard1.1) (< netstandard2.0) + xunit.extensibility.core (2.9.2) - restriction: >= netstandard1.1 + xunit.runner.visualstudio (3.0) + Microsoft.TestPlatform.ObjectModel (>= 17.12) - restriction: >= net472