@@ -3,44 +3,60 @@ package main
3
3
import (
4
4
"embed"
5
5
"flag"
6
+ "io/fs"
6
7
"log"
7
8
"net/http"
9
+ "os"
10
+ "path/filepath"
8
11
9
12
"github.com/mbertschler/guiapi"
13
+ "github.com/mbertschler/guiapi/assets"
10
14
)
11
15
12
16
//go:embed dist/*
13
- var distEmbedFS embed.FS
17
+ var prebuiltAssets embed.FS
18
+
19
+ func assetsFS () (fs.FS , error ) {
20
+ if ! assets .EsbuildAvailable () {
21
+ // in production, esbuild is not available
22
+ // and assets are compiled into the binary
23
+ assets , err := fs .Sub (prebuiltAssets , "dist" )
24
+ if err != nil {
25
+ return nil , err
26
+ }
27
+ return assets , nil
28
+ }
29
+
30
+ build := assets .DefaultBuildOptions ()
31
+ build .Infile = "js/main.js"
32
+ build .Outfile = "dist/bundle.js"
33
+ build .EsbuildArgs = []string {"--metafile=dist/meta.json" }
34
+
35
+ dir := filepath .Dir (build .Outfile )
36
+
37
+ err := assets .BuildAssets (build )
38
+ if err != nil {
39
+ return nil , err
40
+ }
41
+ return os .DirFS (dir ), nil
42
+ }
14
43
15
- func setup () ( * guiapi.Server , error ) {
44
+ func setupServer ( assetsFS fs. FS ) * guiapi.Server {
16
45
db := NewDB ()
17
46
18
47
reports := NewReportsComponent (db )
19
48
counter := & Counter {DB : db }
20
49
todo := & TodoList {DB : db }
21
50
22
- options := guiapi .DefaultOptions ()
23
- options .DistFS = distEmbedFS
24
- options .Assets .Infile = "js/main.js"
25
- options .Assets .Outfile = "dist/bundle.js"
26
- options .Assets .EsbuildArgs = []string {"--metafile=dist/meta.json" }
51
+ server := guiapi .New ()
27
52
28
- // better struct options
29
- server := guiapi .New (options , reports .StreamRouter )
30
-
31
- distFS , err := server .BuildAssets ()
32
- if err != nil {
33
- return nil , err
34
- }
35
-
36
- // move into guiapi?
37
- server .AddFiles ("/dist/" , http .FS (distFS ))
53
+ server .AddFiles ("/dist/" , http .FS (assetsFS ))
38
54
39
55
reports .Register (server )
40
56
counter .Register (server )
41
57
todo .Register (server )
42
58
43
- return server , nil
59
+ return server
44
60
}
45
61
46
62
func main () {
@@ -50,15 +66,18 @@ func main() {
50
66
flag .BoolVar (& exitAfterBuild , "build" , false , "build assets and exit" )
51
67
flag .Parse ()
52
68
53
- server , err := setup ()
69
+ fs , err := assetsFS ()
54
70
if err != nil {
55
71
log .Fatal (err )
56
72
}
57
73
58
74
if exitAfterBuild {
75
+ log .Println ("built assets, exit after build flag provided" )
59
76
return
60
77
}
61
78
79
+ server := setupServer (fs )
80
+
62
81
log .Println ("listening on localhost:8000" )
63
82
err = http .ListenAndServe ("localhost:8000" , server )
64
83
if err != nil {
0 commit comments