github.com/AlpineAIO/wails/v2@v2.0.0-beta.32.0.20240505041856-1047a8fa5fef/internal/app/app_bindings.go (about) 1 //go:build bindings 2 3 package app 4 5 import ( 6 "flag" 7 "os" 8 "path/filepath" 9 10 "github.com/AlpineAIO/wails/v2/internal/binding" 11 "github.com/AlpineAIO/wails/v2/internal/frontend/runtime/wrapper" 12 "github.com/AlpineAIO/wails/v2/internal/fs" 13 "github.com/AlpineAIO/wails/v2/internal/logger" 14 "github.com/AlpineAIO/wails/v2/internal/project" 15 "github.com/AlpineAIO/wails/v2/pkg/options" 16 "github.com/leaanthony/gosod" 17 ) 18 19 func (a *App) Run() error { 20 21 // Create binding exemptions - Ugly hack. There must be a better way 22 bindingExemptions := []interface{}{ 23 a.options.OnStartup, 24 a.options.OnShutdown, 25 a.options.OnDomReady, 26 a.options.OnBeforeClose, 27 } 28 29 // Check for CLI Flags 30 bindingFlags := flag.NewFlagSet("bindings", flag.ContinueOnError) 31 32 var tsPrefixFlag *string 33 var tsPostfixFlag *string 34 var tsOutputTypeFlag *string 35 36 tsPrefix := os.Getenv("tsprefix") 37 if tsPrefix == "" { 38 tsPrefixFlag = bindingFlags.String("tsprefix", "", "Prefix for generated typescript entities") 39 } 40 41 tsSuffix := os.Getenv("tssuffix") 42 if tsSuffix == "" { 43 tsPostfixFlag = bindingFlags.String("tssuffix", "", "Suffix for generated typescript entities") 44 } 45 46 tsOutputType := os.Getenv("tsoutputtype") 47 if tsOutputType == "" { 48 tsOutputTypeFlag = bindingFlags.String("tsoutputtype", "", "Output type for generated typescript entities (classes|interfaces)") 49 } 50 51 _ = bindingFlags.Parse(os.Args[1:]) 52 if tsPrefixFlag != nil { 53 tsPrefix = *tsPrefixFlag 54 } 55 if tsPostfixFlag != nil { 56 tsSuffix = *tsPostfixFlag 57 } 58 if tsOutputTypeFlag != nil { 59 tsOutputType = *tsOutputTypeFlag 60 } 61 62 appBindings := binding.NewBindings(a.logger, a.options.Bind, bindingExemptions, IsObfuscated(), a.options.EnumBind) 63 64 appBindings.SetTsPrefix(tsPrefix) 65 appBindings.SetTsSuffix(tsSuffix) 66 appBindings.SetOutputType(tsOutputType) 67 68 err := generateBindings(appBindings) 69 if err != nil { 70 return err 71 } 72 return nil 73 } 74 75 // CreateApp creates the app! 76 func CreateApp(appoptions *options.App) (*App, error) { 77 // Set up logger 78 myLogger := logger.New(appoptions.Logger) 79 myLogger.SetLogLevel(appoptions.LogLevel) 80 81 result := &App{ 82 logger: myLogger, 83 options: appoptions, 84 } 85 86 return result, nil 87 88 } 89 90 func generateBindings(bindings *binding.Bindings) error { 91 92 cwd, err := os.Getwd() 93 if err != nil { 94 return err 95 } 96 projectConfig, err := project.Load(cwd) 97 if err != nil { 98 return err 99 } 100 101 wailsjsbasedir := filepath.Join(projectConfig.GetWailsJSDir(), "wailsjs") 102 103 runtimeDir := filepath.Join(wailsjsbasedir, "runtime") 104 _ = os.RemoveAll(runtimeDir) 105 extractor := gosod.New(wrapper.RuntimeWrapper) 106 err = extractor.Extract(runtimeDir, nil) 107 if err != nil { 108 return err 109 } 110 111 goBindingsDir := filepath.Join(wailsjsbasedir, "go") 112 err = os.RemoveAll(goBindingsDir) 113 if err != nil { 114 return err 115 } 116 _ = fs.MkDirs(goBindingsDir) 117 118 err = bindings.GenerateGoBindings(goBindingsDir) 119 if err != nil { 120 return err 121 } 122 123 return fs.SetPermissions(wailsjsbasedir, 0755) 124 }