create webapp stencil with side bar, routes and fake login
This commit is contained in:
@ -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")
|
||||
|
Reference in New Issue
Block a user