From 75f703465a79e8befac1a769a41778194fb438b7 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Tue, 5 Oct 2021 22:27:12 +1100 Subject: [PATCH] [v2] Generate module command. Updated wails dev --- v2/cmd/wails/internal/commands/dev/dev.go | 8 ++ .../internal/commands/generate/generate.go | 33 +----- .../internal/commands/generate/module.go | 68 +++++------- v2/internal/appng/app_bindings.go | 105 ++++++++++++++++++ v2/internal/appng/app_default_windows.go | 2 +- v2/internal/appng/app_dev.go | 2 +- v2/internal/binding/generate.go | 14 ++- .../frontend/runtime/runtime_dev_desktop.go | 2 + 8 files changed, 163 insertions(+), 71 deletions(-) create mode 100644 v2/internal/appng/app_bindings.go diff --git a/v2/cmd/wails/internal/commands/dev/dev.go b/v2/cmd/wails/internal/commands/dev/dev.go index e273d7174..c6289338d 100644 --- a/v2/cmd/wails/internal/commands/dev/dev.go +++ b/v2/cmd/wails/internal/commands/dev/dev.go @@ -3,6 +3,7 @@ package dev import ( "context" "fmt" + "github.com/wailsapp/wails/v2/internal/shell" "io" "net/http" "os" @@ -106,6 +107,13 @@ func AddSubcommand(app *clir.Cli, w io.Writer) error { return err } + // Generate wailsjs module + LogGreen("Generating wailsjs module...") + _, _, err = shell.RunCommand(cwd, "wails", "generate", "module") + if err != nil { + return err + } + // frontend:dev server command if projectConfig.DevCommand != "" { var devCommandWaitGroup sync.WaitGroup diff --git a/v2/cmd/wails/internal/commands/generate/generate.go b/v2/cmd/wails/internal/commands/generate/generate.go index 5751184c9..58f623bf0 100644 --- a/v2/cmd/wails/internal/commands/generate/generate.go +++ b/v2/cmd/wails/internal/commands/generate/generate.go @@ -6,8 +6,6 @@ import ( "github.com/wailsapp/wails/v2/cmd/wails/internal/commands/generate/template" "github.com/leaanthony/clir" - "github.com/wailsapp/wails/v2/pkg/clilogger" - "github.com/wailsapp/wails/v2/pkg/parser" ) // AddSubcommand adds the `generate` command for the Wails application @@ -15,34 +13,11 @@ func AddSubcommand(app *clir.Cli, w io.Writer) error { command := app.NewSubCommand("generate", "Code Generation Tools") - //AddModuleCommand(app, command, w) + err := AddModuleCommand(app, command, w) + if err != nil { + return err + } template.AddSubCommand(app, command, w) return nil } - -func logPackage(pkg *parser.Package, logger *clilogger.CLILogger) { - - logger.Println("Processed Go package '" + pkg.Gopackage.Name + "' as '" + pkg.Name + "'") - for _, strct := range pkg.Structs() { - logger.Println("") - logger.Println(" Processed struct '" + strct.Name + "'") - if strct.IsBound { - for _, method := range strct.Methods { - logger.Println(" Bound method '" + method.Name + "'") - } - } - if strct.IsUsedAsData { - for _, field := range strct.Fields { - if !field.Ignored { - logger.Print(" Processed ") - if field.IsOptional { - logger.Print("optional ") - } - logger.Println("field '" + field.Name + "' as '" + field.JSName() + "'") - } - } - } - } - logger.Println("") -} diff --git a/v2/cmd/wails/internal/commands/generate/module.go b/v2/cmd/wails/internal/commands/generate/module.go index 6459326ea..012c3bfda 100644 --- a/v2/cmd/wails/internal/commands/generate/module.go +++ b/v2/cmd/wails/internal/commands/generate/module.go @@ -1,58 +1,50 @@ package generate import ( - "io" - "time" - "github.com/leaanthony/clir" - "github.com/wailsapp/wails/v2/pkg/clilogger" - "github.com/wailsapp/wails/v2/pkg/parser" + "github.com/wailsapp/wails/v2/internal/shell" + "io" + "os" + "path/filepath" + "runtime" ) -func AddModuleCommand(app *clir.Cli, parent *clir.Command, w io.Writer) { +// AddModuleCommand adds the `module` subcommand for the `generate` command +func AddModuleCommand(app *clir.Cli, parent *clir.Command, w io.Writer) error { - // Backend API - backendAPI := parent.NewSubCommand("module", "Generates a JS module for the frontend to interface with the backend") + command := parent.NewSubCommand("module", "Generate wailsjs modules") - // Quiet Init - quiet := false - backendAPI.BoolFlag("q", "Suppress output to console", &quiet) + command.Action(func() error { - backendAPI.Action(func() error { + filename := "wailsbindings" + if runtime.GOOS == "windows" { + filename += ".exe" + } + // go build -tags bindings -o bindings.exe + tempDir := os.TempDir() + filename = filepath.Join(tempDir, filename) - // Create logger - logger := clilogger.New(w) - logger.Mute(quiet) - - app.PrintBanner() - - logger.Print("Generating Javascript module for Go code...") - - // Start Time - start := time.Now() - - p, err := parser.GenerateWailsFrontendPackage() + cwd, err := os.Getwd() if err != nil { return err } - logger.Println("done.") - logger.Println("") - - elapsed := time.Since(start) - packages := p.Packages - - // Print report - for _, pkg := range p.Packages { - if pkg.ShouldGenerate() { - logPackage(pkg, logger) - } - + _, _, err = shell.RunCommand(cwd, "go", "build", "-tags", "bindings", "-o", filename) + if err != nil { + return err } - logger.Println("%d packages parsed in %s.", len(packages), elapsed) + _, _, err = shell.RunCommand(cwd, filename) + if err != nil { + return err + } + + err = os.Remove(filename) + if err != nil { + return err + } return nil - }) + return nil } diff --git a/v2/internal/appng/app_bindings.go b/v2/internal/appng/app_bindings.go new file mode 100644 index 000000000..e314802c9 --- /dev/null +++ b/v2/internal/appng/app_bindings.go @@ -0,0 +1,105 @@ +//go:build bindings +// +build bindings + +package appng + +import ( + "github.com/leaanthony/gosod" + "github.com/wailsapp/wails/v2/internal/binding" + wailsRuntime "github.com/wailsapp/wails/v2/internal/frontend/runtime" + "github.com/wailsapp/wails/v2/internal/frontend/runtime/wrapper" + "github.com/wailsapp/wails/v2/internal/fs" + "github.com/wailsapp/wails/v2/internal/logger" + "github.com/wailsapp/wails/v2/internal/project" + "github.com/wailsapp/wails/v2/pkg/options" + "os" + "path/filepath" +) + +// App defines a Wails application structure +type App struct { + logger *logger.Logger + appoptions *options.App +} + +func (a *App) Run() error { + + // Create binding exemptions - Ugly hack. There must be a better way + bindingExemptions := []interface{}{a.appoptions.OnStartup, a.appoptions.OnShutdown, a.appoptions.OnDomReady} + appBindings := binding.NewBindings(a.logger, a.appoptions.Bind, bindingExemptions) + + err := generateBindings(appBindings) + if err != nil { + return err + } + return nil +} + +// CreateApp creates the app! +func CreateApp(appoptions *options.App) (*App, error) { + // Set up logger + myLogger := logger.New(appoptions.Logger) + myLogger.SetLogLevel(appoptions.LogLevel) + + result := &App{ + logger: myLogger, + appoptions: appoptions, + } + + return result, nil + +} + +func generateBindings(bindings *binding.Bindings) error { + + cwd, err := os.Getwd() + if err != nil { + return err + } + projectConfig, err := project.Load(cwd) + if err != nil { + return err + } + + wrapperDir := filepath.Join(projectConfig.WailsJSDir, "wailsjs", "runtime") + _ = os.RemoveAll(wrapperDir) + extractor := gosod.New(wrapper.RuntimeWrapper) + err = extractor.Extract(wrapperDir, nil) + if err != nil { + return err + } + + //ipcdev.js + err = os.WriteFile(filepath.Join(wrapperDir, "ipcdev.js"), wailsRuntime.DesktopIPC, 0755) + if err != nil { + return err + } + //runtimedev.js + err = os.WriteFile(filepath.Join(wrapperDir, "runtimedev.js"), wailsRuntime.RuntimeDesktopJS, 0755) + if err != nil { + return err + } + + targetDir := filepath.Join(projectConfig.WailsJSDir, "wailsjs", "go") + err = os.RemoveAll(targetDir) + if err != nil { + return err + } + _ = fs.MkDirs(targetDir) + + modelsFile := filepath.Join(targetDir, "models.ts") + err = bindings.WriteTS(modelsFile) + if err != nil { + return err + } + + // Write backend method wrappers + bindingsFilename := filepath.Join(targetDir, "bindings.js") + err = bindings.GenerateBackendJS(bindingsFilename, true) + if err != nil { + return err + } + + return nil + +} diff --git a/v2/internal/appng/app_default_windows.go b/v2/internal/appng/app_default_windows.go index d387ddc50..2ae56aeb0 100644 --- a/v2/internal/appng/app_default_windows.go +++ b/v2/internal/appng/app_default_windows.go @@ -1,4 +1,4 @@ -//go:build !dev && !production && windows +//go:build !dev && !production && !bindings && windows package appng diff --git a/v2/internal/appng/app_dev.go b/v2/internal/appng/app_dev.go index 5cbc391c6..cc463bb88 100644 --- a/v2/internal/appng/app_dev.go +++ b/v2/internal/appng/app_dev.go @@ -162,7 +162,7 @@ func generateBindings(bindings *binding.Bindings) error { // Write backend method wrappers bindingsFilename := filepath.Join(targetDir, "bindings.js") - err = bindings.GenerateBackendJS(bindingsFilename) + err = bindings.GenerateBackendJS(bindingsFilename, false) if err != nil { return err } diff --git a/v2/internal/binding/generate.go b/v2/internal/binding/generate.go index 1354b59e6..c432dac6b 100644 --- a/v2/internal/binding/generate.go +++ b/v2/internal/binding/generate.go @@ -16,7 +16,7 @@ import ( //go:embed assets/package.json var packageJSON []byte -func (b *Bindings) GenerateBackendJS(targetfile string) error { +func (b *Bindings) GenerateBackendJS(targetfile string, isDevBindings bool) error { store := b.db.store var output bytes.Buffer @@ -24,8 +24,18 @@ func (b *Bindings) GenerateBackendJS(targetfile string) error { output.WriteString(`// @ts-check // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL // This file is automatically generated. DO NOT EDIT +`) -const go = {`) + if isDevBindings { + json, err := b.ToJSON() + if err != nil { + return err + } + output.WriteString("window.wailsbindings = " + json + ";") + output.WriteString("\n") + } + + output.WriteString(`const go = {`) output.WriteString("\n") var sortedPackageNames slicer.StringSlicer diff --git a/v2/internal/frontend/runtime/runtime_dev_desktop.go b/v2/internal/frontend/runtime/runtime_dev_desktop.go index 0338d5bcc..c0dcb1fc5 100644 --- a/v2/internal/frontend/runtime/runtime_dev_desktop.go +++ b/v2/internal/frontend/runtime/runtime_dev_desktop.go @@ -1,3 +1,5 @@ +//go:build dev || bindings || (!dev && !production && !bindings) + package runtime import _ "embed"