~repos /gromer

#golang#htmx#ssr

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 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
- if err := srv.ListenAndServe(":3000"); err != nil {
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 install github.com/playwright-community/playwright-go/cmd/playwright@latest
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
- "fmt"
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 TestTodo(t *testing.T) {
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
- if err != nil {
17
+ r.NoError(err)
13
- t.Fatalf("could not start playwright: %v", err)
18
+ browser, err := pw.Chromium.Launch(playwright.BrowserTypeLaunchOptions{
19
+ Headless: playwright.Bool(true),
14
- }
20
+ })
15
- browser, err := pw.Chromium.Launch()
16
- if err != nil {
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
- if err != nil {
30
+ err = pw.Stop()
21
- t.Fatalf("could not create page: %v", err)
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
- entries, err := page.QuerySelectorAll(".athing")
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
- if err != nil {
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 gromer_assets
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/gobuffalo/envy v1.6.5 // indirect
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/joho/godotenv v1.3.0 // indirect
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/pkg/errors v0.9.1 // indirect
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-20211019181941-9d821ace8654 // indirect
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/gobuffalo/envy v1.6.5 h1:X3is06x7v0nW2xiy2yFbbIjwHz57CD6z6MkvqULTCm8=
196
+ github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw=
194
- github.com/gobuffalo/envy v1.6.5/go.mod h1:N+GkhhZ/93bGZc6ZKhJLP6+m+tCNPKwgSpH9kaifseQ=
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/markbates/inflect v1.0.4 h1:5fh1gzTFhfae06u3hzHYO9xe3l3v3nW5Pwt3naLTP5g=
341
+ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
334
- github.com/markbates/inflect v1.0.4/go.mod h1:1fR9+pO2KHEO9ZRtto13gDwwZaAKstQzferVeWqbgNs=
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(router *mux.Router, route string, page, action interface{}) {
341
+ func PageRoute(route string, page, action interface{}) {
338
- router.HandleFunc(route, func(w http.ResponseWriter, r *http.Request) {
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
+ }