~repos /gromer
git clone https://pyrossh.dev/repos/gromer.git
gromer is a framework and cli to build multipage web apps in golang using htmx and alpinejs.
948b6f7b
—
Peter John 3 years ago
improve router testing
- _example/components/init.go +8 -0
- _example/containers/init.go +8 -0
- _example/main.go +3 -38
- _example/makefile +1 -2
- _example/readme.md +0 -1
- _example/routes/init.go +13 -0
- _example/tests/todos_test.go +64 -33
- assets/assets.go +1 -1
- go.mod +13 -23
- go.sum +29 -44
- http.go +33 -2
_example/components/init.go
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
package components
|
|
2
|
+
|
|
3
|
+
import "github.com/pyros2097/gromer/gsx"
|
|
4
|
+
|
|
5
|
+
func init() {
|
|
6
|
+
gsx.RegisterComponent(Todo, TodoStyles, "todo")
|
|
7
|
+
gsx.RegisterComponent(Status, StatusStyles, "status", "error")
|
|
8
|
+
}
|
_example/containers/init.go
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
package containers
|
|
2
|
+
|
|
3
|
+
import "github.com/pyros2097/gromer/gsx"
|
|
4
|
+
|
|
5
|
+
func init() {
|
|
6
|
+
gsx.RegisterComponent(TodoCount, nil, "filter")
|
|
7
|
+
gsx.RegisterComponent(TodoList, nil, "page", "filter")
|
|
8
|
+
}
|
_example/main.go
CHANGED
|
@@ -1,46 +1,11 @@
|
|
|
1
1
|
package main
|
|
2
2
|
|
|
3
3
|
import (
|
|
4
|
-
"github.com/gorilla/mux"
|
|
5
4
|
"github.com/pyros2097/gromer"
|
|
6
|
-
gromer_assets "github.com/pyros2097/gromer/assets"
|
|
7
|
-
"github.com/pyros2097/gromer/gsx"
|
|
8
|
-
"github.com/rs/zerolog/log"
|
|
9
|
-
"gocloud.dev/server"
|
|
10
|
-
|
|
11
|
-
"github.com/pyros2097/gromer/_example/assets"
|
|
12
|
-
"github.com/pyros2097/gromer/_example/components"
|
|
5
|
+
_ "github.com/pyros2097/gromer/_example/components"
|
|
13
|
-
"github.com/pyros2097/gromer/_example/containers"
|
|
14
|
-
"github.com/pyros2097/gromer/_example/routes"
|
|
6
|
+
_ "github.com/pyros2097/gromer/_example/routes"
|
|
15
7
|
)
|
|
16
8
|
|
|
17
|
-
func init() {
|
|
18
|
-
gsx.RegisterComponent(components.Todo, components.TodoStyles, "todo")
|
|
19
|
-
gsx.RegisterComponent(components.Status, components.StatusStyles, "status", "error")
|
|
20
|
-
gsx.RegisterComponent(containers.TodoCount, nil, "filter")
|
|
21
|
-
gsx.RegisterComponent(containers.TodoList, nil, "page", "filter")
|
|
22
|
-
}
|
|
23
|
-
|
|
24
9
|
func main() {
|
|
25
|
-
baseRouter := mux.NewRouter()
|
|
26
|
-
baseRouter.Use(gromer.LogMiddleware)
|
|
27
|
-
gromer.RegisterStatusHandler(baseRouter, components.Status)
|
|
28
|
-
|
|
29
|
-
staticRouter := baseRouter.NewRoute().Subrouter()
|
|
30
|
-
staticRouter.Use(gromer.CacheMiddleware)
|
|
31
|
-
staticRouter.Use(gromer.CompressMiddleware)
|
|
32
|
-
gromer.StaticRoute(staticRouter, "/gromer/", gromer_assets.FS)
|
|
33
|
-
gromer.StaticRoute(staticRouter, "/assets/", assets.FS)
|
|
34
|
-
gromer.IconsRoute(staticRouter, "/icons/", assets.FS)
|
|
35
|
-
gromer.ComponentStylesRoute(staticRouter, "/components.css")
|
|
36
|
-
|
|
37
|
-
pageRouter := baseRouter.NewRoute().Subrouter()
|
|
38
|
-
gromer.PageRoute(pageRouter, "/", routes.TodosPage, routes.TodosAction)
|
|
39
|
-
gromer.PageRoute(pageRouter, "/about", routes.AboutPage, nil)
|
|
40
|
-
|
|
41
|
-
log.Info().Msg("http server listening on http://localhost:3000")
|
|
42
|
-
srv := server.New(baseRouter, nil)
|
|
43
|
-
|
|
10
|
+
gromer.Run("3000")
|
|
44
|
-
log.Fatal().Stack().Err(err).Msg("failed to listen")
|
|
45
|
-
}
|
|
46
11
|
}
|
_example/makefile
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
setup:
|
|
2
2
|
go install github.com/mitranim/gow@latest
|
|
3
|
-
go
|
|
3
|
+
go run github.com/playwright-community/playwright-go/cmd/playwright install --with-deps
|
|
4
|
-
playwright install --with-deps
|
|
5
4
|
|
|
6
5
|
dev:
|
|
7
6
|
gow run main.go
|
_example/readme.md
CHANGED
|
@@ -11,7 +11,6 @@ This example demonstrates gromer with a simple todo web app.
|
|
|
11
11
|
|
|
12
12
|
```sh
|
|
13
13
|
make setup
|
|
14
|
-
make update
|
|
15
14
|
make dev
|
|
16
15
|
make build
|
|
17
16
|
make run
|
_example/routes/init.go
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
package routes
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"github.com/pyros2097/gromer"
|
|
5
|
+
"github.com/pyros2097/gromer/_example/components"
|
|
6
|
+
"github.com/pyros2097/gromer/assets"
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
func init() {
|
|
10
|
+
gromer.Init(components.Status, assets.FS)
|
|
11
|
+
gromer.PageRoute("/", TodosPage, TodosAction)
|
|
12
|
+
gromer.PageRoute("/about", AboutPage, nil)
|
|
13
|
+
}
|
_example/tests/todos_test.go
CHANGED
|
@@ -1,47 +1,78 @@
|
|
|
1
1
|
package tests
|
|
2
2
|
|
|
3
3
|
import (
|
|
4
|
-
"
|
|
4
|
+
"net/http/httptest"
|
|
5
5
|
"testing"
|
|
6
6
|
|
|
7
7
|
"github.com/playwright-community/playwright-go"
|
|
8
|
+
"github.com/pyros2097/gromer"
|
|
9
|
+
_ "github.com/pyros2097/gromer/_example/routes"
|
|
10
|
+
"github.com/stretchr/testify/require"
|
|
8
11
|
)
|
|
9
12
|
|
|
10
|
-
func
|
|
13
|
+
func setup(t *testing.T) (*require.Assertions, playwright.Page, func()) {
|
|
14
|
+
r := require.New(t)
|
|
15
|
+
server := httptest.NewServer(gromer.GetRouter())
|
|
11
16
|
pw, err := playwright.Run()
|
|
12
|
-
|
|
17
|
+
r.NoError(err)
|
|
13
|
-
|
|
18
|
+
browser, err := pw.Chromium.Launch(playwright.BrowserTypeLaunchOptions{
|
|
19
|
+
Headless: playwright.Bool(true),
|
|
14
|
-
}
|
|
20
|
+
})
|
|
15
|
-
browser, err := pw.Chromium.Launch()
|
|
16
|
-
|
|
21
|
+
r.NoError(err)
|
|
17
|
-
t.Fatalf("could not launch browser: %v", err)
|
|
18
|
-
}
|
|
19
22
|
page, err := browser.NewPage()
|
|
23
|
+
r.NoError(err)
|
|
24
|
+
_, err = page.Goto(server.URL)
|
|
25
|
+
r.NoError(err)
|
|
26
|
+
return r, page, func() {
|
|
27
|
+
server.Close()
|
|
28
|
+
err = browser.Close()
|
|
29
|
+
r.NoError(err)
|
|
20
|
-
|
|
30
|
+
err = pw.Stop()
|
|
21
|
-
|
|
31
|
+
r.NoError(err)
|
|
22
32
|
}
|
|
23
|
-
if _, err = page.Goto("https://news.ycombinator.com"); err != nil {
|
|
24
|
-
t.Fatalf("could not goto: %v", err)
|
|
25
|
-
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
func checkAttr(r *require.Assertions, el playwright.ElementHandle, exp string) {
|
|
26
|
-
|
|
36
|
+
src, err := el.GetAttribute("src")
|
|
37
|
+
r.NoError(err)
|
|
38
|
+
r.Equal(exp, src)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
func getEl(el playwright.ElementHandle, s string) playwright.ElementHandle {
|
|
42
|
+
v, err := el.QuerySelector(s)
|
|
27
43
|
if err != nil {
|
|
28
|
-
t.Fatalf("could not get entries: %v", err)
|
|
29
|
-
}
|
|
30
|
-
for i, entry := range entries {
|
|
31
|
-
titleElement, err := entry.QuerySelector("td.title > a")
|
|
32
|
-
|
|
44
|
+
panic(err)
|
|
33
|
-
t.Fatalf("could not get title element: %v", err)
|
|
34
|
-
}
|
|
35
|
-
title, err := titleElement.TextContent()
|
|
36
|
-
if err != nil {
|
|
37
|
-
t.Fatalf("could not get text content: %v", err)
|
|
38
|
-
}
|
|
39
|
-
fmt.Printf("%d: %s\n", i+1, title)
|
|
40
|
-
}
|
|
41
|
-
if err = browser.Close(); err != nil {
|
|
42
|
-
t.Fatalf("could not close browser: %v", err)
|
|
43
|
-
}
|
|
44
|
-
if err = pw.Stop(); err != nil {
|
|
45
|
-
t.Fatalf("could not stop Playwright: %v", err)
|
|
46
45
|
}
|
|
46
|
+
return v
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
func TestTodoPage(t *testing.T) {
|
|
50
|
+
r, page, close := setup(t)
|
|
51
|
+
defer close()
|
|
52
|
+
el, err := page.QuerySelector(".title")
|
|
53
|
+
r.NoError(err)
|
|
54
|
+
title, err := el.TextContent()
|
|
55
|
+
r.NoError(err)
|
|
56
|
+
r.Contains(title, "todos")
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
func TestAddTodo(t *testing.T) {
|
|
60
|
+
r, page, close := setup(t)
|
|
61
|
+
defer close()
|
|
62
|
+
page.Type("#text", "First Todo")
|
|
63
|
+
page.Keyboard().Down("Enter")
|
|
64
|
+
els, err := page.QuerySelectorAll(".Todo")
|
|
65
|
+
r.NoError(err)
|
|
66
|
+
r.Len(els, 1)
|
|
67
|
+
todo := els[0]
|
|
68
|
+
title, err := todo.TextContent()
|
|
69
|
+
r.NoError(err)
|
|
70
|
+
r.Contains(title, "First Todo")
|
|
71
|
+
img, err := todo.QuerySelector("img")
|
|
72
|
+
r.NoError(err)
|
|
73
|
+
checkAttr(r, img, "/icons/unchecked.svg?fill=gray-400")
|
|
74
|
+
getEl(todo, ".button-1").Click()
|
|
75
|
+
els, err = page.QuerySelectorAll(".Todo")
|
|
76
|
+
r.NoError(err)
|
|
77
|
+
checkAttr(r, getEl(els[0], "img"), "/icons/checked.svg?fill=green-500")
|
|
47
78
|
}
|
assets/assets.go
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
package
|
|
1
|
+
package assets
|
|
2
2
|
|
|
3
3
|
import (
|
|
4
4
|
"embed"
|
go.mod
CHANGED
|
@@ -4,10 +4,8 @@ go 1.18
|
|
|
4
4
|
|
|
5
5
|
require (
|
|
6
6
|
github.com/alecthomas/participle/v2 v2.0.0-beta.3
|
|
7
|
-
github.com/alecthomas/repr v0.1.0
|
|
8
7
|
github.com/felixge/httpsnoop v1.0.1
|
|
9
8
|
github.com/go-playground/validator/v10 v10.9.0
|
|
10
|
-
github.com/gobuffalo/velvet v0.0.0-20170320144106-d97471bf5d8f
|
|
11
9
|
github.com/goneric/stack v0.0.0-20220131052059-5990ae324dbd
|
|
12
10
|
github.com/google/uuid v1.3.0
|
|
13
11
|
github.com/gorilla/handlers v1.5.1
|
|
@@ -19,49 +17,40 @@ require (
|
|
|
19
17
|
github.com/segmentio/go-camelcase v0.0.0-20160726192923-7085f1e3c734
|
|
20
18
|
github.com/stretchr/testify v1.7.0
|
|
21
19
|
gocloud.dev v0.24.0
|
|
22
|
-
golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57
|
|
23
20
|
xojoc.pw/useragent v0.0.0-20200116211053-1ec61d55e8fe
|
|
24
21
|
)
|
|
25
22
|
|
|
26
23
|
require (
|
|
27
24
|
cloud.google.com/go v0.94.0 // indirect
|
|
28
25
|
cloud.google.com/go/firestore v1.5.0 // indirect
|
|
29
|
-
github.com/aymerick/douceur v0.2.0 // indirect
|
|
30
|
-
github.com/aymerick/raymond v2.0.2+incompatible // indirect
|
|
31
26
|
github.com/blang/semver v3.5.1+incompatible // indirect
|
|
27
|
+
github.com/chromedp/cdproto v0.0.0-20220515234810-83d799542a04 // indirect
|
|
28
|
+
github.com/chromedp/chromedp v0.8.2 // indirect
|
|
29
|
+
github.com/chromedp/sysutil v1.0.0 // indirect
|
|
30
|
+
github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 // indirect
|
|
32
31
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
|
33
32
|
github.com/go-playground/locales v0.14.0 // indirect
|
|
34
33
|
github.com/go-playground/universal-translator v0.18.0 // indirect
|
|
34
|
+
github.com/go-stack/stack v1.8.1 // indirect
|
|
35
|
+
github.com/gobwas/httphead v0.1.0 // indirect
|
|
36
|
+
github.com/gobwas/pool v0.2.1 // indirect
|
|
35
|
-
github.com/
|
|
37
|
+
github.com/gobwas/ws v1.1.0 // indirect
|
|
36
38
|
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
|
37
39
|
github.com/golang/protobuf v1.5.2 // indirect
|
|
38
40
|
github.com/google/go-cmp v0.5.6 // indirect
|
|
39
41
|
github.com/google/wire v0.5.0 // indirect
|
|
40
42
|
github.com/googleapis/gax-go/v2 v2.1.0 // indirect
|
|
41
|
-
github.com/gorilla/css v1.0.0 // indirect
|
|
42
|
-
github.com/
|
|
43
|
+
github.com/josharian/intern v1.0.0 // indirect
|
|
43
44
|
github.com/leodido/go-urn v1.2.1 // indirect
|
|
44
|
-
github.com/markbates/inflect v1.0.4 // indirect
|
|
45
|
-
github.com/microcosm-cc/bluemonday v1.0.18 // indirect
|
|
46
|
-
github.com/
|
|
45
|
+
github.com/mailru/easyjson v0.7.7 // indirect
|
|
46
|
+
github.com/playwright-community/playwright-go v0.2000.1 // indirect
|
|
47
47
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
|
48
|
-
github.com/russross/blackfriday v1.5.2 // indirect
|
|
49
|
-
github.com/sergi/go-diff v1.2.0 // indirect
|
|
50
|
-
github.com/shurcooL/github_flavored_markdown v0.0.0-20210228213109-c3a9aa474629 // indirect
|
|
51
|
-
github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636 // indirect
|
|
52
|
-
github.com/shurcooL/go-goon v1.0.0 // indirect
|
|
53
|
-
github.com/shurcooL/highlight_diff v0.0.0-20181222201841-111da2e7d480 // indirect
|
|
54
|
-
github.com/shurcooL/highlight_go v0.0.0-20191220051317-782971ddf21b // indirect
|
|
55
|
-
github.com/shurcooL/octicon v0.0.0-20191102190552-cbb32d6a785c // indirect
|
|
56
|
-
github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect
|
|
57
|
-
github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d // indirect
|
|
58
|
-
github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e // indirect
|
|
59
48
|
go.opencensus.io v0.23.0 // indirect
|
|
60
49
|
golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e // indirect
|
|
61
50
|
golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 // indirect
|
|
62
51
|
golang.org/x/net v0.0.0-20211216030914-fe4d6282115f // indirect
|
|
63
52
|
golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f // indirect
|
|
64
|
-
golang.org/x/sys v0.0.0-
|
|
53
|
+
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect
|
|
65
54
|
golang.org/x/text v0.3.7 // indirect
|
|
66
55
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
|
|
67
56
|
google.golang.org/api v0.56.0 // indirect
|
|
@@ -69,5 +58,6 @@ require (
|
|
|
69
58
|
google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2 // indirect
|
|
70
59
|
google.golang.org/grpc v1.40.0 // indirect
|
|
71
60
|
google.golang.org/protobuf v1.27.1 // indirect
|
|
61
|
+
gopkg.in/square/go-jose.v2 v2.6.0 // indirect
|
|
72
62
|
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
|
|
73
63
|
)
|
go.sum
CHANGED
|
@@ -103,7 +103,6 @@ github.com/alecthomas/assert/v2 v2.0.3 h1:WKqJODfOiQG0nEJKFKzDIG3E29CN2/4zR9XGJz
|
|
|
103
103
|
github.com/alecthomas/participle/v2 v2.0.0-beta.3 h1:9HnyNuDsqOG8sl63Dz+KubqHhU8aWqsrjKdecim8GW0=
|
|
104
104
|
github.com/alecthomas/participle/v2 v2.0.0-beta.3/go.mod h1:RC764t6n4L8D8ITAJv0qdokritYSNR3wV5cVwmIEaMM=
|
|
105
105
|
github.com/alecthomas/repr v0.1.0 h1:ENn2e1+J3k09gyj2shc0dHr/yjaWSHRlrJ4DPMevDqE=
|
|
106
|
-
github.com/alecthomas/repr v0.1.0/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8=
|
|
107
106
|
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
|
108
107
|
github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0=
|
|
109
108
|
github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
|
|
@@ -130,16 +129,18 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.7.0 h1:1at4e5P+lvHNl2nUktdM2/v+rpICg
|
|
|
130
129
|
github.com/aws/aws-sdk-go-v2/service/sts v1.7.0/go.mod h1:0qcSMCyASQPN2sk/1KQLQ2Fh6yq8wm0HSDAimPhzCoM=
|
|
131
130
|
github.com/aws/smithy-go v1.8.0 h1:AEwwwXQZtUwP5Mz506FeXXrKBe0jA8gVM+1gEcSRooc=
|
|
132
131
|
github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E=
|
|
133
|
-
github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
|
|
134
|
-
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
|
|
135
|
-
github.com/aymerick/raymond v2.0.2+incompatible h1:VEp3GpgdAnv9B2GFyTvqgcKvY+mfKMjPOA3SbKLtnU0=
|
|
136
|
-
github.com/aymerick/raymond v2.0.2+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g=
|
|
137
132
|
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
|
138
133
|
github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
|
|
139
134
|
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
|
|
140
135
|
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
|
141
136
|
github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
|
142
137
|
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
|
138
|
+
github.com/chromedp/cdproto v0.0.0-20220515234810-83d799542a04 h1:8GLetRp0N/g2MVzUmFRBXgLJTPofYAdTyWNR2lC0EQM=
|
|
139
|
+
github.com/chromedp/cdproto v0.0.0-20220515234810-83d799542a04/go.mod h1:5Y4sD/eXpwrChIuxhSr/G20n9CdbCmoerOHnuAf0Zr0=
|
|
140
|
+
github.com/chromedp/chromedp v0.8.2 h1:EYSsSqWuKYwyHZEJpU00kOGOMz5DE0qDVckelzauMFA=
|
|
141
|
+
github.com/chromedp/chromedp v0.8.2/go.mod h1:vpbCNtfYeOUo2q5reuwX6ZmPpbHRf5PZfAqNR2ObB+g=
|
|
142
|
+
github.com/chromedp/sysutil v1.0.0 h1:+ZxhTpfpZlmchB58ih/LBHX52ky7w2VhQVKQMucy3Ic=
|
|
143
|
+
github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww=
|
|
143
144
|
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
|
144
145
|
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
|
145
146
|
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
|
@@ -150,6 +151,8 @@ github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnht
|
|
|
150
151
|
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
|
151
152
|
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
|
152
153
|
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
|
154
|
+
github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ=
|
|
155
|
+
github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk=
|
|
153
156
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
|
154
157
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
|
155
158
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
|
@@ -190,13 +193,17 @@ github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GO
|
|
|
190
193
|
github.com/go-playground/validator/v10 v10.9.0 h1:NgTtmN58D0m8+UuxtYmGztBJB7VnPgjj221I1QHci2A=
|
|
191
194
|
github.com/go-playground/validator/v10 v10.9.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos=
|
|
192
195
|
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
|
193
|
-
github.com/
|
|
196
|
+
github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw=
|
|
194
|
-
github.com/
|
|
197
|
+
github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4=
|
|
195
|
-
github.com/gobuffalo/velvet v0.0.0-20170320144106-d97471bf5d8f h1:ddIdPdlkAgKMB0mbkft2LT3oxN1h3MN1fopCFrOgkhY=
|
|
196
|
-
github.com/gobuffalo/velvet v0.0.0-20170320144106-d97471bf5d8f/go.mod h1:m9x1vDSQYrGiEhEiu0c4XuE0SZzw31Ms8ULjGdhaA54=
|
|
197
198
|
github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo=
|
|
199
|
+
github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU=
|
|
200
|
+
github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM=
|
|
198
201
|
github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
|
|
202
|
+
github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og=
|
|
203
|
+
github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
|
|
199
204
|
github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM=
|
|
205
|
+
github.com/gobwas/ws v1.1.0 h1:7RFti/xnNkMJnrK7D1yQ/iCIB5OrrY/54/H930kIbHA=
|
|
206
|
+
github.com/gobwas/ws v1.1.0/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL0=
|
|
200
207
|
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
|
|
201
208
|
github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
|
|
202
209
|
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
|
|
@@ -291,14 +298,14 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+
|
|
|
291
298
|
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
|
292
299
|
github.com/googleapis/gax-go/v2 v2.1.0 h1:6DWmvNpomjL1+3liNSZbVns3zsYzzCjm6pRBO1tLeso=
|
|
293
300
|
github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
|
|
294
|
-
github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY=
|
|
295
|
-
github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c=
|
|
296
301
|
github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=
|
|
297
302
|
github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q=
|
|
298
303
|
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
|
|
299
304
|
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
|
|
300
305
|
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
|
306
|
+
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
|
301
307
|
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
|
308
|
+
github.com/h2non/filetype v1.1.1/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY=
|
|
302
309
|
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
|
303
310
|
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
|
304
311
|
github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
|
|
@@ -310,8 +317,9 @@ github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht
|
|
|
310
317
|
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
|
|
311
318
|
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
|
|
312
319
|
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
|
|
313
|
-
github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc=
|
|
314
320
|
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
|
|
321
|
+
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
|
|
322
|
+
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
|
|
315
323
|
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
|
316
324
|
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
|
317
325
|
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
|
|
@@ -330,13 +338,11 @@ github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgx
|
|
|
330
338
|
github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
|
|
331
339
|
github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
|
|
332
340
|
github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
|
333
|
-
github.com/
|
|
341
|
+
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
|
|
334
|
-
github.com/
|
|
342
|
+
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
|
335
343
|
github.com/mattn/go-ieproxy v0.0.1 h1:qiyop7gCflfhwCzGyeT0gro3sF9AIg9HU98JORTkqfI=
|
|
336
344
|
github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E=
|
|
337
345
|
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
|
|
338
|
-
github.com/microcosm-cc/bluemonday v1.0.18 h1:6HcxvXDAi3ARt3slx6nTesbvorIc3QeTzBNRvWktHBo=
|
|
339
|
-
github.com/microcosm-cc/bluemonday v1.0.18/go.mod h1:Z0r70sCuXHig8YpBzCc5eGHAap2K7e/u082ZUpDRRqM=
|
|
340
346
|
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
|
341
347
|
github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
|
342
348
|
github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
|
@@ -344,8 +350,9 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ
|
|
|
344
350
|
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
|
345
351
|
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
|
|
346
352
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
|
347
|
-
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
|
348
353
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
|
354
|
+
github.com/playwright-community/playwright-go v0.2000.1 h1:2JViSHpJQ/UL/PO1Gg6gXV5IcXAAsoBJ3KG9L3wKXto=
|
|
355
|
+
github.com/playwright-community/playwright-go v0.2000.1/go.mod h1:1y9cM9b9dVHnuRWzED1KLM7FtbwTJC8ibDjI6MNqewU=
|
|
349
356
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
|
350
357
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
|
351
358
|
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
|
@@ -359,36 +366,13 @@ github.com/rotisserie/eris v0.5.4/go.mod h1:Z/kgYTJiJtocxCbFfvRmO+QejApzG6zpyky9
|
|
|
359
366
|
github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
|
|
360
367
|
github.com/rs/zerolog v1.26.1 h1:/ihwxqH+4z8UxyI70wM1z9yCvkWcfz/a3mj48k/Zngc=
|
|
361
368
|
github.com/rs/zerolog v1.26.1/go.mod h1:/wSSJWX7lVrsOwlbyTRSOJvqRlc+WjWlfes+CiJ+tmc=
|
|
362
|
-
github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo=
|
|
363
|
-
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
|
|
364
369
|
github.com/samber/lo v1.21.0 h1:FSby8pJQtX4KmyddTCCGhc3JvnnIVrDA+NW37rG+7G8=
|
|
365
370
|
github.com/samber/lo v1.21.0/go.mod h1:2I7tgIv8Q1SG2xEIkRq0F2i2zgxVpnyPOP0d3Gj2r+A=
|
|
366
371
|
github.com/segmentio/go-camelcase v0.0.0-20160726192923-7085f1e3c734 h1:Cpx2WLIv6fuPvaJAHNhYOgYzk/8RcJXu/8+mOrxf2KM=
|
|
367
372
|
github.com/segmentio/go-camelcase v0.0.0-20160726192923-7085f1e3c734/go.mod h1:hqVOMAwu+ekffC3Tvq5N1ljnXRrFKcaSjbCmQ8JgYaI=
|
|
368
|
-
github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ=
|
|
369
|
-
github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
|
|
370
|
-
github.com/shurcooL/github_flavored_markdown v0.0.0-20210228213109-c3a9aa474629 h1:86e54L0i3pH3dAIA8OxBbfLrVyhoGpnNk1iJCigAWYs=
|
|
371
|
-
github.com/shurcooL/github_flavored_markdown v0.0.0-20210228213109-c3a9aa474629/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0=
|
|
372
|
-
github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636 h1:aSISeOcal5irEhJd1M+IrApc0PdcN7e7Aj4yuEnOrfQ=
|
|
373
|
-
github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
|
|
374
|
-
github.com/shurcooL/go-goon v1.0.0 h1:BCQPvxGkHHJ4WpBO4m/9FXbITVIsvAm/T66cCcCGI7E=
|
|
375
|
-
github.com/shurcooL/go-goon v1.0.0/go.mod h1:2wTHMsGo7qnpmqA8ADYZtP4I1DD94JpXGQ3Dxq2YQ5w=
|
|
376
|
-
github.com/shurcooL/highlight_diff v0.0.0-20181222201841-111da2e7d480 h1:KaKXZldeYH73dpQL+Nr38j1r5BgpAYQjYvENOUpIZDQ=
|
|
377
|
-
github.com/shurcooL/highlight_diff v0.0.0-20181222201841-111da2e7d480/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU=
|
|
378
|
-
github.com/shurcooL/highlight_go v0.0.0-20191220051317-782971ddf21b h1:rBIwpb5ggtqf0uZZY5BPs1sL7njUMM7I8qD2jiou70E=
|
|
379
|
-
github.com/shurcooL/highlight_go v0.0.0-20191220051317-782971ddf21b/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag=
|
|
380
|
-
github.com/shurcooL/octicon v0.0.0-20191102190552-cbb32d6a785c h1:p3w+lTqXulfa3aDeycxmcLJDNxyUB89gf2/XqqK3eO0=
|
|
381
|
-
github.com/shurcooL/octicon v0.0.0-20191102190552-cbb32d6a785c/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ=
|
|
382
|
-
github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
|
|
383
|
-
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
|
|
384
|
-
github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d h1:yKm7XZV6j9Ev6lojP2XaIshpT4ymkqhMeSghO5Ps00E=
|
|
385
|
-
github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE=
|
|
386
|
-
github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e h1:qpG93cPwA5f7s/ZPBJnGOYQNK/vKsaDaseuKT5Asee8=
|
|
387
|
-
github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA=
|
|
388
373
|
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
|
389
374
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
|
390
375
|
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
|
|
391
|
-
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
|
392
376
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
|
393
377
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
|
394
378
|
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
|
@@ -475,8 +459,6 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
|
|
475
459
|
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
|
476
460
|
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
|
477
461
|
golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
|
|
478
|
-
golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57 h1:LQmS1nU0twXLA96Kt7U9qtHJEbBk3z6Q0V4UXjZkpr4=
|
|
479
|
-
golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
|
|
480
462
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
481
463
|
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
482
464
|
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
|
@@ -581,6 +563,7 @@ golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7w
|
|
|
581
563
|
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
582
564
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
583
565
|
golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
566
|
+
golang.org/x/sys v0.0.0-20201207223542-d4d67f95c62d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
584
567
|
golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
585
568
|
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
586
569
|
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
@@ -604,6 +587,8 @@ golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBc
|
|
|
604
587
|
golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
605
588
|
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 h1:id054HUawV2/6IGm2IV8KZQjqtwAOo2CYlOToYqa0d0=
|
|
606
589
|
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
590
|
+
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k=
|
|
591
|
+
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
607
592
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
|
608
593
|
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
|
609
594
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
|
@@ -823,13 +808,13 @@ google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+Rur
|
|
|
823
808
|
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
|
824
809
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
|
825
810
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
|
826
|
-
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
|
827
811
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
|
828
812
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
|
829
813
|
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
|
814
|
+
gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI=
|
|
815
|
+
gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
|
|
830
816
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
831
817
|
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
832
|
-
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
833
818
|
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|
834
819
|
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
|
|
835
820
|
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
http.go
CHANGED
|
@@ -23,11 +23,13 @@ import (
|
|
|
23
23
|
"github.com/google/uuid"
|
|
24
24
|
"github.com/gorilla/handlers"
|
|
25
25
|
"github.com/gorilla/mux"
|
|
26
|
+
"github.com/pyros2097/gromer/assets"
|
|
26
27
|
"github.com/pyros2097/gromer/gsx"
|
|
27
28
|
"github.com/rotisserie/eris"
|
|
28
29
|
"github.com/rs/zerolog"
|
|
29
30
|
"github.com/rs/zerolog/log"
|
|
30
31
|
"github.com/segmentio/go-camelcase"
|
|
32
|
+
"gocloud.dev/server"
|
|
31
33
|
"xojoc.pw/useragent"
|
|
32
34
|
)
|
|
33
35
|
|
|
@@ -36,6 +38,8 @@ var (
|
|
|
36
38
|
IsCloundRun bool
|
|
37
39
|
pathParamsRegex = regexp.MustCompile(`{(.*?)}`)
|
|
38
40
|
globalStatusComponent StatusComponent = nil
|
|
41
|
+
baseRouter = &mux.Router{}
|
|
42
|
+
pageRouter = &mux.Router{}
|
|
39
43
|
)
|
|
40
44
|
|
|
41
45
|
type StatusComponent func(c *gsx.Context, status int, err error) []*gsx.Tag
|
|
@@ -334,8 +338,8 @@ func RegisterStatusHandler(router *mux.Router, comp StatusComponent) {
|
|
|
334
338
|
})
|
|
335
339
|
}
|
|
336
340
|
|
|
337
|
-
func PageRoute(
|
|
341
|
+
func PageRoute(route string, page, action interface{}) {
|
|
338
|
-
|
|
342
|
+
pageRouter.HandleFunc(route, func(w http.ResponseWriter, r *http.Request) {
|
|
339
343
|
c := createCtx(r, route)
|
|
340
344
|
if r.Method == "GET" {
|
|
341
345
|
PerformRequest(route, page, c, w, r, false)
|
|
@@ -388,3 +392,30 @@ func GetComponentsStylesUrl() string {
|
|
|
388
392
|
})
|
|
389
393
|
return fmt.Sprintf("/components.css?hash=%s", sum)
|
|
390
394
|
}
|
|
395
|
+
|
|
396
|
+
func Init(status StatusComponent, appAssets embed.FS) {
|
|
397
|
+
baseRouter = mux.NewRouter()
|
|
398
|
+
baseRouter.Use(LogMiddleware)
|
|
399
|
+
RegisterStatusHandler(baseRouter, status)
|
|
400
|
+
|
|
401
|
+
staticRouter := baseRouter.NewRoute().Subrouter()
|
|
402
|
+
staticRouter.Use(CacheMiddleware)
|
|
403
|
+
staticRouter.Use(CompressMiddleware)
|
|
404
|
+
StaticRoute(staticRouter, "/gromer/", assets.FS)
|
|
405
|
+
StaticRoute(staticRouter, "/assets/", appAssets)
|
|
406
|
+
IconsRoute(staticRouter, "/icons/", appAssets)
|
|
407
|
+
ComponentStylesRoute(staticRouter, "/components.css")
|
|
408
|
+
pageRouter = baseRouter.NewRoute().Subrouter()
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
func GetRouter() *mux.Router {
|
|
412
|
+
return baseRouter
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
func Run(port string) {
|
|
416
|
+
log.Info().Msg("http server listening on http://localhost:" + port)
|
|
417
|
+
srv := server.New(baseRouter, nil)
|
|
418
|
+
if err := srv.ListenAndServe(":" + port); err != nil {
|
|
419
|
+
log.Fatal().Stack().Err(err).Msg("failed to listen")
|
|
420
|
+
}
|
|
421
|
+
}
|