From 605962873839f6dfdad55e9d35eb4b1bb8e788ef Mon Sep 17 00:00:00 2001 From: Kai Ito Date: Thu, 20 Apr 2023 15:32:05 +0200 Subject: [PATCH 1/9] Remove template name option --- src/Perla/Commands.fs | 9 --------- src/Perla/Commands.fsi | 1 - src/Perla/Handlers.fs | 5 ----- src/Perla/Handlers.fsi | 1 - src/Perla/Scaffolding.fs | 4 ++-- tests/Perla.Tests/CommandOptions.fs | 12 ------------ 6 files changed, 2 insertions(+), 30 deletions(-) diff --git a/src/Perla/Commands.fs b/src/Perla/Commands.fs index 2cee056..31965bd 100644 --- a/src/Perla/Commands.fs +++ b/src/Perla/Commands.fs @@ -332,12 +332,6 @@ module ProjectInputs = let projectName: HandlerInput = Input.Argument("name", "Name of the new project") - let templateName: HandlerInput = - Input.OptionMaybe( - [ "-tn"; "--template-name" ], - "repository/directory combination of the template name, or the full name in case of name conflicts username/repository/directory" - ) - let byId: HandlerInput = Input.OptionMaybe( [ "-id"; "--group-id" ], @@ -786,13 +780,11 @@ module Commands = ( ctx: InvocationContext, name: string, - template: string option, byId: string option, byShortName: string option ) : ProjectOptions * CancellationToken = { projectName = name - byTemplateName = template byId = byId byShortName = byShortName }, @@ -807,7 +799,6 @@ module Commands = inputs ( Input.Context(), ProjectInputs.projectName, - ProjectInputs.templateName, ProjectInputs.byId, ProjectInputs.byShortName ) diff --git a/src/Perla/Commands.fsi b/src/Perla/Commands.fsi index b9e55b9..bef5486 100644 --- a/src/Perla/Commands.fsi +++ b/src/Perla/Commands.fsi @@ -68,7 +68,6 @@ module TemplateInputs = [] module ProjectInputs = val projectName: HandlerInput - val templateName: HandlerInput val byId: HandlerInput val byShortName: HandlerInput diff --git a/src/Perla/Handlers.fs b/src/Perla/Handlers.fs index 94d997d..6f72e41 100644 --- a/src/Perla/Handlers.fs +++ b/src/Perla/Handlers.fs @@ -101,7 +101,6 @@ type TemplateRepositoryOptions = { type ProjectOptions = { projectName: string - byTemplateName: string option byId: string option byShortName: string option } @@ -591,14 +590,10 @@ module Handlers = |> Option.map UMX.tag |> Option.map QuickAccessSearch.Group - let inline byTemplateName () = - options.byTemplateName |> Option.map QuickAccessSearch.Name - let queryParam = options.byShortName |> Option.map QuickAccessSearch.ShortName |> Option.orElseWith byId - |> Option.orElseWith byTemplateName let foundRepo = result { let! query = queryParam |> Result.requireSome Templates.NoQueryParams diff --git a/src/Perla/Handlers.fsi b/src/Perla/Handlers.fsi index ed827ae..bda6511 100644 --- a/src/Perla/Handlers.fsi +++ b/src/Perla/Handlers.fsi @@ -68,7 +68,6 @@ type TemplateRepositoryOptions = { type ProjectOptions = { projectName: string - byTemplateName: string option byId: string option byShortName: string option } diff --git a/src/Perla/Scaffolding.fs b/src/Perla/Scaffolding.fs index 2c0ce14..53abd21 100644 --- a/src/Perla/Scaffolding.fs +++ b/src/Perla/Scaffolding.fs @@ -95,10 +95,10 @@ module Scaffolding = [] type QuickAccessSearch = | Id of ObjectId - | Name of string + | Name of string // TODO ask: remove from search as well? | Group of string | ShortName of string - | Parent of ObjectId + | Parent of ObjectId // TODO ask: remove from search as well? [] type TemplateScriptKind = diff --git a/tests/Perla.Tests/CommandOptions.fs b/tests/Perla.Tests/CommandOptions.fs index a1f3032..a1d2d06 100644 --- a/tests/Perla.Tests/CommandOptions.fs +++ b/tests/Perla.Tests/CommandOptions.fs @@ -342,18 +342,6 @@ module CommandOptions = Assert.Equal(expectedAlias, alias.Value) Assert.Equal(expectedVersion, version.Value) - [] - [] - [] - let ``Commands.NewProject can parse template name options`` (option: string, name: string, expectedTemplateName: string) = - let result = - ParseRootCommand(Commands.NewProject, $"new MyTestProject {option} {name}") - - let templateName: string option = ProjectInputs.templateName.GetValue result - - Assert.Empty(result.Errors) - Assert.Equal(expectedTemplateName, templateName.Value) - [] [] [] From 68351bd38a4f622d3bfe631b3e50c17977c79fd7 Mon Sep 17 00:00:00 2001 From: Kai Ito Date: Fri, 21 Apr 2023 16:24:47 +0200 Subject: [PATCH 2/9] Add net7 to sample --- sample/src/App.fsproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sample/src/App.fsproj b/sample/src/App.fsproj index 2e85fa2..28a734d 100644 --- a/sample/src/App.fsproj +++ b/sample/src/App.fsproj @@ -1,7 +1,7 @@  - net6.0 + net6.0;net7.0 true false @@ -16,4 +16,4 @@ - \ No newline at end of file + From 66a5aaf54a69dc0f5717da4a8476415a4488dd79 Mon Sep 17 00:00:00 2001 From: Kai Ito Date: Fri, 21 Apr 2023 16:39:28 +0200 Subject: [PATCH 3/9] Only show relevant information in template table --- src/Perla/Handlers.fs | 53 +++++++++++-------------------------------- 1 file changed, 13 insertions(+), 40 deletions(-) diff --git a/src/Perla/Handlers.fs b/src/Perla/Handlers.fs index 6f72e41..6a98c4c 100644 --- a/src/Perla/Handlers.fs +++ b/src/Perla/Handlers.fs @@ -177,10 +177,9 @@ module Templates = |> List.groupBy (fun x -> x.parent) |> List.choose (fun (parentId, children) -> match Templates.FindOne(TemplateSearchKind.Id parentId) with - | Some parent -> Some(parent, children) + | Some _ -> Some(children) | None -> None) - |> List.collect (fun (parent, children) -> - children |> List.map (fun child -> (parent, child))) + |> List.concat match options.format with | ListFormat.HumanReadable -> @@ -189,65 +188,39 @@ module Templates = .AddColumns( [| "Name" - "Group" - "Belongs to" - "Parent Location" - "Last Update" + "perla new -t" + "perla new -id" |] ) for column in table.Columns do column.Alignment <- Justify.Center - for parent, template in results do + for template in results do let name: Rendering.IRenderable = Markup($"[bold green]{template.name}[/]") - let group = Markup($"[bold yellow]{template.group}[/]") - let belongsTo = Markup($"[bold blue]{parent.ToFullNameWithBranch}[/]") - - let lastUpdate = - parent.updatedAt - |> Option.ofNullable - |> Option.defaultValue parent.createdAt - |> (fun x -> $"[bold green]{x.ToShortDateString()}[/]") - |> Markup - - let location = - TextPath( - UMX.untag parent.path, - LeafStyle = Style(Color.Green), - StemStyle = Style(Color.Yellow), - SeparatorStyle = Style(Color.Blue) - ) + let shortname = Markup($"[bold yellow]{template.shortName}[/]") + let group = Markup($"[bold blue]{template.group}[/]") - table.AddRow([| name; group; belongsTo; location; lastUpdate |]) + table.AddRow([| name; shortname; group |]) |> ignore AnsiConsole.Write table 0 | ListFormat.TextOnly -> let columns = - Columns([| "Name"; "Group"; "Belongs to"; "Parent Location" |]) + Columns([|"Name";"perla new -t";"perla new -id"|]) AnsiConsole.Write columns let rows = [| - for parent, template in results do + for template in results do let name = Markup($"[bold green]{template.name}[/]") - let group = Markup($"[bold yellow]{template.group}[/]") - - let belongsTo = Markup($"[bold blue]{parent.ToFullNameWithBranch}[/]") - - let location = - TextPath( - UMX.untag parent.path, - LeafStyle = Style(Color.Green), - StemStyle = Style(Color.Yellow), - SeparatorStyle = Style(Color.Blue) - ) + let shortname = Markup($"[bold yellow]{template.shortName}[/]") + let group = TextPath(UMX.untag template.group, LeafStyle=Style(Color.Green),StemStyle=Style(Color.Yellow),SeparatorStyle = Style(Color.Blue)) - Columns(name, group, belongsTo, location) :> Rendering.IRenderable + Columns(name, shortname, group) :> Rendering.IRenderable |] rows |> Rows |> AnsiConsole.Write From 4aa0965ac04bc4f38adb3f9d3a7ac0437efd3e96 Mon Sep 17 00:00:00 2001 From: Kai Ito Date: Mon, 24 Apr 2023 00:38:11 +0200 Subject: [PATCH 4/9] Add template --- src/Perla/Properties/launchSettings.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Perla/Properties/launchSettings.json b/src/Perla/Properties/launchSettings.json index 7104545..25b65d9 100644 --- a/src/Perla/Properties/launchSettings.json +++ b/src/Perla/Properties/launchSettings.json @@ -88,6 +88,11 @@ "commandName": "Project", "commandLineArgs": "add @esm-bundle/chai -d", "workingDirectory": "$(ProjectDir)/../../sample" + }, + "Show templates in table": { + "commandName": "Project", + "commandLineArgs": "t foo -ls table", + "workingDirectory": "$(ProjectDir)/../../sample" } } } From e8f8efef81dac7a96a7d29459138b93397826602 Mon Sep 17 00:00:00 2001 From: Kai Ito Date: Mon, 24 Apr 2023 01:23:03 +0200 Subject: [PATCH 5/9] Make template name optional for listing available templates --- src/Perla/Commands.fs | 8 ++++---- src/Perla/Commands.fsi | 2 +- src/Perla/Handlers.fs | 26 ++++++++++++++++++-------- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/Perla/Commands.fs b/src/Perla/Commands.fs index 31965bd..e9a0a19 100644 --- a/src/Perla/Commands.fs +++ b/src/Perla/Commands.fs @@ -299,8 +299,8 @@ module PackageInputs = [] module TemplateInputs = - let repositoryName: HandlerInput = - Input.Argument( + let repositoryName: HandlerInput = + Input.ArgumentMaybe( "templateRepositoryName", "The User/repository name combination" ) @@ -713,7 +713,7 @@ module Commands = let buildArgs ( ctx: InvocationContext, - name: string, + name: string option, add: bool option, update: bool option, remove: bool option, @@ -749,7 +749,7 @@ module Commands = |> Option.defaultValue format { - fullRepositoryName = name + fullRepositoryName = name |> Option.defaultValue "" operation = operation }, ctx.GetCancellationToken() diff --git a/src/Perla/Commands.fsi b/src/Perla/Commands.fsi index bef5486..d57f359 100644 --- a/src/Perla/Commands.fsi +++ b/src/Perla/Commands.fsi @@ -59,7 +59,7 @@ module PackageInputs = [] module TemplateInputs = - val repositoryName: HandlerInput + val repositoryName: HandlerInput val addTemplate: HandlerInput val updateTemplate: HandlerInput val removeTemplate: HandlerInput diff --git a/src/Perla/Handlers.fs b/src/Perla/Handlers.fs index 6a98c4c..fe5854a 100644 --- a/src/Perla/Handlers.fs +++ b/src/Perla/Handlers.fs @@ -741,15 +741,25 @@ module Handlers = } let updateRepo () = task { - let template = template.Value - Logger.log $"Template {template.ToFullNameWithBranch} already exists." + match template with + | ValueSome template -> + Logger.log $"Template {template.ToFullNameWithBranch} already exists." + + match! + Templates.AddOrUpdate(Templates.TemplateOperation.Update template) + with + | Ok() -> return 0 + | Error err -> + Logger.log (err, escape = false) + return 1 + | ValueNone -> + Logger.log "We were unable to parse the repository name." + + Logger.log ( + "please ensure that the repository name is in the format: [bold blue]username/repository:branch[/]", + escape = false + ) - match! - Templates.AddOrUpdate(Templates.TemplateOperation.Update template) - with - | Ok() -> return 0 - | Error err -> - Logger.log (err, escape = false) return 1 } From 7d3602992e72e7eaa3c8ba8c877777c6f1b75043 Mon Sep 17 00:00:00 2001 From: Kai Ito Date: Mon, 24 Apr 2023 10:02:49 +0200 Subject: [PATCH 6/9] Keep repository name --- src/Perla/Commands.fs | 4 ++-- src/Perla/Handlers.fs | 18 +++++++++++------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/Perla/Commands.fs b/src/Perla/Commands.fs index e9a0a19..7afb2de 100644 --- a/src/Perla/Commands.fs +++ b/src/Perla/Commands.fs @@ -294,7 +294,7 @@ module PackageInputs = let showAsNpm: HandlerInput = Input.OptionMaybe( [ "--npm"; "--as-package-json"; "-j" ], - "Show the packages simlar to npm's package.json" + "Show the packages similar to npm's package.json" ) [] @@ -302,7 +302,7 @@ module TemplateInputs = let repositoryName: HandlerInput = Input.ArgumentMaybe( "templateRepositoryName", - "The User/repository name combination" + "The User/repository name combination or ID of the template" ) let addTemplate: HandlerInput = diff --git a/src/Perla/Handlers.fs b/src/Perla/Handlers.fs index fe5854a..aacb8c5 100644 --- a/src/Perla/Handlers.fs +++ b/src/Perla/Handlers.fs @@ -177,9 +177,10 @@ module Templates = |> List.groupBy (fun x -> x.parent) |> List.choose (fun (parentId, children) -> match Templates.FindOne(TemplateSearchKind.Id parentId) with - | Some _ -> Some(children) + | Some parent -> Some(parent, children) | None -> None) - |> List.concat + |> List.collect (fun (parent, children) -> + children |> List.map (fun child -> (parent, child))) match options.format with | ListFormat.HumanReadable -> @@ -190,20 +191,22 @@ module Templates = "Name" "perla new -t" "perla new -id" + "Repository name" |] ) for column in table.Columns do column.Alignment <- Justify.Center - for template in results do + for parent, template in results do let name: Rendering.IRenderable = Markup($"[bold green]{template.name}[/]") let shortname = Markup($"[bold yellow]{template.shortName}[/]") let group = Markup($"[bold blue]{template.group}[/]") + let repositoryName = Markup($"[bold blue]{parent.ToFullNameWithBranch}[/]") - table.AddRow([| name; shortname; group |]) + table.AddRow([| name; shortname; group; repositoryName |]) |> ignore AnsiConsole.Write table @@ -215,12 +218,13 @@ module Templates = AnsiConsole.Write columns let rows = [| - for template in results do + for parent, template in results do let name = Markup($"[bold green]{template.name}[/]") let shortname = Markup($"[bold yellow]{template.shortName}[/]") - let group = TextPath(UMX.untag template.group, LeafStyle=Style(Color.Green),StemStyle=Style(Color.Yellow),SeparatorStyle = Style(Color.Blue)) + let group = Markup($"[bold blue]{template.group}[/]") + let repositoryName = TextPath(UMX.untag parent.ToFullNameWithBranch, LeafStyle=Style(Color.Green),StemStyle=Style(Color.Yellow),SeparatorStyle = Style(Color.Blue)) - Columns(name, shortname, group) :> Rendering.IRenderable + Columns(name, shortname, group, repositoryName) :> Rendering.IRenderable |] rows |> Rows |> AnsiConsole.Write From a4c395e1763134b50c22b5039de5c992ecaab0e8 Mon Sep 17 00:00:00 2001 From: Kai Ito Date: Mon, 24 Apr 2023 10:08:14 +0200 Subject: [PATCH 7/9] Remove todos --- src/Perla/Scaffolding.fs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Perla/Scaffolding.fs b/src/Perla/Scaffolding.fs index 53abd21..2c0ce14 100644 --- a/src/Perla/Scaffolding.fs +++ b/src/Perla/Scaffolding.fs @@ -95,10 +95,10 @@ module Scaffolding = [] type QuickAccessSearch = | Id of ObjectId - | Name of string // TODO ask: remove from search as well? + | Name of string | Group of string | ShortName of string - | Parent of ObjectId // TODO ask: remove from search as well? + | Parent of ObjectId [] type TemplateScriptKind = From 3e57d27d0561575073207e5d8d6a04995887ed8a Mon Sep 17 00:00:00 2001 From: Kai Ito Date: Mon, 24 Apr 2023 10:22:33 +0200 Subject: [PATCH 8/9] Thread option through --- src/Perla/CliMiddleware.fs | 2 +- src/Perla/Commands.fs | 4 ++-- src/Perla/Handlers.fs | 2 +- src/Perla/Handlers.fsi | 2 +- src/Perla/Library.fs | 23 ++++++++++++++--------- src/Perla/Library.fsi | 2 +- 6 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/Perla/CliMiddleware.fs b/src/Perla/CliMiddleware.fs index e0aa4fd..530ee84 100644 --- a/src/Perla/CliMiddleware.fs +++ b/src/Perla/CliMiddleware.fs @@ -296,7 +296,7 @@ module Middleware = env.RunSetupTemplates( { fullRepositoryName = - $"{Default_Templates_Repository}:{Default_Templates_Repository_Branch}" + Some $"{Default_Templates_Repository}:{Default_Templates_Repository_Branch}" operation = RunTemplateOperation.Add }, cancellationToken diff --git a/src/Perla/Commands.fs b/src/Perla/Commands.fs index 7afb2de..61accae 100644 --- a/src/Perla/Commands.fs +++ b/src/Perla/Commands.fs @@ -302,7 +302,7 @@ module TemplateInputs = let repositoryName: HandlerInput = Input.ArgumentMaybe( "templateRepositoryName", - "The User/repository name combination or ID of the template" + "The User/repository name combination" ) let addTemplate: HandlerInput = @@ -749,7 +749,7 @@ module Commands = |> Option.defaultValue format { - fullRepositoryName = name |> Option.defaultValue "" + fullRepositoryName = name operation = operation }, ctx.GetCancellationToken() diff --git a/src/Perla/Handlers.fs b/src/Perla/Handlers.fs index aacb8c5..55d1a68 100644 --- a/src/Perla/Handlers.fs +++ b/src/Perla/Handlers.fs @@ -95,7 +95,7 @@ type RunTemplateOperation = | List of ListFormat type TemplateRepositoryOptions = { - fullRepositoryName: string + fullRepositoryName: string option operation: RunTemplateOperation } diff --git a/src/Perla/Handlers.fsi b/src/Perla/Handlers.fsi index bda6511..59f52ae 100644 --- a/src/Perla/Handlers.fsi +++ b/src/Perla/Handlers.fsi @@ -62,7 +62,7 @@ type RunTemplateOperation = | List of ListFormat type TemplateRepositoryOptions = { - fullRepositoryName: string + fullRepositoryName: string option operation: RunTemplateOperation } diff --git a/src/Perla/Library.fs b/src/Perla/Library.fs index dd1469f..c9a34ea 100644 --- a/src/Perla/Library.fs +++ b/src/Perla/Library.fs @@ -5,6 +5,7 @@ open Spectre.Console.Rendering open FSharp.UMX open Perla.Units open Perla.PackageManager.Types +open FsToolkit.ErrorHandling module private ImportMap = @@ -75,15 +76,19 @@ module Lib = ValueSome(Provider.Unpkg, name, $"{version}{preview}") | _ -> ValueNone - let parseFullRepositoryName (value: string) = - let regex = Regex(@"^([-_\w\d]+)\/([-_\w\d]+):?([\w\d-_]+)?$") - - match value with - | ParseRegex regex [ username; repository; branch ] -> - ValueSome(username, repository, branch) - | ParseRegex regex [ username; repository ] -> - ValueSome(username, repository, "main") - | _ -> ValueNone + let parseFullRepositoryName (value: string option) = + voption { + let! name = value + let regex = Regex(@"^([-_\w\d]+)\/([-_\w\d]+):?([\w\d-_]+)?$") + + return! + match name with + | ParseRegex regex [ username; repository; branch ] -> + ValueSome(username, repository, branch) + | ParseRegex regex [ username; repository ] -> + ValueSome(username, repository, "main") + | _ -> ValueNone + } let getTemplateAndChild (templateName: string) = match diff --git a/src/Perla/Library.fsi b/src/Perla/Library.fsi index 5ccda50..746ad9e 100644 --- a/src/Perla/Library.fsi +++ b/src/Perla/Library.fsi @@ -20,7 +20,7 @@ module Lib = url: string -> (Provider * string * string) voption val internal parseFullRepositoryName: - value: string -> (string * string * string) voption + value: string option -> (string * string * string) voption val internal getTemplateAndChild: templateName: string -> string option * string * string option From 4888822687646c4a223d5b731b9868225b3860ae Mon Sep 17 00:00:00 2001 From: Kai Ito Date: Mon, 24 Apr 2023 10:33:46 +0200 Subject: [PATCH 9/9] Formatting --- src/Perla/CliMiddleware.fs | 3 ++- src/Perla/CliMiddleware.fsi | 1 + src/Perla/Configuration.fsi | 22 +++++++++++++---- src/Perla/FileSystem.fs | 3 +-- src/Perla/FileSystem.fsi | 4 +++- src/Perla/Handlers.fs | 29 ++++++++++++---------- src/Perla/Handlers.fsi | 8 +++---- src/Perla/Library.fs | 25 ++++++++++--------- tests/Perla.Tests/CommandOptions.fs | 37 ++++++++++++++++++++++------- 9 files changed, 84 insertions(+), 48 deletions(-) diff --git a/src/Perla/CliMiddleware.fs b/src/Perla/CliMiddleware.fs index 530ee84..03053df 100644 --- a/src/Perla/CliMiddleware.fs +++ b/src/Perla/CliMiddleware.fs @@ -296,7 +296,8 @@ module Middleware = env.RunSetupTemplates( { fullRepositoryName = - Some $"{Default_Templates_Repository}:{Default_Templates_Repository_Branch}" + Some + $"{Default_Templates_Repository}:{Default_Templates_Repository_Branch}" operation = RunTemplateOperation.Add }, cancellationToken diff --git a/src/Perla/CliMiddleware.fsi b/src/Perla/CliMiddleware.fsi index 5fbffd0..6dfa1ca 100644 --- a/src/Perla/CliMiddleware.fsi +++ b/src/Perla/CliMiddleware.fsi @@ -79,6 +79,7 @@ module Middleware = bool val ToSCLMiddleware: middleware: PerlaCliMiddleware -> InvocationMiddleware + val previewCheck: command: Command * directives: KeyValuePair seq -> Task> diff --git a/src/Perla/Configuration.fsi b/src/Perla/Configuration.fsi index 0ab259e..6a96592 100644 --- a/src/Perla/Configuration.fsi +++ b/src/Perla/Configuration.fsi @@ -59,17 +59,29 @@ module internal ConfigExtraction = module FromDecoders = open Json.ConfigDecoders - val GetFable: FableConfig option * DecodedFableConfig option -> FableConfig option - val GetDevServer: DevServerConfig * DecodedDevServer option -> DevServerConfig option + val GetFable: + FableConfig option * DecodedFableConfig option -> FableConfig option + + val GetDevServer: + DevServerConfig * DecodedDevServer option -> DevServerConfig option + val GetBuild: BuildConfig * DecodedBuild option -> BuildConfig option - val GetEsbuild: EsbuildConfig * DecodedEsbuild option -> EsbuildConfig option + + val GetEsbuild: + EsbuildConfig * DecodedEsbuild option -> EsbuildConfig option + val GetTesting: TestConfig * DecodedTesting option -> TestConfig option [] module FromFields = - val GetServerFields: DevServerConfig * DevServerField seq option -> DevServerField seq + val GetServerFields: + DevServerConfig * DevServerField seq option -> DevServerField seq + val GetMinify: RunConfiguration * DevServerField seq -> bool - val GetDevServerOptions: DevServerConfig * DevServerField seq -> DevServerConfig + + val GetDevServerOptions: + DevServerConfig * DevServerField seq -> DevServerConfig + val GetTesting: TestConfig * TestingField seq option -> TestConfig val FromEnv: config: PerlaConfig -> PerlaConfig diff --git a/src/Perla/FileSystem.fs b/src/Perla/FileSystem.fs index 0d944a1..f849f2c 100644 --- a/src/Perla/FileSystem.fs +++ b/src/Perla/FileSystem.fs @@ -243,8 +243,7 @@ module FileSystem = let extract () = use stream = new GZipInputStream(File.OpenRead path) - use archive = - TarArchive.CreateInputTarArchive(stream, Encoding.UTF8) + use archive = TarArchive.CreateInputTarArchive(stream, Encoding.UTF8) path |> Path.GetDirectoryName |> archive.ExtractContents diff --git a/src/Perla/FileSystem.fsi b/src/Perla/FileSystem.fsi index 65ffaa5..6908c0a 100644 --- a/src/Perla/FileSystem.fsi +++ b/src/Perla/FileSystem.fsi @@ -54,7 +54,9 @@ module FileSystem = val TplRepositoryChildTemplates: path: string -> string seq - val DotNetToolRestore: cancellationToken: CancellationToken -> Task> + val DotNetToolRestore: + cancellationToken: CancellationToken -> Task> + val CheckFableExists: cancellationToken: CancellationToken -> Task [] diff --git a/src/Perla/Handlers.fs b/src/Perla/Handlers.fs index 55d1a68..1bf7864 100644 --- a/src/Perla/Handlers.fs +++ b/src/Perla/Handlers.fs @@ -187,12 +187,7 @@ module Templates = let table = Table() .AddColumns( - [| - "Name" - "perla new -t" - "perla new -id" - "Repository name" - |] + [| "Name"; "perla new -t"; "perla new -id"; "Repository name" |] ) for column in table.Columns do @@ -204,16 +199,16 @@ module Templates = let shortname = Markup($"[bold yellow]{template.shortName}[/]") let group = Markup($"[bold blue]{template.group}[/]") - let repositoryName = Markup($"[bold blue]{parent.ToFullNameWithBranch}[/]") - table.AddRow([| name; shortname; group; repositoryName |]) - |> ignore + let repositoryName = + Markup($"[bold blue]{parent.ToFullNameWithBranch}[/]") + + table.AddRow([| name; shortname; group; repositoryName |]) |> ignore AnsiConsole.Write table 0 | ListFormat.TextOnly -> - let columns = - Columns([|"Name";"perla new -t";"perla new -id"|]) + let columns = Columns([| "Name"; "perla new -t"; "perla new -id" |]) AnsiConsole.Write columns @@ -222,9 +217,17 @@ module Templates = let name = Markup($"[bold green]{template.name}[/]") let shortname = Markup($"[bold yellow]{template.shortName}[/]") let group = Markup($"[bold blue]{template.group}[/]") - let repositoryName = TextPath(UMX.untag parent.ToFullNameWithBranch, LeafStyle=Style(Color.Green),StemStyle=Style(Color.Yellow),SeparatorStyle = Style(Color.Blue)) - Columns(name, shortname, group, repositoryName) :> Rendering.IRenderable + let repositoryName = + TextPath( + UMX.untag parent.ToFullNameWithBranch, + LeafStyle = Style(Color.Green), + StemStyle = Style(Color.Yellow), + SeparatorStyle = Style(Color.Blue) + ) + + Columns(name, shortname, group, repositoryName) + :> Rendering.IRenderable |] rows |> Rows |> AnsiConsole.Write diff --git a/src/Perla/Handlers.fsi b/src/Perla/Handlers.fsi index 59f52ae..75ae889 100644 --- a/src/Perla/Handlers.fsi +++ b/src/Perla/Handlers.fsi @@ -93,12 +93,12 @@ type DescribeOptions = { [] type PathOperation = - | AddOrUpdate of addImport: string * addPath: string + | AddOrUpdate of + addImport: string * + addPath: string | Remove of removeImport: string -type PathsOptions = { - operation: PathOperation -} +type PathsOptions = { operation: PathOperation } module Handlers = diff --git a/src/Perla/Library.fs b/src/Perla/Library.fs index c9a34ea..1588b95 100644 --- a/src/Perla/Library.fs +++ b/src/Perla/Library.fs @@ -76,19 +76,18 @@ module Lib = ValueSome(Provider.Unpkg, name, $"{version}{preview}") | _ -> ValueNone - let parseFullRepositoryName (value: string option) = - voption { - let! name = value - let regex = Regex(@"^([-_\w\d]+)\/([-_\w\d]+):?([\w\d-_]+)?$") - - return! - match name with - | ParseRegex regex [ username; repository; branch ] -> - ValueSome(username, repository, branch) - | ParseRegex regex [ username; repository ] -> - ValueSome(username, repository, "main") - | _ -> ValueNone - } + let parseFullRepositoryName (value: string option) = voption { + let! name = value + let regex = Regex(@"^([-_\w\d]+)\/([-_\w\d]+):?([\w\d-_]+)?$") + + return! + match name with + | ParseRegex regex [ username; repository; branch ] -> + ValueSome(username, repository, branch) + | ParseRegex regex [ username; repository ] -> + ValueSome(username, repository, "main") + | _ -> ValueNone + } let getTemplateAndChild (templateName: string) = match diff --git a/tests/Perla.Tests/CommandOptions.fs b/tests/Perla.Tests/CommandOptions.fs index a1d2d06..b669c76 100644 --- a/tests/Perla.Tests/CommandOptions.fs +++ b/tests/Perla.Tests/CommandOptions.fs @@ -153,10 +153,10 @@ module CommandOptions = [] let ``Commands.Setup can parse options`` () = - let result = - ParseRootCommand(Commands.Setup, "setup -y -t false") + let result = ParseRootCommand(Commands.Setup, "setup -y -t false") - let installTemplates: bool option = SetupInputs.installTemplates.GetValue result + let installTemplates: bool option = + SetupInputs.installTemplates.GetValue result let skipPrompts: bool option = SetupInputs.skipPrompts.GetValue result @@ -168,7 +168,8 @@ module CommandOptions = let ``Parse Commands.Setup without options should not fail`` () = let result = ParseRootCommand(Commands.Setup, "setup") - let installTemplates: bool option = SetupInputs.installTemplates.GetValue result + let installTemplates: bool option = + SetupInputs.installTemplates.GetValue result let skipPrompts: bool option = SetupInputs.skipPrompts.GetValue result @@ -344,10 +345,20 @@ module CommandOptions = [] [] - [] - let ``Commands.NewProject can parse group id options`` (option: string, name: string, expectedGroupId: string) = + [] + let ``Commands.NewProject can parse group id options`` + ( + option: string, + name: string, + expectedGroupId: string + ) = let result = - ParseRootCommand(Commands.NewProject, $"new MyTestProject {option} {name}") + ParseRootCommand( + Commands.NewProject, + $"new MyTestProject {option} {name}" + ) let groupId: string option = ProjectInputs.byId.GetValue result @@ -357,9 +368,17 @@ module CommandOptions = [] [] [] - let ``Commands.NewProject can parse shortname options`` (option: string, name: string, expectedShortName: string) = + let ``Commands.NewProject can parse shortname options`` + ( + option: string, + name: string, + expectedShortName: string + ) = let result = - ParseRootCommand(Commands.NewProject, $"new MyTestProject {option} {name}") + ParseRootCommand( + Commands.NewProject, + $"new MyTestProject {option} {name}" + ) let shortname: string option = ProjectInputs.byShortName.GetValue result