get frontend code generating and usable
This commit is contained in:
@ -2,6 +2,7 @@ package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"embed"
|
||||
_ "embed"
|
||||
"fmt"
|
||||
"github.com/urfave/cli/v2"
|
||||
@ -9,6 +10,7 @@ import (
|
||||
"golang.org/x/text/language"
|
||||
"os"
|
||||
"os/exec"
|
||||
"runtime"
|
||||
"strings"
|
||||
"text/template"
|
||||
)
|
||||
@ -19,16 +21,19 @@ var protoTemplate string
|
||||
//go:embed templates/backend/main.go.tmpl
|
||||
var mainGoTemplate string
|
||||
|
||||
//go:embed templates/proto/include/*
|
||||
var protoInclude embed.FS
|
||||
|
||||
func createCmd() *cli.Command {
|
||||
return &cli.Command{
|
||||
Name: "create",
|
||||
Aliases: []string{"c"},
|
||||
Usage: "Create a new app in a directory with the given name",
|
||||
Description: "This command will create a new folder with the given name and generate a new app in that folder.",
|
||||
Category: "generator",
|
||||
Flags: []cli.Flag{
|
||||
&cli.StringFlag{
|
||||
Name: "name",
|
||||
Category: "generator",
|
||||
Usage: "The name of the app to create",
|
||||
Required: true,
|
||||
Aliases: []string{"n"},
|
||||
@ -77,10 +82,10 @@ func createCmd() *cli.Command {
|
||||
return fmt.Errorf("error creating gen/go directory | %w", err)
|
||||
}
|
||||
|
||||
// create a directory for generated typescript code
|
||||
err = os.Mkdir("gen/ts", 0755)
|
||||
// create a directory for generated openapi code
|
||||
err = os.Mkdir("gen/openapi", 0755)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error creating gen/ts directory | %w", err)
|
||||
return fmt.Errorf("error creating gen/openapi directory | %w", err)
|
||||
}
|
||||
|
||||
// create a main.go file
|
||||
@ -113,6 +118,11 @@ func createCmd() *cli.Command {
|
||||
return fmt.Errorf("error rendering proto file | %w", err)
|
||||
}
|
||||
|
||||
err = os.CopyFS("proto_include", protoInclude)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error copying proto include files | %w", err)
|
||||
}
|
||||
|
||||
// set up the webapp
|
||||
err = setupWebapp("webapp") // since the app is already in its own named folder, we name it webapp
|
||||
if err != nil {
|
||||
@ -129,12 +139,40 @@ func generateCmd() *cli.Command {
|
||||
Name: "generate",
|
||||
Aliases: []string{"g"},
|
||||
Usage: "Generate code from proto files",
|
||||
Category: "generator",
|
||||
Description: "This command will generate code from the proto files in the proto directory and place them in a language folder in the gen folder.",
|
||||
Action: func(c *cli.Context) error {
|
||||
fmt.Println("Generating code...")
|
||||
|
||||
protocArgs := []string{
|
||||
"-I",
|
||||
".",
|
||||
"--go_out",
|
||||
"gen/go",
|
||||
"--go-grpc_out",
|
||||
"gen/go",
|
||||
"--go-grpc_opt=require_unimplemented_servers=false",
|
||||
"--gorm_out",
|
||||
"gen/go",
|
||||
"--grpc-gateway_out",
|
||||
"gen/go",
|
||||
"--grpc-gateway_opt",
|
||||
"logtostderr=true",
|
||||
"--openapiv2_out",
|
||||
"gen/openapi",
|
||||
"--openapiv2_opt",
|
||||
"logtostderr=true",
|
||||
"--proto_path=./proto_include",
|
||||
"proto/*.proto",
|
||||
}
|
||||
|
||||
// generate go code
|
||||
cmd := exec.Command("protoc", "-I", ".", "--go_out", "gen/go", "--go-grpc_out", "gen/go", "--go-grpc_opt=require_unimplemented_servers=false", "--gorm_out", "gen/go", "proto/*.proto")
|
||||
cmd := exec.Command(
|
||||
"protoc",
|
||||
protocArgs...,
|
||||
)
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Stderr = os.Stderr
|
||||
err := cmd.Run()
|
||||
if err != nil {
|
||||
|
||||
@ -145,14 +183,55 @@ func generateCmd() *cli.Command {
|
||||
return fmt.Errorf("error generating go code | %w", err)
|
||||
}
|
||||
|
||||
//// generate typescript code
|
||||
//cmd = exec.Command("protoc", "--ts_out=gen/ts", "proto/*.proto")
|
||||
//err = cmd.Run()
|
||||
//if err != nil {
|
||||
// return fmt.Errorf("error generating typescript code | %w", err)
|
||||
//}
|
||||
// Generate ts code
|
||||
// if webapp folder is present, generate typescript code
|
||||
if _, err := os.Stat("webapp"); err == nil {
|
||||
err = os.Chdir("webapp")
|
||||
if err != nil {
|
||||
return fmt.Errorf("error changing directory to webapp | %w", err)
|
||||
}
|
||||
|
||||
// TODO: if there is a webapp folder present, generate vue code from the proto files
|
||||
cmd = exec.Command("npx",
|
||||
"openapi-typescript-codegen",
|
||||
"--input",
|
||||
"../gen/openapi/proto/service.swagger.json",
|
||||
"--output",
|
||||
"src/generated",
|
||||
"--client",
|
||||
"fetch",
|
||||
)
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Stderr = os.Stderr
|
||||
err = cmd.Run()
|
||||
if err != nil {
|
||||
return fmt.Errorf("error generating typescript code | %w", err)
|
||||
}
|
||||
|
||||
// if on windows
|
||||
if runtime.GOOS == "windows" {
|
||||
//cmd = exec.Command("npx", "protoc", "--plugin=protoc-gen-ts_proto=.\\node_modules\\.bin\\protoc-gen-ts_proto.cmd", "--ts_proto_out=./src/generated", "--ts_proto_opt=outputServices=generic,esModuleInterop=true", "--proto_path=../proto", "--proto_path=../include", "../proto/service.proto")
|
||||
//cmd.Stdout = os.Stdout
|
||||
//cmd.Stderr = os.Stderr
|
||||
//err = cmd.Run()
|
||||
//if err != nil {
|
||||
// return fmt.Errorf("error generating typescript code | %w", err)
|
||||
//}
|
||||
} else {
|
||||
//cmd = exec.Command("npx", "protoc", "--plugin=protoc-gen-ts_proto=./node_modules/.bin/protoc-gen-ts_proto", "--ts_proto_out=./src/generated", "--ts_proto_opt=outputServices=generic,esModuleInterop=true", "--proto_path=../proto", "--proto_path=../include", "../proto/service.proto")
|
||||
//cmd.Stdout = os.Stdout
|
||||
//cmd.Stderr = os.Stderr
|
||||
//err = cmd.Run()
|
||||
//if err != nil {
|
||||
// return fmt.Errorf("error generating typescript code | %w", err)
|
||||
//}
|
||||
}
|
||||
err = os.Chdir("..")
|
||||
if err != nil {
|
||||
return fmt.Errorf("error changing directory back to root | %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: update typescript code gen to use this command `npx openapi-typescript-codegen --input ../gen/openapi/proto/service.swagger.json --output src/generated/ts-client --client fetch`
|
||||
|
||||
return nil
|
||||
},
|
||||
@ -167,13 +246,13 @@ func webappCmd() *cli.Command {
|
||||
&cli.StringFlag{
|
||||
Name: "name",
|
||||
Aliases: []string{"n"},
|
||||
Category: "generator",
|
||||
Usage: "The name of the webapp to create, this will be the name of the directory",
|
||||
Required: true,
|
||||
},
|
||||
},
|
||||
Usage: "Set up a webapp",
|
||||
Description: "This command will set up a webapp ",
|
||||
Category: "generator",
|
||||
Action: func(c *cli.Context) error {
|
||||
fmt.Println("Setting up webapp named: ", c.String("name"))
|
||||
name := c.String("name")
|
||||
|
Reference in New Issue
Block a user