From a4afc1837d58296eacb5baff5e7bb759fdc1afed Mon Sep 17 00:00:00 2001 From: gotoeasy Date: Thu, 30 Jun 2022 19:42:12 +0800 Subject: [PATCH] =?UTF-8?q?Web=E5=89=8D=E7=AB=AF=E6=A3=80=E7=B4=A2?= =?UTF-8?q?=EF=BC=8C=E9=80=82=E5=BD=93=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 + glc/cmn/cmn.go | 38 + glc/gweb/http_request.go | 24 + glc/gweb/http_server.go | 22 +- glc/ldb/conf/config.go | 18 +- glc/ldb/engine.go | 4 +- glc/ldb/engine_test.go | 11 +- glc/ldb/storage/logdata_storage.go | 2 +- glc/ldb/storage/logdata_storage_handle.go | 4 +- glc/ldb/tokenizer/tokenizer.go | 2 +- glc/main.go | 7 +- glc/onstart/onstart.go | 40 + glc/web/filter/filter.go | 21 - glc/web/router/register.go | 28 - glc/www/controller/admin_controller.go | 12 + .../controller/log_add_controller.go | 4 +- .../controller/log_search_controller.go | 13 +- glc/www/filter/filter.go | 39 + glc/www/html/static_file_handle.go | 66 ++ glc/www/web/index.html | 75 ++ glc/www/web/package.json | 24 + glc/www/web/public/favicon.ico | Bin 0 -> 125342 bytes glc/www/web/public/glc.png | Bin 0 -> 14055 bytes glc/www/web/public/title.png | Bin 0 -> 3616 bytes glc/www/web/src/App.vue | 67 ++ glc/www/web/src/api.js | 50 ++ glc/www/web/src/components/Icon.vue | 24 + glc/www/web/src/components/Menu.vue | 84 +++ glc/www/web/src/main.js | 20 + glc/www/web/src/menus.js | 13 + glc/www/web/src/router.js | 10 + glc/www/web/src/views/dashboard.vue | 177 +++++ glc/www/web/vite.config.js | 8 + glc/www/web/yarn.lock | 691 ++++++++++++++++++ glc/www/web_embed.go | 8 + 35 files changed, 1523 insertions(+), 86 deletions(-) create mode 100644 glc/onstart/onstart.go delete mode 100644 glc/web/filter/filter.go delete mode 100644 glc/web/router/register.go create mode 100644 glc/www/controller/admin_controller.go rename glc/{web => www}/controller/log_add_controller.go (71%) rename glc/{web => www}/controller/log_search_controller.go (64%) create mode 100644 glc/www/filter/filter.go create mode 100644 glc/www/html/static_file_handle.go create mode 100644 glc/www/web/index.html create mode 100644 glc/www/web/package.json create mode 100644 glc/www/web/public/favicon.ico create mode 100644 glc/www/web/public/glc.png create mode 100644 glc/www/web/public/title.png create mode 100644 glc/www/web/src/App.vue create mode 100644 glc/www/web/src/api.js create mode 100644 glc/www/web/src/components/Icon.vue create mode 100644 glc/www/web/src/components/Menu.vue create mode 100644 glc/www/web/src/main.js create mode 100644 glc/www/web/src/menus.js create mode 100644 glc/www/web/src/router.js create mode 100644 glc/www/web/src/views/dashboard.vue create mode 100644 glc/www/web/vite.config.js create mode 100644 glc/www/web/yarn.lock create mode 100644 glc/www/web_embed.go diff --git a/.gitignore b/.gitignore index 66fd13c..8fb8747 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,6 @@ # Dependency directories (remove the comment below to include it) # vendor/ + +/**/dist/ +/**/node_modules/ diff --git a/glc/cmn/cmn.go b/glc/cmn/cmn.go index b310db3..b41210d 100644 --- a/glc/cmn/cmn.go +++ b/glc/cmn/cmn.go @@ -145,3 +145,41 @@ func GeyStoreNameByDate(name string) string { } return name } + +func EndwithsRune(str string, endstr string) bool { + + if endstr == "" || str == endstr { + return true + } + + strs := []rune(str) + ends := []rune(endstr) + lens := len(strs) + lene := len(ends) + if lens < lene { + return false + } + + dif := lens - lene + for i := lene - 1; i >= 0; i-- { + if strs[dif+i] != ends[i] { + return false + } + } + + return true +} + +func SubStringRune(str string, start int, end int) string { + srune := []rune(str) + slen := len(srune) + if start >= slen || start >= end || start < 0 { + return "" + } + + rs := "" + for i := start; i < slen && i < end; i++ { + rs += string(srune[i]) + } + return rs +} diff --git a/glc/gweb/http_request.go b/glc/gweb/http_request.go index f600406..e075b64 100644 --- a/glc/gweb/http_request.go +++ b/glc/gweb/http_request.go @@ -32,6 +32,10 @@ func NewHttpRequest(c *gin.Context) *HttpRequest { } } +func (r *HttpRequest) SetHeader(key string, value string) { + r.ginCtx.Header(key, value) +} + func (r *HttpRequest) GetHeader(name string) string { ary := r.mapHead[strings.ToLower(name)] if ary == nil { @@ -59,3 +63,23 @@ func (r *HttpRequest) GetFormParameter(name string) string { func (r *HttpRequest) Redirect(url string) { r.ginCtx.Redirect(http.StatusMovedPermanently, url) } + +func (r *HttpRequest) ResponseData(code int, contentType string, bytes []byte) { + r.ginCtx.Data(code, contentType, bytes) +} + +func (r *HttpRequest) GetMethod() string { + return r.ginCtx.Request.Method +} + +func (r *HttpRequest) AbortWithStatus(code int) { + r.ginCtx.AbortWithStatus(code) +} + +func (r *HttpRequest) RequestURI() string { + return r.ginCtx.Request.RequestURI +} + +func (r *HttpRequest) RequestUrlPath() string { + return r.ginCtx.Request.URL.Path +} diff --git a/glc/gweb/http_server.go b/glc/gweb/http_server.go index 6c61c8a..bc9a4c6 100644 --- a/glc/gweb/http_server.go +++ b/glc/gweb/http_server.go @@ -3,6 +3,7 @@ package gweb import ( "context" "fmt" + "glc/cmn" "glc/ldb/conf" "glc/onexit" "log" @@ -19,6 +20,12 @@ func Run() { ginEngine := gin.Default() + // ginEngine.GET("/assets/*filepath", func(c *gin.Context) { + // staticServer := http.FileServer(http.FS(assets.Static)) + // c.Request.URL = &url.URL{Path: "web/dist" + c.Request.RequestURI} + // staticServer.ServeHTTP(c.Writer, c.Request) + // }) + ginEngine.NoRoute(func(c *gin.Context) { req := NewHttpRequest(c) @@ -32,8 +39,21 @@ func Run() { } } - // controller + // 静态文件 path := strings.ToLower(c.Request.URL.Path) + if cmn.EndwithsRune(path, ".html") { + path = "/**/*.html" + } else if cmn.EndwithsRune(path, ".css") { + path = "/**/*.css" + } else if cmn.EndwithsRune(path, ".js") { + path = "/**/*.js" + } else if cmn.EndwithsRune(path, ".png") { + path = "/**/*.png" + } else if cmn.EndwithsRune(path, ".ico") { + path = "/**/*.ico" + } + + // controller method := strings.ToUpper(c.Request.Method) handle := getHttpController(method, path) if handle == nil { diff --git a/glc/ldb/conf/config.go b/glc/ldb/conf/config.go index 8028e58..b52eb7a 100644 --- a/glc/ldb/conf/config.go +++ b/glc/ldb/conf/config.go @@ -28,15 +28,15 @@ func init() { func UpdateConfigByEnv() { // 读取环境变量初始化配置,各配置都有默认值 - storeRoot = Getenv("GLC_STORE_ROOT", "/glogcenter") // 存储根目录 - storeChanLength = GetenvInt("GLC_STORE_CHAN_LENGTH", 64) // 存储通道长度 - maxIdleTime = GetenvInt("GLC_MAX_IDLE_TIME", 180) // 最大闲置时间(秒),超过闲置时间将自动关闭,0时表示不关闭 - storeNameAutoAddDate = GetenvBool("GLC_STORE_NAME_AUTO_ADD_DATE", true) // 存储名是否自动添加日期(日志量大通常按日单位区分存储),默认true - serverPort = GetenvInt("GLC_SERVER_PORT", 8080) // web服务端口 - contextPath = Getenv("GLC_CONTEXT_PATH", "/glc") // web服务contextPath - enableSecurityKey = GetenvBool("GLC_ENABLE_SECURITY_KEY", false) // web服务是否开启API秘钥校验,默认false - headerSecurityKey = Getenv("GLC_HEADER_SECURITY_KEY", "X-GLC-AUTH") // web服务API秘钥的header键名 - securityKey = Getenv("GLC_SECURITY_KEY", "glogcenter") // web服务API秘钥 + storeRoot = Getenv("GLC_STORE_ROOT", "/glogcenter") // 存储根目录 + storeChanLength = GetenvInt("GLC_STORE_CHAN_LENGTH", 64) // 存储通道长度 + maxIdleTime = GetenvInt("GLC_MAX_IDLE_TIME", 180) // 最大闲置时间(秒),超过闲置时间将自动关闭,0时表示不关闭 + storeNameAutoAddDate = GetenvBool("GLC_STORE_NAME_AUTO_ADD_DATE", false) // 存储名是否自动添加日期(日志量大通常按日单位区分存储),默认true + serverPort = GetenvInt("GLC_SERVER_PORT", 8080) // web服务端口 + contextPath = Getenv("GLC_CONTEXT_PATH", "/glc") // web服务contextPath + enableSecurityKey = GetenvBool("GLC_ENABLE_SECURITY_KEY", false) // web服务是否开启API秘钥校验,默认false + headerSecurityKey = Getenv("GLC_HEADER_SECURITY_KEY", "X-GLC-AUTH") // web服务API秘钥的header键名 + securityKey = Getenv("GLC_SECURITY_KEY", "glogcenter") // web服务API秘钥 } // 取配置: web服务API秘钥的header键名,可通过环境变量“GLC_HEADER_SECURITY_KEY”设定,默认值“X-GLC-AUTH” diff --git a/glc/ldb/engine.go b/glc/ldb/engine.go index 288254a..55935d7 100644 --- a/glc/ldb/engine.go +++ b/glc/ldb/engine.go @@ -34,8 +34,8 @@ func NewDefaultEngine() *Engine { } // 添加日志 -func (e *Engine) AddTextLog(logText string) { - e.logStorage.AddTextLog(logText) +func (e *Engine) AddTextLog(date string, logText string, system string) { + e.logStorage.AddTextLog(date, logText, system) } func (e *Engine) Search(searchKey string, pageSize int, currentDocId uint64, forward bool) *search.SearchResult { diff --git a/glc/ldb/engine_test.go b/glc/ldb/engine_test.go index 7d66bcb..89bb05e 100644 --- a/glc/ldb/engine_test.go +++ b/glc/ldb/engine_test.go @@ -3,16 +3,15 @@ package ldb import ( "log" "testing" - "time" ) func Test_all(t *testing.T) { engine := NewDefaultEngine() - for i := 1; i <= 10000; i++ { - engine.AddTextLog(` java.sql.SQLException: ddduse them aalav`) - } - time.Sleep(time.Duration(5) * time.Second) + // for i := 1; i <= 10000; i++ { + // engine.AddTextLog(` java.sql.SQLException: ddduse them aalav`) + // } + // time.Sleep(time.Duration(5) * time.Second) // for i := 1; i <= 10000; i++ { // engine.AddTextLog(` java.sql.SQLException: them aalav`) @@ -24,7 +23,7 @@ func Test_all(t *testing.T) { // } // time.Sleep(time.Duration(5) * time.Second) - rs := engine.Search(` them java `, 20, 0, true) + rs := engine.Search(` them java ddduse `, 5, 0, true) log.Println("共查到", rs.Total, "件") for _, v := range rs.Data { log.Println(v.Id, v.Text) diff --git a/glc/ldb/storage/logdata_storage.go b/glc/ldb/storage/logdata_storage.go index 21298d5..6117db6 100644 --- a/glc/ldb/storage/logdata_storage.go +++ b/glc/ldb/storage/logdata_storage.go @@ -173,7 +173,7 @@ func createInvertedIndex(s *LogDataStorage) int { idx := NewWordIndexStorage(s.StoreName(), word) idx.Add(cmn.StringToUint64(m.Id, 36, 0)) // 日志ID加入索引 } - log.Println("创建日志索引:", m.Id) + log.Println("创建日志索引:", cmn.StringToUint64(m.Id, 36, 0)) // 保存索引信息 mnt.AddKeyWords(kws) // 关键词信息 diff --git a/glc/ldb/storage/logdata_storage_handle.go b/glc/ldb/storage/logdata_storage_handle.go index 0e405e6..5022276 100644 --- a/glc/ldb/storage/logdata_storage_handle.go +++ b/glc/ldb/storage/logdata_storage_handle.go @@ -41,7 +41,7 @@ func NewLogDataStorageHandle(storeName string) *LogDataStorageHandle { } // 添加日志(参数是普通文本日志) -func (s *LogDataStorageHandle) AddTextLog(logText string) { +func (s *LogDataStorageHandle) AddTextLog(date string, logText string, system string) { txt := strings.TrimSpace(logText) if txt == "" { return @@ -53,6 +53,8 @@ func (s *LogDataStorageHandle) AddTextLog(logText string) { if len(ary) > 1 { d.Detail = txt } + d.Date = date + d.System = system if s.storage.IsClose() { s.storage = NewLogDataStorage(s.storage.storeName, "data") diff --git a/glc/ldb/tokenizer/tokenizer.go b/glc/ldb/tokenizer/tokenizer.go index cca8de2..6286140 100644 --- a/glc/ldb/tokenizer/tokenizer.go +++ b/glc/ldb/tokenizer/tokenizer.go @@ -146,5 +146,5 @@ func GetSearchKey(searchKey string) string { // TODO log.Println("搜索关键词", kws, "优化后搜索", rs) - return rs[0] + return strings.Join(rs, " ") } diff --git a/glc/main.go b/glc/main.go index 4afc70b..91d7d9f 100644 --- a/glc/main.go +++ b/glc/main.go @@ -1,10 +1,7 @@ package main -import ( - "glc/gweb/http" - "glc/web/router" -) +import "glc/onstart" func main() { - http.StartHttpServer(router.Register) + onstart.Run() } diff --git a/glc/onstart/onstart.go b/glc/onstart/onstart.go new file mode 100644 index 0000000..0bdd503 --- /dev/null +++ b/glc/onstart/onstart.go @@ -0,0 +1,40 @@ +package onstart + +import ( + "glc/gweb" + "glc/gweb/http" + "glc/gweb/method" + "glc/ldb/conf" + "glc/www/controller" + "glc/www/filter" + "glc/www/html" +) + +func Run() { + + http.StartHttpServer(func() { + + contextPath := conf.GetContextPath() // ContextPath + + // 过滤器 + gweb.RegisterFilter(filter.ApiKeyFilter) + gweb.RegisterFilter(filter.CrossFilter) + + // 控制器(跳转) + gweb.RegisterController(method.GET, "/", html.RedirectToHomeController) + gweb.RegisterController(method.GET, contextPath, html.RedirectToHomeController) + + // Html静态文件 + gweb.RegisterController(method.GET, contextPath+"/", html.HomeIndexHtmlController) + gweb.RegisterController(method.GET, "/**/*.html", html.StaticFileController) + gweb.RegisterController(method.GET, "/**/*.css", html.StaticFileController) + gweb.RegisterController(method.GET, "/**/*.js", html.StaticFileController) + gweb.RegisterController(method.GET, "/**/*.ico", html.StaticFileController) + gweb.RegisterController(method.GET, "/**/*.png", html.StaticFileController) + + // 控制器 + gweb.RegisterController(method.POST, contextPath+"/search", controller.LogSearchController) + gweb.RegisterController(method.POST, contextPath+"/add", controller.LogAddController) + + }) +} diff --git a/glc/web/filter/filter.go b/glc/web/filter/filter.go deleted file mode 100644 index 6e2c0cf..0000000 --- a/glc/web/filter/filter.go +++ /dev/null @@ -1,21 +0,0 @@ -package filter - -import ( - "glc/gweb" - "glc/ldb/conf" -) - -// 校验HEADER的API秘钥 -func ApiKeyFilter(req *gweb.HttpRequest) *gweb.HttpResult { - - // 开启API秘钥校验时才检查 - if !conf.IsEnableSecurityKey() { - return nil - } - - auth := req.GetHeader(conf.GetHeaderSecurityKey()) - if auth != conf.GetSecurityKey() { - return gweb.Error(403, "未经授权的访问,拒绝服务") - } - return nil // 返回nil表示正常过滤成功 -} diff --git a/glc/web/router/register.go b/glc/web/router/register.go deleted file mode 100644 index 598cc59..0000000 --- a/glc/web/router/register.go +++ /dev/null @@ -1,28 +0,0 @@ -package router - -import ( - "glc/gweb" - "glc/gweb/method" - "glc/ldb/conf" - "glc/web/controller" - "glc/web/filter" -) - -func Register() { - - // ContextPath - contextPath := conf.GetContextPath() - - // 过滤器 - gweb.RegisterFilter(filter.ApiKeyFilter) - - // 控制器器(跳转) - gweb.RegisterController(method.GET, "/", controller.RedirectToSearchController) - gweb.RegisterController(method.GET, contextPath, controller.RedirectToSearchController) - gweb.RegisterController(method.GET, contextPath+"/", controller.RedirectToSearchController) - - // 控制器 - gweb.RegisterController(method.POST, contextPath+"/search", controller.LogSearchController) - gweb.RegisterController(method.POST, contextPath+"/add", controller.LogAddController) - -} diff --git a/glc/www/controller/admin_controller.go b/glc/www/controller/admin_controller.go new file mode 100644 index 0000000..9edf6c6 --- /dev/null +++ b/glc/www/controller/admin_controller.go @@ -0,0 +1,12 @@ +package controller + +import ( + "glc/gweb" + "glc/ldb/conf" +) + +// 前端检索页面 +func AdminController(req *gweb.HttpRequest) *gweb.HttpResult { + defer req.Redirect(conf.GetContextPath() + "/search") + return nil +} diff --git a/glc/web/controller/log_add_controller.go b/glc/www/controller/log_add_controller.go similarity index 71% rename from glc/web/controller/log_add_controller.go rename to glc/www/controller/log_add_controller.go index 3d895b0..1a151e7 100644 --- a/glc/web/controller/log_add_controller.go +++ b/glc/www/controller/log_add_controller.go @@ -9,8 +9,10 @@ import ( func LogAddController(req *gweb.HttpRequest) *gweb.HttpResult { storeNmae := req.GetFormParameter("name") text := req.GetFormParameter("text") + date := req.GetFormParameter("date") + system := req.GetFormParameter("system") engine := ldb.NewEngine(storeNmae) - engine.AddTextLog(text) + engine.AddTextLog(date, text, system) return gweb.Ok() } diff --git a/glc/web/controller/log_search_controller.go b/glc/www/controller/log_search_controller.go similarity index 64% rename from glc/web/controller/log_search_controller.go rename to glc/www/controller/log_search_controller.go index 4f0b68c..7bee3e2 100644 --- a/glc/web/controller/log_search_controller.go +++ b/glc/www/controller/log_search_controller.go @@ -4,25 +4,18 @@ import ( "glc/cmn" "glc/gweb" "glc/ldb" - "glc/ldb/conf" - "glc/ldb/tokenizer" ) // 日志检索(表单提交方式) func LogSearchController(req *gweb.HttpRequest) *gweb.HttpResult { storeNmae := req.GetFormParameter("name") - searchKey := tokenizer.GetSearchKey(req.GetFormParameter("searchKey")) + //searchKey := tokenizer.GetSearchKey(req.GetFormParameter("searchKey")) + searchKey := req.GetFormParameter("searchKey") pageSize := cmn.StringToInt(req.GetFormParameter("pageSize"), 20) currentId := cmn.StringToUint64(req.GetFormParameter("currentId"), 36, 0) forward := cmn.StringToBool(req.GetFormParameter("forward"), true) eng := ldb.NewEngine(storeNmae) rs := eng.Search(searchKey, pageSize, currentId, forward) - return gweb.Result(rs) -} - -// 重定向 -func RedirectToSearchController(req *gweb.HttpRequest) *gweb.HttpResult { - defer req.Redirect(conf.GetContextPath() + "/search") - return nil + return gweb.Result(rs.Data) } diff --git a/glc/www/filter/filter.go b/glc/www/filter/filter.go new file mode 100644 index 0000000..3407d7d --- /dev/null +++ b/glc/www/filter/filter.go @@ -0,0 +1,39 @@ +package filter + +import ( + "glc/gweb" + "glc/ldb/conf" + "net/http" +) + +// 校验HEADER的API秘钥 +func ApiKeyFilter(req *gweb.HttpRequest) *gweb.HttpResult { + + //log.Println("================================", req.RequestURI()) + // 开启API秘钥校验时才检查 + if !conf.IsEnableSecurityKey() { + return nil + } + + auth := req.GetHeader(conf.GetHeaderSecurityKey()) + if auth != conf.GetSecurityKey() { + return gweb.Error(403, "未经授权的访问,拒绝服务") + } + return nil // 返回nil表示正常过滤成功 +} + +// 校验HEADER的API秘钥 +func CrossFilter(req *gweb.HttpRequest) *gweb.HttpResult { + + req.SetHeader("Access-Control-Allow-Origin", "*") + req.SetHeader("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token") + req.SetHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS") + req.SetHeader("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type") + req.SetHeader("Access-Control-Allow-Credentials", "true") + + //放行所有OPTIONS方法 + if req.GetMethod() == "OPTIONS" { + req.AbortWithStatus(http.StatusNoContent) + } + return nil +} diff --git a/glc/www/html/static_file_handle.go b/glc/www/html/static_file_handle.go new file mode 100644 index 0000000..0a532fe --- /dev/null +++ b/glc/www/html/static_file_handle.go @@ -0,0 +1,66 @@ +package html + +import ( + "glc/cmn" + "glc/gweb" + "glc/ldb/conf" + "glc/www" + "log" + "os" +) + +// [/]重定向到[/glc/] +func RedirectToHomeController(req *gweb.HttpRequest) *gweb.HttpResult { + defer req.Redirect(conf.GetContextPath() + "/") + return nil +} + +// 响应请求[/glc/],读取index.html返回 +func HomeIndexHtmlController(req *gweb.HttpRequest) *gweb.HttpResult { + file, err := www.Static.ReadFile("web/dist/index.html") + if err != nil && os.IsNotExist(err) { + req.ResponseData(404, "text/html", cmn.StringToBytes("not found")) + } else { + req.ResponseData(200, "text/html", file) + } + return nil +} + +// 响应 *.html/*.css/*.js/*.png 等静态文件请求 +func StaticFileController(req *gweb.HttpRequest) *gweb.HttpResult { + + urlPath := req.RequestUrlPath() + contentType := getContentType(urlPath) + file, err := www.Static.ReadFile(getStaticFilePath(urlPath)) + if err != nil && os.IsNotExist(err) { + req.ResponseData(404, contentType, cmn.StringToBytes("not found")) + } else { + req.ResponseData(200, contentType, file) + } + return nil +} + +// urlPath如[/glc/assets/index.f0b375ee.js] +func getStaticFilePath(urlPath string) string { + path := cmn.SubStringRune(urlPath, len(conf.GetContextPath()), len(urlPath)) + return "web/dist" + path +} + +func getContentType(urlPath string) string { + + if cmn.EndwithsRune(urlPath, ".html") { + return "text/html" + } else if cmn.EndwithsRune(urlPath, ".css") { + return "text/css" + } else if cmn.EndwithsRune(urlPath, ".js") { + return "application/x-javascript" + } else if cmn.EndwithsRune(urlPath, ".png") { + return "image/png" + } else if cmn.EndwithsRune(urlPath, ".ico") { + return "image/x-icon" + } else { + log.Println("未识别出ContentType,按text/html处理", urlPath) + return "text/html" + } + +} diff --git a/glc/www/web/index.html b/glc/www/web/index.html new file mode 100644 index 0000000..7849610 --- /dev/null +++ b/glc/www/web/index.html @@ -0,0 +1,75 @@ + + + + + + + 日志中心 + + + + +
+ + + diff --git a/glc/www/web/package.json b/glc/www/web/package.json new file mode 100644 index 0000000..53d966d --- /dev/null +++ b/glc/www/web/package.json @@ -0,0 +1,24 @@ +{ + "name": "web", + "private": true, + "version": "0.0.0", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@element-plus/icons-vue": "^1.1.4", + "@vueuse/core": "^8.4.2", + "axios": "^0.27.2", + "element-plus": "^2.1.11", + "sass": "^1.51.0", + "vue": "^3.2.25", + "vue-json-viewer": "3", + "vue-router": "^4.0.15" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^2.2.0", + "vite": "^2.8.0" + } +} diff --git a/glc/www/web/public/favicon.ico b/glc/www/web/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..743ddf42b39d5567f0337e1d5868079332dc8d3c GIT binary patch literal 125342 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 literal 0 HcmV?d00001 diff --git a/glc/www/web/public/glc.png b/glc/www/web/public/glc.png new file mode 100644 index 0000000000000000000000000000000000000000..bf59255daaa6a1686b4bacf9bb43650d9309f558 GIT binary patch literal 14055 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

