diff --git a/assets_dev.go b/assets_dev.go new file mode 100644 index 0000000..04cac3c --- /dev/null +++ b/assets_dev.go @@ -0,0 +1,9 @@ +// assets_dev.go — used in non-production builds (no web/build required) +//go:build !production + +package assets + +import "io/fs" + +// FS is nil in dev mode; the router skips static file serving. +var FS fs.FS diff --git a/assets_prod.go b/assets_prod.go new file mode 100644 index 0000000..9014d4e --- /dev/null +++ b/assets_prod.go @@ -0,0 +1,21 @@ +// assets_prod.go — used in production builds (requires web/build to exist) +//go:build production + +package assets + +import ( + "embed" + "io/fs" +) + +//go:embed all:web/build +var embeddedWeb embed.FS + +// FS is the sub-filesystem rooted at web/build. +var FS fs.FS = func() fs.FS { + sub, err := fs.Sub(embeddedWeb, "web/build") + if err != nil { + panic(err) + } + return sub +}() diff --git a/cmd/wotra/embed_dev.go b/cmd/wotra/embed_dev.go deleted file mode 100644 index a484b36..0000000 --- a/cmd/wotra/embed_dev.go +++ /dev/null @@ -1,9 +0,0 @@ -// embed_dev.go — used in non-production builds (no web/build directory required) -//go:build !production - -package main - -import "io/fs" - -// webFS is nil in dev mode; the router will skip static file serving. -var webFS fs.FS diff --git a/cmd/wotra/embed_prod.go b/cmd/wotra/embed_prod.go deleted file mode 100644 index fe6e4a8..0000000 --- a/cmd/wotra/embed_prod.go +++ /dev/null @@ -1,20 +0,0 @@ -// embed_prod.go — used in production builds (requires web/build to exist) -//go:build production - -package main - -import ( - "embed" - "io/fs" -) - -//go:embed all:../../web/build -var embeddedWeb embed.FS - -var webFS fs.FS = func() fs.FS { - sub, err := fs.Sub(embeddedWeb, "web/build") - if err != nil { - panic(err) - } - return sub -}() diff --git a/cmd/wotra/main.go b/cmd/wotra/main.go index 7cfd9e6..1b01d83 100644 --- a/cmd/wotra/main.go +++ b/cmd/wotra/main.go @@ -2,7 +2,6 @@ package main import ( "context" - "io/fs" "log/slog" "net/http" "os" @@ -10,6 +9,7 @@ import ( "syscall" "time" + assets "github.com/wotra/wotra" "github.com/wotra/wotra/internal/config" "github.com/wotra/wotra/internal/handler" "github.com/wotra/wotra/internal/service" @@ -56,13 +56,8 @@ func main() { defer cancel() go runMidnightGuard(ctx, entrySvc) - // Static SPA files (embedded or from disk for dev) - var staticFS fs.FS - if webFS != nil { - staticFS = webFS - } - - router := handler.NewRouter(cfg.AuthToken, entrySvc, daySvc, settingsSvc, weekSvc, syncStore, entryStore, adjustmentStore, settingsStore, staticFS) + // Static SPA files (embedded or nil for dev) + router := handler.NewRouter(cfg.AuthToken, entrySvc, daySvc, settingsSvc, weekSvc, syncStore, entryStore, adjustmentStore, settingsStore, assets.FS) srv := &http.Server{ Addr: ":" + cfg.Port, diff --git a/mise.toml b/mise.toml index ccc4fc8..8b5bf38 100644 --- a/mise.toml +++ b/mise.toml @@ -10,8 +10,11 @@ DB_PATH = "wotra.db" TZ = "UTC" [tasks.build] -description = "Build production single binary (web + Go)" -depends = ["build:web", "build:go"] +description = "Build production single binary (web + Go, sequential)" +run = """ +mise run build:web +mise run build:go +""" [tasks."build:web"] description = "Build Svelte frontend"