create webapp stencil with side bar, routes and fake login

This commit is contained in:
2025-02-16 21:25:45 -07:00
parent de771d83b1
commit 6a8a4a13ba
13 changed files with 533 additions and 9 deletions

View File

@ -3,9 +3,12 @@ package main
import (
_ "embed"
"fmt"
"golang.org/x/text/cases"
"golang.org/x/text/language"
"os"
"os/exec"
"strings"
"text/template"
)
//go:embed templates/vue/AboutView.vue.tmpl
@ -14,6 +17,39 @@ var aboutViewTemplate string
//go:embed templates/vue/HomeView.vue.tmpl
var homeViewTemplate string
//go:embed templates/vue/SideNavBar.vue.tmpl
var sideNavBarTemplate string
//go:embed templates/vue/Header.vue.tmpl
var headerTemplateSource string
//go:embed templates/vue/LoginLayout.vue.tmpl
var loginLayoutTemplate string
//go:embed templates/vue/MainLayout.vue.tmpl
var mainLayoutTemplate string
//go:embed templates/vue/Password.vue.tmpl
var passwordTemplate string
//go:embed templates/vue/authentication.ts.tmpl
var authenticationTemplate string
//go:embed templates/vue/App.vue.tmpl
var vueAppTemplate string
//go:embed templates/vue/router-index.ts.tmpl
var routerIndexTemplate string
//go:embed templates/vue/IconArrowFromShapeRight.vue.tmpl
var iconArrowFromShapeRightTemplate string
//go:embed templates/vue/IconHome.vue.tmpl
var iconHomeTemplate string
//go:embed templates/vue/IconGear.vue.tmpl
var iconGearTemplate string
func setupWebapp(name string) error {
fmt.Println("Setting up webapp with Vue 3, TypeScript, Vue Router, Pinia, and ESLint with Prettier")
cmd := exec.Command("npm", "create", "vue@latest", "--", "--ts", "--router", "--pinia", "--eslint-with-prettier", name)
@ -67,6 +103,12 @@ func setupWebapp(name string) error {
"src/assets/logo.svg",
})
// make sure "src/layouts/" exists
err = os.Mkdir("src/layouts", 0755)
if err != nil {
return fmt.Errorf("error creating layouts directory | %w", err)
}
// create a new about view from the aboutViewTemplate
err = os.WriteFile("src/views/AboutView.vue", []byte(aboutViewTemplate), 0644)
if err != nil {
@ -78,6 +120,48 @@ func setupWebapp(name string) error {
return fmt.Errorf("error writing new HomeView.vue | %w", err)
}
// create src/components/SideNavBar.vue from a template
err = os.WriteFile("src/components/SideNavBar.vue", []byte(sideNavBarTemplate), 0644)
if err != nil {
return fmt.Errorf("error writing new SideNavBar.vue | %w", err)
}
titleMaker := cases.Title(language.English)
// create src/components/Header.vue from a template
err = renderTemplate("src/components/Header.vue", headerTemplateSource, map[string]string{"AppName": strings.ToLower(name), "AppNameCaps": titleMaker.String(name)})
if err != nil {
return fmt.Errorf("error writing new Header.vue | %w", err)
}
err = renderTemplate("src/layouts/MainLayout.vue", mainLayoutTemplate, map[string]string{"AppName": strings.ToLower(name), "AppNameCaps": titleMaker.String(name)})
if err != nil {
return fmt.Errorf("error writing new MainLayout.vue | %w", err)
}
// create src/layouts/Login.vue from a template
err = os.WriteFile("src/layouts/Login.vue", []byte(loginLayoutTemplate), 0644)
if err != nil {
return fmt.Errorf("error writing new Login.vue | %w", err)
}
straightCopies := []struct{ src, dest string }{
{vueAppTemplate, "src/App.vue"},
{passwordTemplate, "src/views/Password.vue"},
{authenticationTemplate, "src/stores/authentication.ts"},
{routerIndexTemplate, "src/router/index.ts"},
{iconArrowFromShapeRightTemplate, "src/components/icons/IconArrowFromShapeRight.vue"},
{iconHomeTemplate, "src/components/icons/IconHome.vue"},
{iconGearTemplate, "src/components/icons/IconGear.vue"},
}
for _, srcDest := range straightCopies {
err = os.WriteFile(srcDest.dest, []byte(srcDest.src), 0644)
if err != nil {
return fmt.Errorf("error writing new file %s | %w", srcDest.dest, err)
}
}
fmt.Println("Exiting the new directory")
err = os.Chdir("..")
if err != nil {
@ -87,6 +171,20 @@ func setupWebapp(name string) error {
return nil
}
func renderTemplate(fileLocation string, templateSource string, templateData map[string]string) error {
headerFile, err := os.Create(fileLocation)
if err != nil {
return fmt.Errorf("error creating new file %s | %w", fileLocation, err)
}
defer headerFile.Close()
headerTemplate := template.Must(template.New("header").Parse(templateSource))
err = headerTemplate.Execute(headerFile, templateData)
if err != nil {
return fmt.Errorf("error rendering file %s | %w", fileLocation, err)
}
return nil
}
func setupTailwind() error {
// check that there is a vite.config.ts file and a package.json file
_, err := os.Stat("vite.config.ts")