TBzpAcX5k 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 Z{6D)+E!%a6h1viB002ovPDHLkV1i(g$!Y)q literal 0 HcmV?d00001 diff --git a/glc/www/web/public/title.png b/glc/www/web/public/title.png new file mode 100644 index 0000000000000000000000000000000000000000..5b681fb7f3a3ce1c134f1a15024c8d15de92431a GIT binary patch literal 3616 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 + + + + + +

+
+ +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/glc/www/web/src/api.js b/glc/www/web/src/api.js new file mode 100644 index 0000000..42f0941 --- /dev/null +++ b/glc/www/web/src/api.js @@ -0,0 +1,50 @@ +import axios from 'axios' + +const BASE_URL = process.env.NODE_ENV === 'production' ? location.origin : 'http://127.0.0.1:8080' + +function request(url, method = 'get', data) { + return axios({ + baseURL: BASE_URL, + url: url, + method: method, + data: data, + }) +} + +function post(url, formData) { + return axios.post(url,formData,{ + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + // 'X-GLC-AUTH': 'glogcenter', + } + }) +} + +export default { + search(params={}) { + + let formData = new FormData(); + for(let k in params){ + formData.append(k, params[k]); + } + return post(`${BASE_URL}/glc/search`, formData) + }, + // remove(db, id) { + // return request(`/remove?database=${db}`, 'post', { id }) + // }, + // gc() { + // return request('/gc') + // }, + // getStatus() { + // return request('/status') + // }, + // addIndex(db, index) { + // return request(`/index?database=${db}`, 'post', index ) + // }, + // drop(db){ + // return request(`/db/drop?database=${db}`) + // }, + // create(db){ + // return request(`/db/create?database=${db}`) + // } +} diff --git a/glc/www/web/src/components/Icon.vue b/glc/www/web/src/components/Icon.vue new file mode 100644 index 0000000..0922db9 --- /dev/null +++ b/glc/www/web/src/components/Icon.vue @@ -0,0 +1,24 @@ + + + diff --git a/glc/www/web/src/components/Menu.vue b/glc/www/web/src/components/Menu.vue new file mode 100644 index 0000000..0f163e8 --- /dev/null +++ b/glc/www/web/src/components/Menu.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/glc/www/web/src/main.js b/glc/www/web/src/main.js new file mode 100644 index 0000000..30b4735 --- /dev/null +++ b/glc/www/web/src/main.js @@ -0,0 +1,20 @@ +import { createApp } from 'vue' +import App from './App.vue' +import 'element-plus/dist/index.css' +import ElementPlus from 'element-plus' +import zhCn from 'element-plus/es/locale/lang/zh-cn' + +import * as ElementPlusIconsVue from '@element-plus/icons-vue' + +import router from './router' +let app = createApp(App) +app.use(ElementPlus,{ + locale: zhCn, +}) +app.use(router) +for (const [key, component] of Object.entries(ElementPlusIconsVue)) { + app.component(key, component) + app.use(component) +} + +app.mount('#app') diff --git a/glc/www/web/src/menus.js b/glc/www/web/src/menus.js new file mode 100644 index 0000000..76c173b --- /dev/null +++ b/glc/www/web/src/menus.js @@ -0,0 +1,13 @@ +import { Coin, DataLine, Document, Search } from '@element-plus/icons-vue' + +const menus = [ + { + path: '/', + name: 'dashboard', + icon: Search, + label: '日志检索', + color: '#0081dd', + component: () => import('./views/dashboard.vue'), + }, +] +export default menus diff --git a/glc/www/web/src/router.js b/glc/www/web/src/router.js new file mode 100644 index 0000000..0ccabf8 --- /dev/null +++ b/glc/www/web/src/router.js @@ -0,0 +1,10 @@ +import { createRouter, createWebHashHistory } from 'vue-router' + +import menus from './menus' + +const router = createRouter({ + history: createWebHashHistory(), + routes: menus +}) + +export default router diff --git a/glc/www/web/src/views/dashboard.vue b/glc/www/web/src/views/dashboard.vue new file mode 100644 index 0000000..a6931bb --- /dev/null +++ b/glc/www/web/src/views/dashboard.vue @@ -0,0 +1,177 @@ + + + + + diff --git a/glc/www/web/vite.config.js b/glc/www/web/vite.config.js new file mode 100644 index 0000000..0486b35 --- /dev/null +++ b/glc/www/web/vite.config.js @@ -0,0 +1,8 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue()], + base: '' +}) diff --git a/glc/www/web/yarn.lock b/glc/www/web/yarn.lock new file mode 100644 index 0000000..5be4fb4 --- /dev/null +++ b/glc/www/web/yarn.lock @@ -0,0 +1,691 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/parser@^7.16.4": + version "7.17.10" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.17.10.tgz" + integrity sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ== + +"@ctrl/tinycolor@^3.4.1": + version "3.4.1" + resolved "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.4.1.tgz" + integrity sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw== + +"@element-plus/icons-vue@^1.1.4": + version "1.1.4" + resolved "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-1.1.4.tgz" + integrity sha512-Iz/nHqdp1sFPmdzRwHkEQQA3lKvoObk8azgABZ81QUOpW9s/lUyQVUSh0tNtEPZXQlKwlSh7SPgoVxzrE0uuVQ== + +"@floating-ui/core@^0.6.2": + version "0.6.2" + resolved "https://registry.npmmirror.com/@floating-ui/core/-/core-0.6.2.tgz" + integrity sha512-jktYRmZwmau63adUG3GKOAVCofBXkk55S/zQ94XOorAHhwqFIOFAy1rSp2N0Wp6/tGbe9V3u/ExlGZypyY17rg== + +"@floating-ui/dom@^0.4.5": + version "0.4.5" + resolved "https://registry.npmmirror.com/@floating-ui/dom/-/dom-0.4.5.tgz" + integrity sha512-b+prvQgJt8pieaKYMSJBXHxX/DYwdLsAWxKYqnO5dO2V4oo/TYBZJAUQCVNjTWWsrs6o4VDrNcP9+E70HAhJdw== + dependencies: + "@floating-ui/core" "^0.6.2" + +"@popperjs/core@npm:@sxzz/popperjs-es@^2.11.6": + version "2.11.7" + resolved "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz" + integrity sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ== + +"@types/lodash-es@^4.17.6": + version "4.17.6" + resolved "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.6.tgz" + integrity sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*", "@types/lodash@^4.14.182": + version "4.14.182" + resolved "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.182.tgz" + integrity sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q== + +"@vitejs/plugin-vue@^2.2.0": + version "2.3.2" + resolved "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.3.2.tgz" + integrity sha512-umyypfSHS4kQLdYAnJHhaASq7FRzNCdvcRoQ3uYGNk1/M4a+hXUd7ysN7BLhCrWH6uBokyCkFeUAaFDzSaaSrQ== + +"@vue/compiler-core@3.2.33": + version "3.2.33" + resolved "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.33.tgz" + integrity sha512-AAmr52ji3Zhk7IKIuigX2osWWsb2nQE5xsdFYjdnmtQ4gymmqXbjLvkSE174+fF3A3kstYrTgGkqgOEbsdLDpw== + dependencies: + "@babel/parser" "^7.16.4" + "@vue/shared" "3.2.33" + estree-walker "^2.0.2" + source-map "^0.6.1" + +"@vue/compiler-dom@3.2.33": + version "3.2.33" + resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.33.tgz" + integrity sha512-GhiG1C8X98Xz9QUX/RlA6/kgPBWJkjq0Rq6//5XTAGSYrTMBgcLpP9+CnlUg1TFxnnCVughAG+KZl28XJqw8uQ== + dependencies: + "@vue/compiler-core" "3.2.33" + "@vue/shared" "3.2.33" + +"@vue/compiler-sfc@3.2.33": + version "3.2.33" + resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.33.tgz" + integrity sha512-H8D0WqagCr295pQjUYyO8P3IejM3vEzeCO1apzByAEaAR/WimhMYczHfZVvlCE/9yBaEu/eu9RdiWr0kF8b71Q== + dependencies: + "@babel/parser" "^7.16.4" + "@vue/compiler-core" "3.2.33" + "@vue/compiler-dom" "3.2.33" + "@vue/compiler-ssr" "3.2.33" + "@vue/reactivity-transform" "3.2.33" + "@vue/shared" "3.2.33" + estree-walker "^2.0.2" + magic-string "^0.25.7" + postcss "^8.1.10" + source-map "^0.6.1" + +"@vue/compiler-ssr@3.2.33": + version "3.2.33" + resolved "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.33.tgz" + integrity sha512-XQh1Xdk3VquDpXsnoCd7JnMoWec9CfAzQDQsaMcSU79OrrO2PNR0ErlIjm/mGq3GmBfkQjzZACV+7GhfRB8xMQ== + dependencies: + "@vue/compiler-dom" "3.2.33" + "@vue/shared" "3.2.33" + +"@vue/devtools-api@^6.0.0": + version "6.1.4" + resolved "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.1.4.tgz" + integrity sha512-IiA0SvDrJEgXvVxjNkHPFfDx6SXw0b/TUkqMcDZWNg9fnCAHbTpoo59YfJ9QLFkwa3raau5vSlRVzMSLDnfdtQ== + +"@vue/reactivity-transform@3.2.33": + version "3.2.33" + resolved "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.33.tgz" + integrity sha512-4UL5KOIvSQb254aqenW4q34qMXbfZcmEsV/yVidLUgvwYQQ/D21bGX3DlgPUGI3c4C+iOnNmDCkIxkILoX/Pyw== + dependencies: + "@babel/parser" "^7.16.4" + "@vue/compiler-core" "3.2.33" + "@vue/shared" "3.2.33" + estree-walker "^2.0.2" + magic-string "^0.25.7" + +"@vue/reactivity@3.2.33": + version "3.2.33" + resolved "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.33.tgz" + integrity sha512-62Sq0mp9/0bLmDuxuLD5CIaMG2susFAGARLuZ/5jkU1FCf9EDbwUuF+BO8Ub3Rbodx0ziIecM/NsmyjardBxfQ== + dependencies: + "@vue/shared" "3.2.33" + +"@vue/runtime-core@3.2.33": + version "3.2.33" + resolved "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.33.tgz" + integrity sha512-N2D2vfaXsBPhzCV3JsXQa2NECjxP3eXgZlFqKh4tgakp3iX6LCGv76DLlc+IfFZq+TW10Y8QUfeihXOupJ1dGw== + dependencies: + "@vue/reactivity" "3.2.33" + "@vue/shared" "3.2.33" + +"@vue/runtime-dom@3.2.33": + version "3.2.33" + resolved "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.33.tgz" + integrity sha512-LSrJ6W7CZTSUygX5s8aFkraDWlO6K4geOwA3quFF2O+hC3QuAMZt/0Xb7JKE3C4JD4pFwCSO7oCrZmZ0BIJUnw== + dependencies: + "@vue/runtime-core" "3.2.33" + "@vue/shared" "3.2.33" + csstype "^2.6.8" + +"@vue/server-renderer@3.2.33": + version "3.2.33" + resolved "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.33.tgz" + integrity sha512-4jpJHRD4ORv8PlbYi+/MfP8ec1okz6rybe36MdpkDrGIdEItHEUyaHSKvz+ptNEyQpALmmVfRteHkU9F8vxOew== + dependencies: + "@vue/compiler-ssr" "3.2.33" + "@vue/shared" "3.2.33" + +"@vue/shared@3.2.33": + version "3.2.33" + resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.2.33.tgz" + integrity sha512-UBc1Pg1T3yZ97vsA2ueER0F6GbJebLHYlEi4ou1H5YL4KWvMOOWwpYo9/QpWq93wxKG6Wo13IY74Hcn/f7c7Bg== + +"@vueuse/core@^8.2.6", "@vueuse/core@^8.4.2": + version "8.4.2" + resolved "https://registry.npmmirror.com/@vueuse/core/-/core-8.4.2.tgz" + integrity sha512-dUVU96lii1ZdWoNJXauQNt+4QrHz1DKbuW+y6pDR2N10q7rGZJMDU7pQeMcC2XeosX7kMODfaBuqsF03NozzLg== + dependencies: + "@vueuse/metadata" "8.4.2" + "@vueuse/shared" "8.4.2" + vue-demi "*" + +"@vueuse/metadata@8.4.2": + version "8.4.2" + resolved "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-8.4.2.tgz" + integrity sha512-2BIj++7P0/I5dfMsEe8q7Kw0HqVAjVcyNOd9+G22/ILUC9TVLTeYOuJ1kwa1Gpr+0LWKHc6GqHiLWNL33+exoQ== + +"@vueuse/shared@8.4.2": + version "8.4.2" + resolved "https://registry.npmmirror.com/@vueuse/shared/-/shared-8.4.2.tgz" + integrity sha512-hILXMEjL8YQhj1LHN/HZ49UThyfk8irTjhele2nW+L3N55ElFUBGB/f4w0rg8EW+/suhqv7kJJPTZzvHCqxlIw== + dependencies: + vue-demi "*" + +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +async-validator@^4.0.7: + version "4.1.1" + resolved "https://registry.npmmirror.com/async-validator/-/async-validator-4.1.1.tgz" + integrity sha512-p4DO/JXwjs8klJyJL8Q2oM4ks5fUTze/h5k10oPPKMiLe1fj3G1QMzPHNmN1Py4ycOk7WlO2DcGXv1qiESJCZA== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +axios@^0.27.2: + version "0.27.2" + resolved "https://registry.npmmirror.com/axios/-/axios-0.27.2.tgz" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== + dependencies: + follow-redirects "^1.14.9" + form-data "^4.0.0" + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +"chokidar@>=3.0.0 <4.0.0": + version "3.5.3" + resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +clipboard@^2.0.4: + version "2.0.11" + resolved "https://registry.npmmirror.com/clipboard/-/clipboard-2.0.11.tgz" + integrity sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw== + dependencies: + good-listener "^1.2.2" + select "^1.1.2" + tiny-emitter "^2.0.0" + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +csstype@^2.6.8: + version "2.6.20" + resolved "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz" + integrity sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA== + +dayjs@^1.11.1: + version "1.11.2" + resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.2.tgz" + integrity sha512-F4LXf1OeU9hrSYRPTTj/6FbO4HTjPKXvEIC1P2kcnFurViINCVk3ZV0xAS3XVx9MkMsXbbqlK6hjseaYbgKEHw== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +delegate@^3.1.2: + version "3.2.0" + resolved "https://registry.npmmirror.com/delegate/-/delegate-3.2.0.tgz" + integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== + +element-plus@^2.1.11: + version "2.1.11" + resolved "https://registry.npmmirror.com/element-plus/-/element-plus-2.1.11.tgz" + integrity sha512-s4X0I8s787tv+9UdekBC1g7v42Fj4bucPAmu03EjbgrGrV7BJvkoBGuK52lNfu4yC76bl6Uyjesd5Fu8CMakSw== + dependencies: + "@ctrl/tinycolor" "^3.4.1" + "@element-plus/icons-vue" "^1.1.4" + "@floating-ui/dom" "^0.4.5" + "@popperjs/core" "npm:@sxzz/popperjs-es@^2.11.6" + "@types/lodash" "^4.14.182" + "@types/lodash-es" "^4.17.6" + "@vueuse/core" "^8.2.6" + async-validator "^4.0.7" + dayjs "^1.11.1" + escape-html "^1.0.3" + lodash "^4.17.21" + lodash-es "^4.17.21" + lodash-unified "^1.0.2" + memoize-one "^6.0.0" + normalize-wheel-es "^1.1.2" + +esbuild-android-64@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.38.tgz#5b94a1306df31d55055f64a62ff6b763a47b7f64" + integrity sha512-aRFxR3scRKkbmNuGAK+Gee3+yFxkTJO/cx83Dkyzo4CnQl/2zVSurtG6+G86EQIZ+w+VYngVyK7P3HyTBKu3nw== + +esbuild-android-arm64@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.38.tgz#78acc80773d16007de5219ccce544c036abd50b8" + integrity sha512-L2NgQRWuHFI89IIZIlpAcINy9FvBk6xFVZ7xGdOwIm8VyhX1vNCEqUJO3DPSSy945Gzdg98cxtNt8Grv1CsyhA== + +esbuild-darwin-64@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.38.tgz#e02b1291f629ebdc2aa46fabfacc9aa28ff6aa46" + integrity sha512-5JJvgXkX87Pd1Og0u/NJuO7TSqAikAcQQ74gyJ87bqWRVeouky84ICoV4sN6VV53aTW+NE87qLdGY4QA2S7KNA== + +esbuild-darwin-arm64@0.14.38: + version "0.14.38" + resolved "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.38.tgz" + integrity sha512-eqF+OejMI3mC5Dlo9Kdq/Ilbki9sQBw3QlHW3wjLmsLh+quNfHmGMp3Ly1eWm981iGBMdbtSS9+LRvR2T8B3eQ== + +esbuild-freebsd-64@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.38.tgz#790b8786729d4aac7be17648f9ea8e0e16475b5e" + integrity sha512-epnPbhZUt93xV5cgeY36ZxPXDsQeO55DppzsIgWM8vgiG/Rz+qYDLmh5ts3e+Ln1wA9dQ+nZmVHw+RjaW3I5Ig== + +esbuild-freebsd-arm64@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.38.tgz#b66340ab28c09c1098e6d9d8ff656db47d7211e6" + integrity sha512-/9icXUYJWherhk+y5fjPI5yNUdFPtXHQlwP7/K/zg8t8lQdHVj20SqU9/udQmeUo5pDFHMYzcEFfJqgOVeKNNQ== + +esbuild-linux-32@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.38.tgz#7927f950986fd39f0ff319e92839455912b67f70" + integrity sha512-QfgfeNHRFvr2XeHFzP8kOZVnal3QvST3A0cgq32ZrHjSMFTdgXhMhmWdKzRXP/PKcfv3e2OW9tT9PpcjNvaq6g== + +esbuild-linux-64@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.38.tgz#4893d07b229d9cfe34a2b3ce586399e73c3ac519" + integrity sha512-uuZHNmqcs+Bj1qiW9k/HZU3FtIHmYiuxZ/6Aa+/KHb/pFKr7R3aVqvxlAudYI9Fw3St0VCPfv7QBpUITSmBR1Q== + +esbuild-linux-arm64@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.38.tgz#8442402e37d0b8ae946ac616784d9c1a2041056a" + integrity sha512-HlMGZTEsBrXrivr64eZ/EO0NQM8H8DuSENRok9d+Jtvq8hOLzrxfsAT9U94K3KOGk2XgCmkaI2KD8hX7F97lvA== + +esbuild-linux-arm@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.38.tgz#d5dbf32d38b7f79be0ec6b5fb2f9251fd9066986" + integrity sha512-FiFvQe8J3VKTDXG01JbvoVRXQ0x6UZwyrU4IaLBZeq39Bsbatd94Fuc3F1RGqPF5RbIWW7RvkVQjn79ejzysnA== + +esbuild-linux-mips64le@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.38.tgz#95081e42f698bbe35d8ccee0e3a237594b337eb5" + integrity sha512-qd1dLf2v7QBiI5wwfil9j0HG/5YMFBAmMVmdeokbNAMbcg49p25t6IlJFXAeLzogv1AvgaXRXvgFNhScYEUXGQ== + +esbuild-linux-ppc64le@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.38.tgz#dceb0a1b186f5df679618882a7990bd422089b47" + integrity sha512-mnbEm7o69gTl60jSuK+nn+pRsRHGtDPfzhrqEUXyCl7CTOCLtWN2bhK8bgsdp6J/2NyS/wHBjs1x8aBWwP2X9Q== + +esbuild-linux-riscv64@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.38.tgz#61fb8edb75f475f9208c4a93ab2bfab63821afd2" + integrity sha512-+p6YKYbuV72uikChRk14FSyNJZ4WfYkffj6Af0/Tw63/6TJX6TnIKE+6D3xtEc7DeDth1fjUOEqm+ApKFXbbVQ== + +esbuild-linux-s390x@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.38.tgz#34c7126a4937406bf6a5e69100185fd702d12fe0" + integrity sha512-0zUsiDkGJiMHxBQ7JDU8jbaanUY975CdOW1YDrurjrM0vWHfjv9tLQsW9GSyEb/heSK1L5gaweRjzfUVBFoybQ== + +esbuild-netbsd-64@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.38.tgz#322ea9937d9e529183ee281c7996b93eb38a5d95" + integrity sha512-cljBAApVwkpnJZfnRVThpRBGzCi+a+V9Ofb1fVkKhtrPLDYlHLrSYGtmnoTVWDQdU516qYI8+wOgcGZ4XIZh0Q== + +esbuild-openbsd-64@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.38.tgz#1ca29bb7a2bf09592dcc26afdb45108f08a2cdbd" + integrity sha512-CDswYr2PWPGEPpLDUO50mL3WO/07EMjnZDNKpmaxUPsrW+kVM3LoAqr/CE8UbzugpEiflYqJsGPLirThRB18IQ== + +esbuild-sunos-64@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.38.tgz#c9446f7d8ebf45093e7bb0e7045506a88540019b" + integrity sha512-2mfIoYW58gKcC3bck0j7lD3RZkqYA7MmujFYmSn9l6TiIcAMpuEvqksO+ntBgbLep/eyjpgdplF7b+4T9VJGOA== + +esbuild-windows-32@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.38.tgz#f8e9b4602fd0ccbd48e5c8d117ec0ba4040f2ad1" + integrity sha512-L2BmEeFZATAvU+FJzJiRLFUP+d9RHN+QXpgaOrs2klshoAm1AE6Us4X6fS9k33Uy5SzScn2TpcgecbqJza1Hjw== + +esbuild-windows-64@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.38.tgz#280f58e69f78535f470905ce3e43db1746518107" + integrity sha512-Khy4wVmebnzue8aeSXLC+6clo/hRYeNIm0DyikoEqX+3w3rcvrhzpoix0S+MF9vzh6JFskkIGD7Zx47ODJNyCw== + +esbuild-windows-arm64@0.14.38: + version "0.14.38" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.38.tgz#d97e9ac0f95a4c236d9173fa9f86c983d6a53f54" + integrity sha512-k3FGCNmHBkqdJXuJszdWciAH77PukEyDsdIryEHn9cKLQFxzhT39dSumeTuggaQcXY57UlmLGIkklWZo2qzHpw== + +esbuild@^0.14.27: + version "0.14.38" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.38.tgz" + integrity sha512-12fzJ0fsm7gVZX1YQ1InkOE5f9Tl7cgf6JPYXRJtPIoE0zkWAbHdPHVPPaLi9tYAcEBqheGzqLn/3RdTOyBfcA== + optionalDependencies: + esbuild-android-64 "0.14.38" + esbuild-android-arm64 "0.14.38" + esbuild-darwin-64 "0.14.38" + esbuild-darwin-arm64 "0.14.38" + esbuild-freebsd-64 "0.14.38" + esbuild-freebsd-arm64 "0.14.38" + esbuild-linux-32 "0.14.38" + esbuild-linux-64 "0.14.38" + esbuild-linux-arm "0.14.38" + esbuild-linux-arm64 "0.14.38" + esbuild-linux-mips64le "0.14.38" + esbuild-linux-ppc64le "0.14.38" + esbuild-linux-riscv64 "0.14.38" + esbuild-linux-s390x "0.14.38" + esbuild-netbsd-64 "0.14.38" + esbuild-openbsd-64 "0.14.38" + esbuild-sunos-64 "0.14.38" + esbuild-windows-32 "0.14.38" + esbuild-windows-64 "0.14.38" + esbuild-windows-arm64 "0.14.38" + +escape-html@^1.0.3: + version "1.0.3" + resolved "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +follow-redirects@^1.14.9: + version "1.15.0" + resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.0.tgz" + integrity sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +good-listener@^1.2.2: + version "1.2.2" + resolved "https://registry.npmmirror.com/good-listener/-/good-listener-1.2.2.tgz" + integrity sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw== + dependencies: + delegate "^3.1.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +immutable@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/immutable/-/immutable-4.0.0.tgz" + integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.8.1: + version "2.9.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== + dependencies: + has "^1.0.3" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + +lodash-unified@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.2.tgz" + integrity sha512-OGbEy+1P+UT26CYi4opY4gebD8cWRDxAT6MAObIVQMiqYdxZr1g3QHWCToVsm31x2NkLS4K3+MC2qInaRMa39g== + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +magic-string@^0.25.7: + version "0.25.9" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" + +memoize-one@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz" + integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +nanoid@^3.3.3: + version "3.3.4" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-wheel-es@^1.1.2: + version "1.1.2" + resolved "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.1.2.tgz" + integrity sha512-scX83plWJXYH1J4+BhAuIHadROzxX0UBF3+HuZNY2Ks8BciE7tSTQ+5JhTsvzjaO0/EJdm4JBGrfObKxFf3Png== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +postcss@^8.1.10, postcss@^8.4.13: + version "8.4.13" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.13.tgz" + integrity sha512-jtL6eTBrza5MPzy8oJLFuUscHDXTV5KcLlqAWHl5q5WYRfnNRGSmOZmOZ1T6Gy7A99mOZfqungmZMpMmCVJ8ZA== + dependencies: + nanoid "^3.3.3" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +resolve@^1.22.0: + version "1.22.0" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +rollup@^2.59.0: + version "2.72.0" + resolved "https://registry.npmjs.org/rollup/-/rollup-2.72.0.tgz" + integrity sha512-KqtR2YcO35/KKijg4nx4STO3569aqCUeGRkKWnJ6r+AvBBrVY9L4pmf4NHVrQr4mTOq6msbohflxr2kpihhaOA== + optionalDependencies: + fsevents "~2.3.2" + +sass@^1.51.0: + version "1.51.0" + resolved "https://registry.npmmirror.com/sass/-/sass-1.51.0.tgz" + integrity sha512-haGdpTgywJTvHC2b91GSq+clTKGbtkkZmVAb82jZQN/wTy6qs8DdFm2lhEQbEwrY0QDRgSQ3xDurqM977C3noA== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + +select@^1.1.2: + version "1.1.2" + resolved "https://registry.npmmirror.com/select/-/select-1.1.2.tgz" + integrity sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA== + +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tiny-emitter@^2.0.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz" + integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +vite@^2.8.0: + version "2.9.8" + resolved "https://registry.npmjs.org/vite/-/vite-2.9.8.tgz" + integrity sha512-zsBGwn5UT3YS0NLSJ7hnR54+vUKfgzMUh/Z9CxF1YKEBVIe213+63jrFLmZphgGI5zXwQCSmqIdbPuE8NJywPw== + dependencies: + esbuild "^0.14.27" + postcss "^8.4.13" + resolve "^1.22.0" + rollup "^2.59.0" + optionalDependencies: + fsevents "~2.3.2" + +vue-demi@*: + version "0.12.5" + resolved "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.12.5.tgz" + integrity sha512-BREuTgTYlUr0zw0EZn3hnhC3I6gPWv+Kwh4MCih6QcAeaTlaIX0DwOVN0wHej7hSvDPecz4jygy/idsgKfW58Q== + +vue-json-viewer@3: + version "3.0.4" + resolved "https://registry.npmmirror.com/vue-json-viewer/-/vue-json-viewer-3.0.4.tgz" + integrity sha512-pnC080rTub6YjccthVSNQod2z9Sl5IUUq46srXtn6rxwhW8QM4rlYn+CTSLFKXWfw+N3xv77Cioxw7B4XUKIbQ== + dependencies: + clipboard "^2.0.4" + +vue-router@^4.0.15: + version "4.0.15" + resolved "https://registry.npmmirror.com/vue-router/-/vue-router-4.0.15.tgz" + integrity sha512-xa+pIN9ZqORdIW1MkN2+d9Ui2pCM1b/UMgwYUCZOiFYHAvz/slKKBDha8DLrh5aCG/RibtrpyhKjKOZ85tYyWg== + dependencies: + "@vue/devtools-api" "^6.0.0" + +vue@^3.2.25: + version "3.2.33" + resolved "https://registry.npmjs.org/vue/-/vue-3.2.33.tgz" + integrity sha512-si1ExAlDUrLSIg/V7D/GgA4twJwfsfgG+t9w10z38HhL/HA07132pUQ2KuwAo8qbCyMJ9e6OqrmWrOCr+jW7ZQ== + dependencies: + "@vue/compiler-dom" "3.2.33" + "@vue/compiler-sfc" "3.2.33" + "@vue/runtime-dom" "3.2.33" + "@vue/server-renderer" "3.2.33" + "@vue/shared" "3.2.33" diff --git a/glc/www/web_embed.go b/glc/www/web_embed.go new file mode 100644 index 0000000..7ebaac2 --- /dev/null +++ b/glc/www/web_embed.go @@ -0,0 +1,8 @@ +package www + +import "embed" + +var ( + //go:embed web/dist/* + Static embed.FS +)