diff --git a/v2/pkg/parser/generate.go b/v2/pkg/parser/generate.go index 93709b73..f5176f07 100644 --- a/v2/pkg/parser/generate.go +++ b/v2/pkg/parser/generate.go @@ -40,7 +40,9 @@ func (p *Parser) generateModule() error { return err } - for _, pkg := range p.packages { + packagesToGenerate := p.packagesToGenerate() + + for _, pkg := range packagesToGenerate { // Calculate directory dir := filepath.Join(moduleDir, pkg.gopackage.Name) @@ -53,6 +55,21 @@ func (p *Parser) generateModule() error { return err } } + + // Copy the package file + srcFile := fs.RelativePath("./package.json") + tgtFile := filepath.Join(moduleDir, "package.json") + err = fs.CopyFile(srcFile, tgtFile) + if err != nil { + return err + } + + // Generate the index.js file + err = generateIndexJS(moduleDir, packagesToGenerate) + if err != nil { + return err + } + return nil } @@ -61,9 +78,9 @@ func createBackendJSDirectory() (string, error) { // Calculate the package directory // Note this is *always* called from the project directory // so using paths relative to CWD is fine - dir, err := fs.RelativeToCwd("./frontend/wails") + dir, err := fs.RelativeToCwd("./frontend/backend") if err != nil { - return "", errors.Wrap(err, "Error creating wails js directory") + return "", errors.Wrap(err, "Error creating backend module directory") } // Remove directory if it exists - REGENERATION! @@ -129,3 +146,33 @@ func generatePackage(pkg *Package, moduledir string) error { return nil } + +func generateIndexJS(dir string, packages []*Package) error { + + // Get path to local file + templateFile := fs.RelativePath("./index.template") + + // Load template + templateData := fs.MustLoadString(templateFile) + packagesTemplate, err := template.New("index").Parse(templateData) + if err != nil { + return errors.Wrap(err, "Error creating template") + } + + // Execute template + var buffer bytes.Buffer + err = packagesTemplate.Execute(&buffer, packages) + if err != nil { + return errors.Wrap(err, "Error generating code") + } + + // Calculate target filename + indexJS := filepath.Join(dir, "index.js") + + err = ioutil.WriteFile(indexJS, buffer.Bytes(), 0755) + if err != nil { + return errors.Wrap(err, "Error writing backend package index.js file") + } + + return nil +} diff --git a/v2/pkg/parser/index.template b/v2/pkg/parser/index.template new file mode 100644 index 00000000..22fb0f41 --- /dev/null +++ b/v2/pkg/parser/index.template @@ -0,0 +1,12 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +{{- range .}} +const {{.Name}} = require('./{{.Name}}'); +{{- end}} + +module.exports = { + {{- range .}} + {{.Name}}: {{.Name}}, + {{- end}} +} \ No newline at end of file diff --git a/v2/pkg/parser/package.d.template b/v2/pkg/parser/package.d.template index 5d503d7e..5206b962 100644 --- a/v2/pkg/parser/package.d.template +++ b/v2/pkg/parser/package.d.template @@ -5,7 +5,7 @@ {{range .DeclarationReferences}} /// {{end}}{{- end}} -declare module {{.Name}} { {{range .Structs}} +export namespace {{.Name}} { {{range .Structs}} {{- if or .IsBound .IsUsedAsData}} {{if .Comments }}{{range .Comments}}// {{ . }}{{end}}{{- end}} interface {{.Name}} { {{ if .IsUsedAsData }} @@ -14,11 +14,18 @@ declare module {{.Name}} { {{range .Structs}} {{.Name}}: {{.TypeAsTSType $.Name}}; {{- end}} {{ end }} {{- if .IsBound }} {{- range .Methods}} - {{- range .Comments}} - // {{ . }}{{- end}} + /**{{if .Comments }} +{{range .Comments}} * {{ . }}{{end}} + *{{end}} + * @function {{.Name}} +{{range .Inputs}} * @param {{"{"}}{{.JSType}}{{"}"}} {{.Name}} +{{end}} * + * @returns {Promise<{{.OutputsAsTSText $.Name}}>} + */ {{.Name}}({{.InputsAsTSText $.Name}}): Promise<{{.OutputsAsTSText $.Name}}>; {{- end}}{{end}} }{{- end}} {{end}} -} \ No newline at end of file +} + diff --git a/v2/pkg/parser/package.go b/v2/pkg/parser/package.go index 6f341a52..e8c88f08 100644 --- a/v2/pkg/parser/package.go +++ b/v2/pkg/parser/package.go @@ -90,6 +90,36 @@ func (p *Package) addStruct(strct *Struct) { p.parsedStructs[strct.Name] = strct } +// HasBoundStructs returns true if any of its structs +// are bound +func (p *Package) HasBoundStructs() bool { + + for _, strct := range p.parsedStructs { + if strct.IsBound { + return true + } + } + + return false +} + +// HasDataStructs returns true if any of its structs +// are used as data +func (p *Package) HasDataStructs() bool { + for _, strct := range p.parsedStructs { + if strct.IsUsedAsData { + return true + } + } + + return false +} + +// ShouldGenerate returns true when this package should be generated +func (p *Package) ShouldGenerate() bool { + return p.HasBoundStructs() || p.HasDataStructs() +} + // DeclarationReferences returns a list of external packages // we reference from this package func (p *Package) DeclarationReferences() []string { diff --git a/v2/pkg/parser/package.json b/v2/pkg/parser/package.json new file mode 100644 index 00000000..ab37717c --- /dev/null +++ b/v2/pkg/parser/package.json @@ -0,0 +1,13 @@ +{ + "name": "backend", + "version": "1.0.0", + "description": "Auto generated module wrapping your Wails backend", + "main": "index.js", + "types": "index.d.ts", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC" +} diff --git a/v2/pkg/parser/parser.go b/v2/pkg/parser/parser.go index 2d046496..628798f7 100644 --- a/v2/pkg/parser/parser.go +++ b/v2/pkg/parser/parser.go @@ -100,3 +100,16 @@ func (p *Parser) loadPackages(projectPath string) error { func (p *Parser) getPackageByID(id string) *Package { return p.packages[id] } + +func (p *Parser) packagesToGenerate() []*Package { + + var result []*Package + + for _, pkg := range p.packages { + if pkg.ShouldGenerate() { + result = append(result, pkg) + } + } + + return result +}