From 338d1fd5b7941b510acddb8260941d0fe37f58db Mon Sep 17 00:00:00 2001 From: Leon Mika Date: Sat, 2 May 2026 10:00:21 +1000 Subject: [PATCH] Add Wails project metadata reader Co-Authored-By: Claude Opus 4.7 (1M context) --- go.mod | 4 +- go.sum | 2 + internal/wails/project.go | 51 +++++++++++++++++++++++ internal/wails/project_test.go | 41 ++++++++++++++++++ internal/wails/testdata/no-wails/go.mod | 3 ++ internal/wails/testdata/sample/go.mod | 5 +++ internal/wails/testdata/sample/wails.json | 6 +++ 7 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 go.sum create mode 100644 internal/wails/project.go create mode 100644 internal/wails/project_test.go create mode 100644 internal/wails/testdata/no-wails/go.mod create mode 100644 internal/wails/testdata/sample/go.mod create mode 100644 internal/wails/testdata/sample/wails.json diff --git a/go.mod b/go.mod index bd1229a..d5539d2 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,5 @@ module github.com/leonmika/wails-release -go 1.24.3 +go 1.25.0 + +require golang.org/x/mod v0.35.0 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..662c524 --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM= +golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU= diff --git a/internal/wails/project.go b/internal/wails/project.go new file mode 100644 index 0000000..4dfa37f --- /dev/null +++ b/internal/wails/project.go @@ -0,0 +1,51 @@ +package wails + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + + "golang.org/x/mod/modfile" +) + +// Project is the subset of wails.json we care about. +type Project struct { + Name string `json:"name"` +} + +// ReadProject parses wails.json from dir. +func ReadProject(dir string) (*Project, error) { + path := filepath.Join(dir, "wails.json") + b, err := os.ReadFile(path) + if err != nil { + return nil, fmt.Errorf("read %s: %w", path, err) + } + var p Project + if err := json.Unmarshal(b, &p); err != nil { + return nil, fmt.Errorf("parse %s: %w", path, err) + } + if p.Name == "" { + return nil, fmt.Errorf("%s: name field is empty", path) + } + return &p, nil +} + +// ProjectWailsVersion returns the require'd Wails version from go.mod. +func ProjectWailsVersion(dir string) (string, error) { + path := filepath.Join(dir, "go.mod") + b, err := os.ReadFile(path) + if err != nil { + return "", fmt.Errorf("read %s: %w", path, err) + } + mf, err := modfile.Parse(path, b, nil) + if err != nil { + return "", fmt.Errorf("parse %s: %w", path, err) + } + for _, r := range mf.Require { + if r.Mod.Path == "github.com/wailsapp/wails/v2" { + return r.Mod.Version, nil + } + } + return "", fmt.Errorf("%s: no require for github.com/wailsapp/wails/v2", path) +} diff --git a/internal/wails/project_test.go b/internal/wails/project_test.go new file mode 100644 index 0000000..44afc94 --- /dev/null +++ b/internal/wails/project_test.go @@ -0,0 +1,41 @@ +package wails_test + +import ( + "testing" + + "github.com/leonmika/wails-release/internal/wails" +) + +func TestReadProject_ReturnsAppName(t *testing.T) { + p, err := wails.ReadProject("testdata/sample") + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if p.Name != "SampleApp" { + t.Fatalf("name: got %q want SampleApp", p.Name) + } +} + +func TestReadProject_MissingWailsJSONErrors(t *testing.T) { + _, err := wails.ReadProject("testdata/missing") + if err == nil { + t.Fatal("expected error for missing wails.json") + } +} + +func TestProjectWailsVersion_FromGoMod(t *testing.T) { + v, err := wails.ProjectWailsVersion("testdata/sample") + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if v != "v2.11.0" { + t.Fatalf("got %q, want v2.11.0", v) + } +} + +func TestProjectWailsVersion_NoWailsDependencyErrors(t *testing.T) { + _, err := wails.ProjectWailsVersion("testdata/no-wails") + if err == nil { + t.Fatal("expected error for project with no wails dep") + } +} diff --git a/internal/wails/testdata/no-wails/go.mod b/internal/wails/testdata/no-wails/go.mod new file mode 100644 index 0000000..368c37c --- /dev/null +++ b/internal/wails/testdata/no-wails/go.mod @@ -0,0 +1,3 @@ +module example.com/sample + +go 1.22 diff --git a/internal/wails/testdata/sample/go.mod b/internal/wails/testdata/sample/go.mod new file mode 100644 index 0000000..dfa9bbd --- /dev/null +++ b/internal/wails/testdata/sample/go.mod @@ -0,0 +1,5 @@ +module example.com/sample + +go 1.22 + +require github.com/wailsapp/wails/v2 v2.11.0 diff --git a/internal/wails/testdata/sample/wails.json b/internal/wails/testdata/sample/wails.json new file mode 100644 index 0000000..e84e140 --- /dev/null +++ b/internal/wails/testdata/sample/wails.json @@ -0,0 +1,6 @@ +{ + "name": "SampleApp", + "outputfilename": "SampleApp", + "frontend:install": "npm install", + "frontend:build": "npm run build" +}