@@ -3,26 +3,22 @@ package create
33import (
44 "fmt"
55 "regexp"
6+ "slices"
67
78 "github.com/AlecAivazis/survey/v2"
89)
910
10- const defaultAppName = "my-kernel-app"
11-
12- // projectNameValidator ensures the project name is safe for file systems and package managers.
13- func projectNameValidator (val any ) error {
11+ func validateAppName (val any ) error {
1412 str , ok := val .(string )
1513 if ! ok {
1614 return fmt .Errorf ("invalid input type" )
1715 }
1816
19- // Project name must be non-empty
2017 if len (str ) == 0 {
2118 return fmt .Errorf ("project name cannot be empty" )
2219 }
2320
2421 // Validate project name: only letters, numbers, underscores, and hyphens
25- // This regex prevents special characters that might break shell commands or filesystem paths.
2622 matched , err := regexp .MatchString (`^[A-Za-z\-_\d]+$` , str )
2723 if err != nil {
2824 return err
@@ -33,40 +29,44 @@ func projectNameValidator(val any) error {
3329 return nil
3430}
3531
36- // PromptForAppName prompts the user for the application name if not provided
3732func PromptForAppName (providedAppName string ) (string , error ) {
3833 if providedAppName != "" {
3934 return providedAppName , nil
4035 }
4136
4237 var appName string
4338 prompt := & survey.Input {
44- Message : "What is the name of your project?" ,
45- Default : defaultAppName ,
39+ Message : AppNamePrompt ,
40+ Default : DefaultAppName ,
4641 }
4742
48- if err := survey .AskOne (prompt , & appName , survey .WithValidator (projectNameValidator )); err != nil {
43+ if err := survey .AskOne (prompt , & appName , survey .WithValidator (validateAppName )); err != nil {
4944 return "" , err
5045 }
5146
5247 return appName , nil
5348}
5449
55- func PromptForLanguage (providedLanguage string ) (string , error ) {
56- if providedLanguage != "" {
57- return providedLanguage , nil
58- }
59- var language string
50+ func handleLangugePrompt () (string , error ) {
51+ var l string
6052 languagePrompt := & survey.Select {
61- Message : "Choose a programming language:" ,
62- // TODO: create constants so that more languages can be added later
63- Options : []string {"typescript" , "python" },
64- Default : "typescript" ,
53+ Message : LanguagePrompt ,
54+ Options : SupportedLanguages ,
6555 }
66- if err := survey .AskOne (languagePrompt , & language ); err != nil {
56+ if err := survey .AskOne (languagePrompt , & l ); err != nil {
6757 return "" , err
6858 }
69- return language , nil
59+ return l , nil
60+ }
61+
62+ func PromptForLanguage (providedLanguage string ) (string , error ) {
63+ l := NormalizeLanguage (providedLanguage )
64+ if l != "" && ! slices .Contains (SupportedLanguages , l ) {
65+ return handleLangugePrompt ()
66+ } else if providedLanguage != "" {
67+ return l , nil
68+ }
69+ return handleLangugePrompt ()
7070}
7171
7272func PromptForTemplate (providedTemplate string ) (string , error ) {
@@ -76,9 +76,8 @@ func PromptForTemplate(providedTemplate string) (string, error) {
7676
7777 var template string
7878 templatePrompt := & survey.Select {
79- Message : "Choose a template:" ,
80- Options : []string {"sample-app" },
81- Default : "sample-app" ,
79+ Message : TemplatePrompt ,
80+ Options : GetSupportedTemplates (),
8281 }
8382 if err := survey .AskOne (templatePrompt , & template ); err != nil {
8483 return "" , err
0 commit comments