get frontend code generating and usable

This commit is contained in:
2025-02-22 17:08:26 -07:00
parent 6a8a4a13ba
commit 9fe376d3ea
101 changed files with 16455 additions and 37 deletions

View File

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