diff --git a/v3/internal/flags/bindings.go b/v3/internal/flags/bindings.go index d634edc40f1..e559d59bae3 100644 --- a/v3/internal/flags/bindings.go +++ b/v3/internal/flags/bindings.go @@ -9,7 +9,9 @@ import ( type GenerateBindingsOptions struct { BuildFlagsString string `name:"f" description:"Provide a list of additional space-separated Go build flags. Flags can be wrapped (even partially) in single or double quotes to include spaces"` - ProjectDirectory string `name:"p" description:"The project directory" default:"."` + ProjectDirectory string `name:"p" description:"The project directory. Must contain a source file with application.New" default:"."` + BasePath string `name:"base" description:"The base package path" default:"."` + UseBaseName bool `name:"n" description:"Place the base package bindings inside a folder with the base package name"` OutputDirectory string `name:"d" description:"The output directory" default:"assets/bindings"` ModelsFilename string `name:"m" description:"The filename for the models file, excluding the extension" default:"models"` TS bool `name:"ts" description:"Generate Typescript bindings"` diff --git a/v3/internal/parser/bindings_test.go b/v3/internal/parser/bindings_test.go index c6f9dd0bf76..143eecd4f6f 100644 --- a/v3/internal/parser/bindings_test.go +++ b/v3/internal/parser/bindings_test.go @@ -312,6 +312,21 @@ func TestGenerateBindings(t *testing.T) { }, }, }, + { + name: "app_outside_main", + dir: "testdata/app_outside_main/app", + want: map[string]map[string]bool{ + "app": { + "GreetService": true, + }, + "services": { + "OtherService": true, + }, + "github.com/wailsapp/wails/v3/internal/parser/testdata/app_outside_main/other": { + "OtherService": true, + }, + }, + }, } type Test struct { @@ -366,6 +381,8 @@ func TestGenerateBindings(t *testing.T) { OutputDirectory: "frontend/bindings", ProjectDirectory: absDir, UseBundledRuntime: tt.useBundledRuntime, + BasePath: ".", + UseBaseName: true, } project, err := ParseProjectAndPkgs(options) diff --git a/v3/internal/parser/models_test.go b/v3/internal/parser/models_test.go index d05cbe62a9c..38a03c3dc23 100644 --- a/v3/internal/parser/models_test.go +++ b/v3/internal/parser/models_test.go @@ -131,8 +131,8 @@ func TestGenerateModels(t *testing.T) { name: "multiple_packages", dir: "testdata/multiple_packages", want: map[string]bool{ - "github.com-google-uuid": true, - "runtime-debug": true, + "github.com/google/uuid": true, + "runtime/debug": true, "other": true, "other/other": true, }, @@ -151,6 +151,14 @@ func TestGenerateModels(t *testing.T) { "main": true, }, }, + { + name: "app_outside_main", + dir: "testdata/app_outside_main/app", + want: map[string]bool{ + "app": true, + "models": true, + }, + }, } type Test struct { @@ -196,6 +204,8 @@ func TestGenerateModels(t *testing.T) { ModelsFilename: "models", OutputDirectory: "frontend/bindings", ProjectDirectory: absDir, + BasePath: ".", + UseBaseName: true, } project, err := ParseProjectAndPkgs(options) @@ -210,7 +220,7 @@ func TestGenerateModels(t *testing.T) { t.Fatalf("GenerateModels() error = %v", err) } - // Ceck if models are missing + // Check if models are missing for pkgDir := range tt.want { if _, ok := allModels[pkgDir]; !ok { t.Errorf("GenerateModels() missing model = %v", pkgDir) diff --git a/v3/internal/parser/parser.go b/v3/internal/parser/parser.go index 3873476891b..f17337c7c18 100644 --- a/v3/internal/parser/parser.go +++ b/v3/internal/parser/parser.go @@ -12,6 +12,7 @@ import ( "strings" "time" + "github.com/pterm/pterm" "github.com/samber/lo" "github.com/wailsapp/wails/v3/internal/flags" "github.com/wailsapp/wails/v3/internal/hash" @@ -166,7 +167,7 @@ type Service struct { Methods []*BoundMethod } -func ParseMethods(service *types.TypeName, main *packages.Package) (methods []*BoundMethod) { +func ParseMethods(service *types.TypeName) (methods []*BoundMethod) { if named, ok := service.Type().(*types.Named); ok { for i := 0; i < named.NumMethods(); i++ { fn := named.Method(i) @@ -178,7 +179,7 @@ func ParseMethods(service *types.TypeName, main *packages.Package) (methods []*B // use "main" as package path if service is inside main package, // because reflect.Type.PkgPath() == "main" // https://github.com/golang/go/issues/8559 - if packagePath == main.Types.Path() { + if service.Pkg().Name() == "main" { packagePath = "main" } @@ -241,7 +242,7 @@ func ParsePackages(project *Project) ([]*Package, error) { } // add services to packages - services, err := ParseServices(project.main) + services, err := ParseServices(project.pPkgs) if err != nil { return nil, err } @@ -261,11 +262,11 @@ func ParsePackages(project *Project) ([]*Package, error) { result := lo.Values(requiredPackages) // load documentation for each package - for tPkg, pkg := range requiredPackages { - if tPkg == project.main.Types { + for _, pPkg := range project.pPkgs { + if pkg, ok := requiredPackages[pPkg.Types]; ok { files := make(map[string]*ast.File) - for i, file := range project.main.Syntax { - files[project.main.CompiledGoFiles[i]] = file + for i, file := range pPkg.Syntax { + files[pPkg.CompiledGoFiles[i]] = file } pkg.doc = NewDoc(pkg.Path(), &ast.Package{ Files: files, @@ -343,10 +344,12 @@ type Stats struct { } type Project struct { - pkgs []*Package - main *packages.Package - options *flags.GenerateBindingsOptions - Stats Stats + pkgs []*Package + pPkgs []*packages.Package + options *flags.GenerateBindingsOptions + Stats Stats + basePath string + baseName string marshaler *types.Interface textMarshaler *types.Interface @@ -404,19 +407,47 @@ func ParseProject(options *flags.GenerateBindingsOptions) (*Project, error) { return nil, err } - mainIndex := slices.IndexFunc(pPkgs, func(pkg *packages.Package) bool { return pkg.Name == "main" }) - if mainIndex == -1 { - return nil, errors.New("application.New() must be inside main package") + // retrive base of package paths + baseIndex := -1 + basePath := options.BasePath + if basePath == "." || basePath == "./" { + baseIndex = slices.IndexFunc(pPkgs, func(pkg *packages.Package) bool { + absDir, _ := filepath.Abs(options.ProjectDirectory) + + if pkg.PkgPath == options.ProjectDirectory || pkg.PkgPath == absDir { + return true + } + if len(pkg.CompiledGoFiles) > 0 && filepath.Dir(pkg.CompiledGoFiles[0]) == absDir { + return true + } + return false + }) + if baseIndex == -1 { + return nil, fmt.Errorf("package not found: %s", options.ProjectDirectory) + } + basePath = pPkgs[baseIndex].PkgPath + } + + // retrive base name + baseName := "" + if options.UseBaseName { + if baseIndex != -1 { + baseName = pPkgs[baseIndex].Types.Name() + } else { + pterm.Warning.Printfln("base name not found: UseBaseName can only be used with BasePath=\".\"") + } } return &Project{ - main: pPkgs[mainIndex], + pPkgs: pPkgs, options: options, marshaler: marshaler, textMarshaler: textMarshaler, Stats: Stats{ StartTime: startTime, }, + basePath: basePath, + baseName: baseName, }, nil } @@ -499,8 +530,8 @@ func GenerateBindingsAndModels(options *flags.GenerateBindingsOptions) (*Project return p, nil } -func ParseServices(main *packages.Package) (services []*Service, err error) { - found, err := FindServices([]*packages.Package{main}) +func ParseServices(pkgs []*packages.Package) (services []*Service, err error) { + found, err := FindServices(pkgs) if err != nil { return } @@ -508,26 +539,25 @@ func ParseServices(main *packages.Package) (services []*Service, err error) { for _, service := range found { services = append(services, &Service{ TypeName: service, - Methods: ParseMethods(service, main), + Methods: ParseMethods(service), }) } return } func (p *Project) PackageDir(pkg *types.Package) string { - root := p.main.Types.Path() - if pkg.Path() == root { - return "main" + if p.baseName != "" && pkg.Path() == p.basePath { + return p.baseName } - if strings.HasPrefix(pkg.Path(), root) { - path, err := filepath.Rel(root, pkg.Path()) + if strings.HasPrefix(pkg.Path(), p.basePath) { + path, err := filepath.Rel(p.basePath, pkg.Path()) if err != nil { panic(err) } return filepath.ToSlash(path) } - return strings.ReplaceAll(pkg.Path(), "/", "-") + return pkg.Path() } func (p *Project) RelativePackageDir(base *types.Package, target *types.Package) string { diff --git a/v3/internal/parser/parser_test.go b/v3/internal/parser/parser_test.go new file mode 100644 index 00000000000..bc7e91b4f96 --- /dev/null +++ b/v3/internal/parser/parser_test.go @@ -0,0 +1,150 @@ +package parser + +import ( + "fmt" + "path/filepath" + "testing" + + "github.com/wailsapp/wails/v3/internal/flags" +) + +func TestPackageDir(t *testing.T) { + + tests := []struct { + project string + basePath string + useBaseName bool + want map[string]bool + }{ + { + project: "function_from_imported_package", + basePath: ".", + useBaseName: false, + want: map[string]bool{ + ".": true, + "services": true, + }, + }, + { + project: "function_from_imported_package", + basePath: ".", + useBaseName: true, + want: map[string]bool{ + "main": true, + "services": true, + }, + }, + { + project: "function_from_imported_package", + basePath: "github.com/wailsapp/wails/v3/internal/parser/testdata", + useBaseName: false, + want: map[string]bool{ + "function_from_imported_package": true, + "function_from_imported_package/services": true, + }, + }, + { + project: "function_from_imported_package", + basePath: "github.com/wailsapp/wails/v3/internal/parser/testdata", + useBaseName: true, // will be ignored + want: map[string]bool{ + "function_from_imported_package": true, + "function_from_imported_package/services": true, + }, + }, + { + project: "function_from_imported_package", + basePath: "", + useBaseName: false, + want: map[string]bool{ + "github.com/wailsapp/wails/v3/internal/parser/testdata/function_from_imported_package": true, + "github.com/wailsapp/wails/v3/internal/parser/testdata/function_from_imported_package/services": true, + }, + }, + { + project: "app_outside_main/app", + basePath: ".", + useBaseName: false, + want: map[string]bool{ + ".": true, + "models": true, + }, + }, + { + project: "app_outside_main/app", + basePath: ".", + useBaseName: true, + want: map[string]bool{ + "app": true, + "models": true, + }, + }, + { + project: "app_outside_main/app", + basePath: "github.com/wailsapp/wails/v3/internal/parser/testdata/app_outside_main", + useBaseName: false, + want: map[string]bool{ + "app": true, + "app/models": true, + }, + }, + { + project: "multiple_packages", + basePath: ".", + useBaseName: true, + want: map[string]bool{ + "other": true, + "other/other": true, + "runtime/debug": true, + "github.com/google/uuid": true, + }, + }, + } + + for _, tt := range tests { + name := fmt.Sprintf("%s__%s_%v", tt.project, tt.basePath, tt.useBaseName) + + t.Run(name, func(t *testing.T) { + + absDir, err := filepath.Abs("testdata/" + tt.project) + if err != nil { + t.Errorf("filepath.Abs() error = %v", err) + return + } + + options := &flags.GenerateBindingsOptions{ + ProjectDirectory: absDir, + BasePath: tt.basePath, + UseBaseName: tt.useBaseName, + } + + project, err := ParseProjectAndPkgs(options) + if err != nil { + t.Errorf("ParseProjectAndPkgs() error = %v", err) + return + } + + // Generate Models + allModels, err := project.GenerateModels() + if err != nil { + t.Fatalf("GenerateModels() error = %v", err) + } + + // Check if models are missing + for pkgDir := range tt.want { + if _, ok := allModels[pkgDir]; !ok { + t.Errorf("GenerateModels() missing model = %v", pkgDir) + } + } + + // Check for unexpected models + for pkgDir := range allModels { + if _, ok := tt.want[pkgDir]; !ok { + t.Errorf("GenerateModels() unexpected model = %v", pkgDir) + } + } + + }) + } + +} diff --git a/v3/internal/parser/testdata/app_outside_main/app/app.go b/v3/internal/parser/testdata/app_outside_main/app/app.go new file mode 100644 index 00000000000..dd6d49281d8 --- /dev/null +++ b/v3/internal/parser/testdata/app_outside_main/app/app.go @@ -0,0 +1,27 @@ +package app + +import ( + "github.com/wailsapp/wails/v3/internal/parser/testdata/app_outside_main/app/services" + "github.com/wailsapp/wails/v3/internal/parser/testdata/app_outside_main/other" + "github.com/wailsapp/wails/v3/pkg/application" +) + +type Person struct { + Name string `json:"name"` +} + +type GreetService struct{} + +func (*GreetService) Greet(person Person) string { + return "Hello " + person.Name +} + +func NewApp() *application.App { + return application.New(application.Options{ + Bind: []interface{}{ + &GreetService{}, + &other.OtherService{}, + &services.OtherService{}, + }, + }) +} diff --git a/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/app/GreetService.js b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/app/GreetService.js new file mode 100644 index 00000000000..1eb8d7c57ab --- /dev/null +++ b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/app/GreetService.js @@ -0,0 +1,15 @@ +// @ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import {Call} from "@wailsio/runtime"; + +import {Person} from "./models.js"; + +/** + * @param {Person} person + * @returns {Promise} + */ +export function Greet(person) { + return Call.ByID(1675906978, person); +} diff --git a/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/app/GreetService.name.js b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/app/GreetService.name.js new file mode 100644 index 00000000000..fbb196f7f9f --- /dev/null +++ b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/app/GreetService.name.js @@ -0,0 +1,15 @@ +// @ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import {Call} from "@wailsio/runtime"; + +import {Person} from "./models.js"; + +/** + * @param {Person} person + * @returns {Promise} + */ +export function Greet(person) { + return Call.ByName("github.com/wailsapp/wails/v3/internal/parser/testdata/app_outside_main/app.GreetService.Greet", person); +} diff --git a/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/app/GreetService.name.ts b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/app/GreetService.name.ts new file mode 100644 index 00000000000..9ea4ae1ea5f --- /dev/null +++ b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/app/GreetService.name.ts @@ -0,0 +1,10 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import {Call} from "@wailsio/runtime"; + +import {Person} from "./models"; + +export function Greet(person: Person): Promise { + return Call.ByName("github.com/wailsapp/wails/v3/internal/parser/testdata/app_outside_main/app.GreetService.Greet", person); +} diff --git a/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/app/GreetService.ts b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/app/GreetService.ts new file mode 100644 index 00000000000..3a26158692f --- /dev/null +++ b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/app/GreetService.ts @@ -0,0 +1,10 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import {Call} from "@wailsio/runtime"; + +import {Person} from "./models"; + +export function Greet(person: Person): Promise { + return Call.ByID(1675906978, person); +} diff --git a/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/app/models.interfaces.ts b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/app/models.interfaces.ts new file mode 100644 index 00000000000..1462aa52ad6 --- /dev/null +++ b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/app/models.interfaces.ts @@ -0,0 +1,7 @@ +// @ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export interface Person { + "name": string; +} diff --git a/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/app/models.js b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/app/models.js new file mode 100644 index 00000000000..0e8906549c3 --- /dev/null +++ b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/app/models.js @@ -0,0 +1,31 @@ +// @ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export class Person { + /** + * Creates a new Person instance. + * @param {Partial} [source = {}] - The source object to create the Person. + */ + constructor(source = {}) { + if (!("name" in source)) { + /** + * @member + * @type {string} + */ + this["name"] = ""; + } + + Object.assign(this, source); + } + + /** + * Creates a new Person instance from a string or object. + * @param {string|object} source - The source data to create a Person instance from. + * @returns {Person} A new Person instance. + */ + static createFrom(source) { + let parsedSource = typeof source === 'string' ? JSON.parse(source) : source; + return new Person(parsedSource); + } +}; diff --git a/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/app/models.ts b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/app/models.ts new file mode 100644 index 00000000000..72b37720986 --- /dev/null +++ b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/app/models.ts @@ -0,0 +1,22 @@ +// @ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export class Person { + "name": string; + + /** Creates a new Person instance. */ + constructor(source: Partial = {}) { + if (!("name" in source)) { + this["name"] = ""; + } + + Object.assign(this, source); + } + + /** Creates a new Person instance from a string or object. */ + static createFrom(source: string | object = {}): Person { + let parsedSource = typeof source === 'string' ? JSON.parse(source) : source; + return new Person(parsedSource as Partial); + } +} diff --git a/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/github.com/wailsapp/wails/v3/internal/parser/testdata/app_outside_main/other/OtherService.js b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/github.com/wailsapp/wails/v3/internal/parser/testdata/app_outside_main/other/OtherService.js new file mode 100644 index 00000000000..ed20c44630e --- /dev/null +++ b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/github.com/wailsapp/wails/v3/internal/parser/testdata/app_outside_main/other/OtherService.js @@ -0,0 +1,15 @@ +// @ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import {Call} from "@wailsio/runtime"; + +import * as models from "../../../../../../../../../models/models.js"; + +/** + * @param {models.Person} person + * @returns {Promise} + */ +export function Greet(person) { + return Call.ByID(1688395392, person); +} diff --git a/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/github.com/wailsapp/wails/v3/internal/parser/testdata/app_outside_main/other/OtherService.name.js b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/github.com/wailsapp/wails/v3/internal/parser/testdata/app_outside_main/other/OtherService.name.js new file mode 100644 index 00000000000..81cb803b6c5 --- /dev/null +++ b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/github.com/wailsapp/wails/v3/internal/parser/testdata/app_outside_main/other/OtherService.name.js @@ -0,0 +1,15 @@ +// @ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import {Call} from "@wailsio/runtime"; + +import * as models from "../../../../../../../../../models/models.js"; + +/** + * @param {models.Person} person + * @returns {Promise} + */ +export function Greet(person) { + return Call.ByName("github.com/wailsapp/wails/v3/internal/parser/testdata/app_outside_main/other.OtherService.Greet", person); +} diff --git a/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/github.com/wailsapp/wails/v3/internal/parser/testdata/app_outside_main/other/OtherService.name.ts b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/github.com/wailsapp/wails/v3/internal/parser/testdata/app_outside_main/other/OtherService.name.ts new file mode 100644 index 00000000000..cd90a2b4d05 --- /dev/null +++ b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/github.com/wailsapp/wails/v3/internal/parser/testdata/app_outside_main/other/OtherService.name.ts @@ -0,0 +1,10 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import {Call} from "@wailsio/runtime"; + +import * as models from "../../../../../../../../../models/models"; + +export function Greet(person: models.Person): Promise { + return Call.ByName("github.com/wailsapp/wails/v3/internal/parser/testdata/app_outside_main/other.OtherService.Greet", person); +} diff --git a/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/github.com/wailsapp/wails/v3/internal/parser/testdata/app_outside_main/other/OtherService.ts b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/github.com/wailsapp/wails/v3/internal/parser/testdata/app_outside_main/other/OtherService.ts new file mode 100644 index 00000000000..8e653dbc368 --- /dev/null +++ b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/github.com/wailsapp/wails/v3/internal/parser/testdata/app_outside_main/other/OtherService.ts @@ -0,0 +1,10 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import {Call} from "@wailsio/runtime"; + +import * as models from "../../../../../../../../../models/models"; + +export function Greet(person: models.Person): Promise { + return Call.ByID(1688395392, person); +} diff --git a/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/models/models.interfaces.ts b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/models/models.interfaces.ts new file mode 100644 index 00000000000..1462aa52ad6 --- /dev/null +++ b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/models/models.interfaces.ts @@ -0,0 +1,7 @@ +// @ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export interface Person { + "name": string; +} diff --git a/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/models/models.js b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/models/models.js new file mode 100644 index 00000000000..0e8906549c3 --- /dev/null +++ b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/models/models.js @@ -0,0 +1,31 @@ +// @ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export class Person { + /** + * Creates a new Person instance. + * @param {Partial} [source = {}] - The source object to create the Person. + */ + constructor(source = {}) { + if (!("name" in source)) { + /** + * @member + * @type {string} + */ + this["name"] = ""; + } + + Object.assign(this, source); + } + + /** + * Creates a new Person instance from a string or object. + * @param {string|object} source - The source data to create a Person instance from. + * @returns {Person} A new Person instance. + */ + static createFrom(source) { + let parsedSource = typeof source === 'string' ? JSON.parse(source) : source; + return new Person(parsedSource); + } +}; diff --git a/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/models/models.ts b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/models/models.ts new file mode 100644 index 00000000000..72b37720986 --- /dev/null +++ b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/models/models.ts @@ -0,0 +1,22 @@ +// @ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export class Person { + "name": string; + + /** Creates a new Person instance. */ + constructor(source: Partial = {}) { + if (!("name" in source)) { + this["name"] = ""; + } + + Object.assign(this, source); + } + + /** Creates a new Person instance from a string or object. */ + static createFrom(source: string | object = {}): Person { + let parsedSource = typeof source === 'string' ? JSON.parse(source) : source; + return new Person(parsedSource as Partial); + } +} diff --git a/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/services/OtherService.js b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/services/OtherService.js new file mode 100644 index 00000000000..c5d0511b885 --- /dev/null +++ b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/services/OtherService.js @@ -0,0 +1,15 @@ +// @ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import {Call} from "@wailsio/runtime"; + +import * as models from "../models/models.js"; + +/** + * @param {models.Person} person + * @returns {Promise} + */ +export function Greet(person) { + return Call.ByID(44742058, person); +} diff --git a/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/services/OtherService.name.js b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/services/OtherService.name.js new file mode 100644 index 00000000000..c618f7b35d8 --- /dev/null +++ b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/services/OtherService.name.js @@ -0,0 +1,15 @@ +// @ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import {Call} from "@wailsio/runtime"; + +import * as models from "../models/models.js"; + +/** + * @param {models.Person} person + * @returns {Promise} + */ +export function Greet(person) { + return Call.ByName("github.com/wailsapp/wails/v3/internal/parser/testdata/app_outside_main/app/services.OtherService.Greet", person); +} diff --git a/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/services/OtherService.name.ts b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/services/OtherService.name.ts new file mode 100644 index 00000000000..70e71ae3b4a --- /dev/null +++ b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/services/OtherService.name.ts @@ -0,0 +1,10 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import {Call} from "@wailsio/runtime"; + +import * as models from "../models/models"; + +export function Greet(person: models.Person): Promise { + return Call.ByName("github.com/wailsapp/wails/v3/internal/parser/testdata/app_outside_main/app/services.OtherService.Greet", person); +} diff --git a/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/services/OtherService.ts b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/services/OtherService.ts new file mode 100644 index 00000000000..fde39c0b932 --- /dev/null +++ b/v3/internal/parser/testdata/app_outside_main/app/frontend/bindings/services/OtherService.ts @@ -0,0 +1,10 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +import {Call} from "@wailsio/runtime"; + +import * as models from "../models/models"; + +export function Greet(person: models.Person): Promise { + return Call.ByID(44742058, person); +} diff --git a/v3/internal/parser/testdata/app_outside_main/app/models/person.go b/v3/internal/parser/testdata/app_outside_main/app/models/person.go new file mode 100644 index 00000000000..28bd8fdaeda --- /dev/null +++ b/v3/internal/parser/testdata/app_outside_main/app/models/person.go @@ -0,0 +1,5 @@ +package models + +type Person struct { + Name string `json:"name"` +} diff --git a/v3/internal/parser/testdata/app_outside_main/app/services/other.go b/v3/internal/parser/testdata/app_outside_main/app/services/other.go new file mode 100644 index 00000000000..5429eb20b49 --- /dev/null +++ b/v3/internal/parser/testdata/app_outside_main/app/services/other.go @@ -0,0 +1,9 @@ +package services + +import "github.com/wailsapp/wails/v3/internal/parser/testdata/app_outside_main/app/models" + +type OtherService struct{} + +func (*OtherService) Greet(person models.Person) string { + return "Hello " + person.Name +} diff --git a/v3/internal/parser/testdata/app_outside_main/main.go b/v3/internal/parser/testdata/app_outside_main/main.go new file mode 100644 index 00000000000..2e4163cf482 --- /dev/null +++ b/v3/internal/parser/testdata/app_outside_main/main.go @@ -0,0 +1,18 @@ +package main + +import ( + "log" + + "github.com/wailsapp/wails/v3/internal/parser/testdata/app_outside_main/app" +) + +func main() { + app := app.NewApp() + app.NewWebviewWindow() + + err := app.Run() + + if err != nil { + log.Fatal(err) + } +} diff --git a/v3/internal/parser/testdata/app_outside_main/other/other.go b/v3/internal/parser/testdata/app_outside_main/other/other.go new file mode 100644 index 00000000000..27447edbb81 --- /dev/null +++ b/v3/internal/parser/testdata/app_outside_main/other/other.go @@ -0,0 +1,9 @@ +package other + +import "github.com/wailsapp/wails/v3/internal/parser/testdata/app_outside_main/app/models" + +type OtherService struct{} + +func (*OtherService) Greet(person models.Person) string { + return "Hello " + person.Name +} diff --git a/v3/internal/parser/testdata/multiple_packages/frontend/bindings/github.com-google-uuid/models.interfaces.ts b/v3/internal/parser/testdata/multiple_packages/frontend/bindings/github.com/google/uuid/models.interfaces.ts similarity index 100% rename from v3/internal/parser/testdata/multiple_packages/frontend/bindings/github.com-google-uuid/models.interfaces.ts rename to v3/internal/parser/testdata/multiple_packages/frontend/bindings/github.com/google/uuid/models.interfaces.ts diff --git a/v3/internal/parser/testdata/multiple_packages/frontend/bindings/github.com-google-uuid/models.js b/v3/internal/parser/testdata/multiple_packages/frontend/bindings/github.com/google/uuid/models.js similarity index 100% rename from v3/internal/parser/testdata/multiple_packages/frontend/bindings/github.com-google-uuid/models.js rename to v3/internal/parser/testdata/multiple_packages/frontend/bindings/github.com/google/uuid/models.js diff --git a/v3/internal/parser/testdata/multiple_packages/frontend/bindings/github.com-google-uuid/models.ts b/v3/internal/parser/testdata/multiple_packages/frontend/bindings/github.com/google/uuid/models.ts similarity index 100% rename from v3/internal/parser/testdata/multiple_packages/frontend/bindings/github.com-google-uuid/models.ts rename to v3/internal/parser/testdata/multiple_packages/frontend/bindings/github.com/google/uuid/models.ts diff --git a/v3/internal/parser/testdata/multiple_packages/frontend/bindings/main/GreetService.js b/v3/internal/parser/testdata/multiple_packages/frontend/bindings/main/GreetService.js index 458b6f8821c..36cf13ec3f5 100644 --- a/v3/internal/parser/testdata/multiple_packages/frontend/bindings/main/GreetService.js +++ b/v3/internal/parser/testdata/multiple_packages/frontend/bindings/main/GreetService.js @@ -4,8 +4,8 @@ import {Call} from "/wails/runtime.js"; -import * as debug from "../runtime-debug/models.js"; -import * as uuid from "../github.com-google-uuid/models.js"; +import * as debug from "../runtime/debug/models.js"; +import * as uuid from "../github.com/google/uuid/models.js"; /** * @returns {Promise<[debug.BuildInfo | null, boolean]>} diff --git a/v3/internal/parser/testdata/multiple_packages/frontend/bindings/main/GreetService.name.js b/v3/internal/parser/testdata/multiple_packages/frontend/bindings/main/GreetService.name.js index 78e0ca2e006..66d9057f6cd 100644 --- a/v3/internal/parser/testdata/multiple_packages/frontend/bindings/main/GreetService.name.js +++ b/v3/internal/parser/testdata/multiple_packages/frontend/bindings/main/GreetService.name.js @@ -4,8 +4,8 @@ import {Call} from "/wails/runtime.js"; -import * as debug from "../runtime-debug/models.js"; -import * as uuid from "../github.com-google-uuid/models.js"; +import * as debug from "../runtime/debug/models.js"; +import * as uuid from "../github.com/google/uuid/models.js"; /** * @returns {Promise<[debug.BuildInfo | null, boolean]>} diff --git a/v3/internal/parser/testdata/multiple_packages/frontend/bindings/main/GreetService.name.ts b/v3/internal/parser/testdata/multiple_packages/frontend/bindings/main/GreetService.name.ts index f4a38a48e52..6453897e0fd 100644 --- a/v3/internal/parser/testdata/multiple_packages/frontend/bindings/main/GreetService.name.ts +++ b/v3/internal/parser/testdata/multiple_packages/frontend/bindings/main/GreetService.name.ts @@ -3,8 +3,8 @@ import {Call} from "/wails/runtime.js"; -import * as debug from "../runtime-debug/models"; -import * as uuid from "../github.com-google-uuid/models"; +import * as debug from "../runtime/debug/models"; +import * as uuid from "../github.com/google/uuid/models"; export function BuildInfo(): Promise<[debug.BuildInfo | null, boolean]> { return Call.ByName("main.GreetService.BuildInfo"); diff --git a/v3/internal/parser/testdata/multiple_packages/frontend/bindings/main/GreetService.ts b/v3/internal/parser/testdata/multiple_packages/frontend/bindings/main/GreetService.ts index 69892db838e..3a1775d2dca 100644 --- a/v3/internal/parser/testdata/multiple_packages/frontend/bindings/main/GreetService.ts +++ b/v3/internal/parser/testdata/multiple_packages/frontend/bindings/main/GreetService.ts @@ -3,8 +3,8 @@ import {Call} from "/wails/runtime.js"; -import * as debug from "../runtime-debug/models"; -import * as uuid from "../github.com-google-uuid/models"; +import * as debug from "../runtime/debug/models"; +import * as uuid from "../github.com/google/uuid/models"; export function BuildInfo(): Promise<[debug.BuildInfo | null, boolean]> { return Call.ByID(2776941280); diff --git a/v3/internal/parser/testdata/multiple_packages/frontend/bindings/other/models.interfaces.ts b/v3/internal/parser/testdata/multiple_packages/frontend/bindings/other/models.interfaces.ts index 43e5571f095..c4e11460afa 100644 --- a/v3/internal/parser/testdata/multiple_packages/frontend/bindings/other/models.interfaces.ts +++ b/v3/internal/parser/testdata/multiple_packages/frontend/bindings/other/models.interfaces.ts @@ -2,7 +2,7 @@ // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL // This file is automatically generated. DO NOT EDIT -import * as uuid from "../github.com-google-uuid/models"; +import * as uuid from "../github.com/google/uuid/models"; export interface Person { "UUID": uuid.UUID; diff --git a/v3/internal/parser/testdata/multiple_packages/frontend/bindings/other/models.js b/v3/internal/parser/testdata/multiple_packages/frontend/bindings/other/models.js index 7c1289bd2b5..6379e4934af 100644 --- a/v3/internal/parser/testdata/multiple_packages/frontend/bindings/other/models.js +++ b/v3/internal/parser/testdata/multiple_packages/frontend/bindings/other/models.js @@ -2,7 +2,7 @@ // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL // This file is automatically generated. DO NOT EDIT -import * as uuid from "../github.com-google-uuid/models.js"; +import * as uuid from "../github.com/google/uuid/models.js"; export class Person { /** diff --git a/v3/internal/parser/testdata/multiple_packages/frontend/bindings/other/models.ts b/v3/internal/parser/testdata/multiple_packages/frontend/bindings/other/models.ts index ff8919340ff..3b1e954d9c4 100644 --- a/v3/internal/parser/testdata/multiple_packages/frontend/bindings/other/models.ts +++ b/v3/internal/parser/testdata/multiple_packages/frontend/bindings/other/models.ts @@ -2,7 +2,7 @@ // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL // This file is automatically generated. DO NOT EDIT -import * as uuid from "../github.com-google-uuid/models"; +import * as uuid from "../github.com/google/uuid/models"; export class Person { "UUID": uuid.UUID; diff --git a/v3/internal/parser/testdata/multiple_packages/frontend/bindings/runtime-debug/models.interfaces.ts b/v3/internal/parser/testdata/multiple_packages/frontend/bindings/runtime/debug/models.interfaces.ts similarity index 100% rename from v3/internal/parser/testdata/multiple_packages/frontend/bindings/runtime-debug/models.interfaces.ts rename to v3/internal/parser/testdata/multiple_packages/frontend/bindings/runtime/debug/models.interfaces.ts diff --git a/v3/internal/parser/testdata/multiple_packages/frontend/bindings/runtime-debug/models.js b/v3/internal/parser/testdata/multiple_packages/frontend/bindings/runtime/debug/models.js similarity index 100% rename from v3/internal/parser/testdata/multiple_packages/frontend/bindings/runtime-debug/models.js rename to v3/internal/parser/testdata/multiple_packages/frontend/bindings/runtime/debug/models.js diff --git a/v3/internal/parser/testdata/multiple_packages/frontend/bindings/runtime-debug/models.ts b/v3/internal/parser/testdata/multiple_packages/frontend/bindings/runtime/debug/models.ts similarity index 100% rename from v3/internal/parser/testdata/multiple_packages/frontend/bindings/runtime-debug/models.ts rename to v3/internal/parser/testdata/multiple_packages/frontend/bindings/runtime/debug/models.ts