Better Ts support

This commit is contained in:
Lea Anthony
2020-11-10 07:33:10 +11:00
parent 5345c8dd0d
commit c181e4a9a6
6 changed files with 129 additions and 7 deletions

View File

@@ -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
}

View File

@@ -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}}
}

View File

@@ -5,7 +5,7 @@
{{range .DeclarationReferences}}
/// <reference types="../{{.}}" />{{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}}
}
}

View File

@@ -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 {

View File

@@ -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"
}

View File

@@ -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
}