diff --git a/v2/pkg/commands/build/internal/backendjs/conversion.go b/v2/pkg/commands/build/internal/backendjs/conversion.go
index 0885104f..2d3abbf0 100644
--- a/v2/pkg/commands/build/internal/backendjs/conversion.go
+++ b/v2/pkg/commands/build/internal/backendjs/conversion.go
@@ -20,23 +20,25 @@ const (
JsUnsupported = "*"
)
-func goTypeToJS(input string) JSType {
- switch input {
+func goTypeToJS(input *Field) string {
+ switch input.Type {
case "string":
- return JsString
+ return "string"
case "int", "int8", "int16", "int32", "int64", "uint", "uint8", "uint16", "uint32", "uint64":
- return JsInt
+ return "number"
case "float32", "float64":
- return JsFloat
+ return "number"
case "bool":
- return JsBoolean
+ return "boolean"
// case reflect.Array, reflect.Slice:
// return JsArray
// case reflect.Ptr, reflect.Struct, reflect.Map, reflect.Interface:
// return JsObject
+ case "struct":
+ return input.Struct.ToString()
default:
println("UNSUPPORTED: ", input)
- return JsUnsupported
+ return "*"
}
}
diff --git a/v2/pkg/commands/build/internal/backendjs/package.d.template b/v2/pkg/commands/build/internal/backendjs/package.d.template
index 47b98e44..4dfd92b5 100644
--- a/v2/pkg/commands/build/internal/backendjs/package.d.template
+++ b/v2/pkg/commands/build/internal/backendjs/package.d.template
@@ -1,16 +1,20 @@
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
// This file is automatically generated. DO NOT EDIT
-{{range .DeclarationReferences}}/// {{end}}
+
+{{- range .DeclarationReferences}}
+/// {{- end}}
+
declare module {{.Name}} { {{range .Structs}}
{{if .Comments }}{{range .Comments}}// {{ . }}{{end}}{{end}}
interface {{.Name}} { {{ if $.StructIsUsedAsData .Name }}
- {{range .Fields}}{{if .Comments }}
+ {{- range .Fields}}{{if .Comments }}
{{range .Comments}}//{{ . }}{{end}}{{end}}
- {{.Name}}: {{.TypeAsTSType}}; {{end}} {{ end }}
- {{range .Methods}}
- {{if .Comments }}{{range .Comments}}// {{ . }}{{end}}{{end}}
+ {{.Name}}: {{.TypeAsTSType}}; {{- end}} {{ end }}
+ {{- range .Methods}}
+ {{- range .Comments}}
+ // {{ . }}{{- end}}
{{.Name}}({{.InputsAsTSText}}): Promise<{{.OutputsAsTSText}}>;
- {{end}}
+ {{- end}}
}{{end}}
}
\ No newline at end of file
diff --git a/v2/pkg/commands/build/internal/backendjs/package.go b/v2/pkg/commands/build/internal/backendjs/package.go
index 2629711e..d05376ab 100644
--- a/v2/pkg/commands/build/internal/backendjs/package.go
+++ b/v2/pkg/commands/build/internal/backendjs/package.go
@@ -120,6 +120,31 @@ func generatePackage(pkg *Package, moduledir string) error {
if err != nil {
return errors.Wrap(err, "Error writing backend package file")
}
+
+ // Get path to local file
+ javascriptTemplateFile := fs.RelativePath("./package.template")
+
+ // Load javascript template
+ javascriptTemplateData := fs.MustLoadString(javascriptTemplateFile)
+ javascriptTemplate, err := template.New("javascript").Parse(javascriptTemplateData)
+ if err != nil {
+ return errors.Wrap(err, "Error creating template")
+ }
+
+ // Reset the buffer
+ buffer.Reset()
+
+ err = javascriptTemplate.Execute(&buffer, pkg)
+ if err != nil {
+ return errors.Wrap(err, "Error generating code")
+ }
+
+ // Save javascript file
+ err = ioutil.WriteFile(filepath.Join(moduledir, "index.js"), buffer.Bytes(), 0755)
+ if err != nil {
+ return errors.Wrap(err, "Error writing backend package file")
+ }
+
return nil
}
diff --git a/v2/pkg/commands/build/internal/backendjs/package.template b/v2/pkg/commands/build/internal/backendjs/package.template
new file mode 100644
index 00000000..e5d32a57
--- /dev/null
+++ b/v2/pkg/commands/build/internal/backendjs/package.template
@@ -0,0 +1,24 @@
+// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
+// This file is automatically generated. DO NOT EDIT
+
+{{range $struct := .Structs }} {{ if .Methods }}
+export const {{.Name}} = {
+{{range .Methods }}
+ /**{{if .Comments }}
+{{range .Comments}} * {{ . }}{{end}}
+ *{{end}}
+ * @function {{.Name}}
+{{range .Inputs}} * @param {{"{"}}{{.JSType}}{{"}"}} {{.Name}}
+{{end}} *
+ * @returns {Promise<{{.OutputsAsTSText}}>}
+ */
+ {{.Name}}: function({{.InputsAsJSText}}) {
+ return window.backend.{{$.Name}}.{{$struct.Name}}.{{.Name}}({{.InputsAsJSText}});
+ },
+{{end}}
+}
+{{end}}
+{{end}}
+
+
+
diff --git a/v2/pkg/commands/build/internal/backendjs/struct.go b/v2/pkg/commands/build/internal/backendjs/struct.go
index b04cee72..33e9738a 100644
--- a/v2/pkg/commands/build/internal/backendjs/struct.go
+++ b/v2/pkg/commands/build/internal/backendjs/struct.go
@@ -29,6 +29,15 @@ type StructName struct {
Package string
}
+// ToString returns a text representation of the struct name
+func (s *StructName) ToString() string {
+ result := ""
+ if s.Package != "" {
+ result = s.Package + "."
+ }
+ return result + s.Name
+}
+
// Field defines a parsed struct field
type Field struct {
Name string
@@ -37,6 +46,11 @@ type Field struct {
Comments []string
}
+// JSType returns the Javascript type for this field
+func (f *Field) JSType() string {
+ return goTypeToJS(f)
+}
+
// TypeAsTSType converts the Field type to something TS wants
func (f *Field) TypeAsTSType() string {
var result = ""
@@ -204,3 +218,15 @@ func (m *Method) OutputsAsTSText() string {
}
return strings.Join(result, ", ")
}
+
+// InputsAsJSText generates a string with the method inputs
+// formatted in a way acceptable to Javascript
+func (m *Method) InputsAsJSText() string {
+ var inputs []string
+
+ for _, input := range m.Inputs {
+ inputs = append(inputs, input.Name)
+ }
+
+ return strings.Join(inputs, ", ")
+}