From 662b14fffb65811c4ea94e65b067e1bcc1350f04 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Fri, 30 Oct 2020 15:06:25 +1100 Subject: [PATCH] Initial generation of typescript declarations --- .../internal/backendjs/package.d.template | 15 +++++++ .../build/internal/backendjs/packages.go | 42 +++++++++++++++---- .../build/internal/backendjs/structs.go | 33 +++++++++++++++ 3 files changed, 82 insertions(+), 8 deletions(-) create mode 100644 v2/pkg/commands/build/internal/backendjs/package.d.template diff --git a/v2/pkg/commands/build/internal/backendjs/package.d.template b/v2/pkg/commands/build/internal/backendjs/package.d.template new file mode 100644 index 000000000..0fb962224 --- /dev/null +++ b/v2/pkg/commands/build/internal/backendjs/package.d.template @@ -0,0 +1,15 @@ +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +{{range .Comments}}// {{.}}{{end}} +{{range .Methods}} +/**{{if .Comments }} +{{range .Comments}} * {{ . }}{{end}} + *{{end}} + * @function {{.Name}} +{{range .Inputs}} * @param {{"{"}}{{.JSType}}{{"}"}} {{.Name}} +{{end}} * + * @returns {Promise} + */ +export function {{.Name}}({{.InputsAsTSText}}): Promise<{{.OutputsAsTSText}}>; +{{end}} \ No newline at end of file diff --git a/v2/pkg/commands/build/internal/backendjs/packages.go b/v2/pkg/commands/build/internal/backendjs/packages.go index 1605a97f4..272722aea 100644 --- a/v2/pkg/commands/build/internal/backendjs/packages.go +++ b/v2/pkg/commands/build/internal/backendjs/packages.go @@ -102,8 +102,8 @@ func generateIndexJS(packages []*Package) error { templateFile := fs.RelativePath("./index.template") // Load template - templateData := fs.MustLoadString(templateFile) - packagesTemplate, err := template.New("index").Parse(templateData) + javascriptTemplateData := fs.MustLoadString(templateFile) + packagesTemplate, err := template.New("index").Parse(javascriptTemplateData) if err != nil { return errors.Wrap(err, "Error creating template") } @@ -132,11 +132,21 @@ func generateIndexJS(packages []*Package) error { func generatePackageFiles(packages []*Package) error { // Get path to local file - templateFile := fs.RelativePath("./package.template") + javascriptTemplateFile := fs.RelativePath("./package.template") - // Load template - templateData := fs.MustLoadString(templateFile) - packagesTemplate, err := template.New("package").Parse(templateData) + // Load javascript template + javascriptTemplateData := fs.MustLoadString(javascriptTemplateFile) + javascriptTemplate, err := template.New("javascript").Parse(javascriptTemplateData) + if err != nil { + return errors.Wrap(err, "Error creating template") + } + + // Get path to local file + typescriptTemplateFile := fs.RelativePath("./package.d.template") + + // Load typescript template + typescriptTemplateData := fs.MustLoadString(typescriptTemplateFile) + typescriptTemplate, err := template.New("typescript").Parse(typescriptTemplateData) if err != nil { return errors.Wrap(err, "Error creating template") } @@ -153,17 +163,33 @@ func generatePackageFiles(packages []*Package) error { // Make the dir but ignore if it already exists fs.Mkdir(packageDir) - // Execute template + // Execute javascript template var buffer bytes.Buffer - err = packagesTemplate.Execute(&buffer, thisPackage) + err = javascriptTemplate.Execute(&buffer, thisPackage) if err != nil { return errors.Wrap(err, "Error generating code") } + // Save javascript file err = ioutil.WriteFile(filepath.Join(packageDir, "index.js"), buffer.Bytes(), 0755) if err != nil { return errors.Wrap(err, "Error writing backend package file") } + + // Clear buffer + buffer.Reset() + + // Execute typescript template + err = typescriptTemplate.Execute(&buffer, thisPackage) + if err != nil { + return errors.Wrap(err, "Error generating code") + } + + // Save typescript file + err = ioutil.WriteFile(filepath.Join(packageDir, "index.d.ts"), 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/structs.go b/v2/pkg/commands/build/internal/backendjs/structs.go index a4366f98b..a670143a9 100644 --- a/v2/pkg/commands/build/internal/backendjs/structs.go +++ b/v2/pkg/commands/build/internal/backendjs/structs.go @@ -1,6 +1,7 @@ package backendjs import ( + "fmt" "reflect" "strings" ) @@ -37,6 +38,38 @@ func (m *Method) InputsAsJSText() string { return strings.Join(inputs, ", ") } +// InputsAsTSText generates a string with the method inputs +// formatted in a way acceptable to Typescript +func (m *Method) InputsAsTSText() string { + var inputs []string + + for _, input := range m.Inputs { + inputText := fmt.Sprintf("%s: %s", input.Name, goTypeToJS(input.Type)) + inputs = append(inputs, inputText) + } + + return strings.Join(inputs, ", ") +} + +// OutputsAsTSText generates a string with the method inputs +// formatted in a way acceptable to Javascript +func (m *Method) OutputsAsTSText() string { + + if len(m.Outputs) != 2 { + return "any" + } + + jsType := goTypeToJS(m.Outputs[1].Type) + switch jsType { + case JsArray: + return "Array" + case JsObject: + return "any" + default: + return string(jsType) + } +} + // func generateStructFile() { // // Create string buffer // var result bytes.Buffer