From 0d4039cf34b75f40d57de33ee6179fbb51df491c Mon Sep 17 00:00:00 2001 From: fancl Date: Thu, 12 Dec 2024 16:24:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=9F=BA=E7=A1=80=E6=A1=86?= =?UTF-8?q?=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api.go | 50 +- go.mod | 11 +- go.sum | 22 +- internal/user/middleware.go | 80 + internal/user/passport/login.go | 108 + internal/user/passport/types.go | 19 + internal/user/passport/utils.go | 13 + internal/user/profile.go | 17 + internal/user/types/profile.go | 13 + internal/user/types/tokenize.go | 29 + models/login.go | 18 + server.go | 1 + web/.gitignore | 30 + web/README.md | 29 + web/index.html | 17 + web/jsconfig.json | 8 + web/package-lock.json | 4631 +++++++++++++++++ web/package.json | 33 + web/public/favicon.ico | Bin 0 -> 4286 bytes web/src/App.vue | 47 + web/src/apis/organize.js | 117 + web/src/apis/request.js | 63 + web/src/apis/system.js | 15 + web/src/assets/js/deepcopy.js | 23 + web/src/assets/js/formatter.js | 61 + web/src/assets/js/menu.js | 184 + web/src/assets/js/status.js | 125 + web/src/assets/scss/common.scss | 562 ++ web/src/assets/scss/element.scss | 28 + web/src/assets/scss/style.scss | 1118 ++++ web/src/components/fragment/ActiveForm.vue | 296 ++ web/src/components/fragment/Description.vue | 71 + web/src/components/fragment/GridView.vue | 106 + web/src/components/fragment/PageHeader.vue | 12 + web/src/components/fragment/Skeleton.vue | 45 + web/src/components/fragment/Viewer.vue | 592 +++ web/src/components/fragment/Wrapper.vue | 77 + web/src/components/fragment/libs/codec.js | 238 + web/src/components/fragment/libs/crud.js | 680 +++ web/src/components/fragment/libs/error.js | 9 + web/src/components/fragment/libs/form.js | 161 + web/src/components/fragment/libs/model.js | 60 + web/src/components/fragment/parts/Action.vue | 46 + web/src/components/fragment/parts/Cell.vue | 195 + .../components/fragment/parts/FormItem.vue | 281 + .../components/fragment/parts/LevelSelect.vue | 67 + .../components/fragment/parts/RouteLink.vue | 41 + web/src/components/fragment/parts/Upload.vue | 64 + web/src/components/widgets/Action.vue | 52 + web/src/components/widgets/Audio.vue | 126 + web/src/components/widgets/Avatar.vue | 92 + web/src/components/widgets/Call.vue | 44 + web/src/components/widgets/Icon.vue | 28 + web/src/components/widgets/Import.vue | 104 + web/src/components/widgets/Loadmore.vue | 39 + web/src/components/widgets/MenuItem.vue | 49 + web/src/components/widgets/Percentage.vue | 50 + web/src/components/widgets/Preview.vue | 57 + web/src/components/widgets/Tag.vue | 37 + web/src/components/widgets/UserPanel.vue | 72 + web/src/components/widgets/UserPick.vue | 239 + web/src/config/menu.js | 708 +++ web/src/directive/permission.js | 26 + web/src/i18n/index.js | 4 + web/src/i18n/locale/en.js | 3 + web/src/i18n/locale/zh-cn.js | 3 + web/src/layouts/default/Headerbar.vue | 175 + web/src/layouts/default/Layout.vue | 107 + web/src/layouts/default/Sidebar.vue | 82 + web/src/layouts/default/Statusbar.vue | 10 + web/src/layouts/default/Viewer.vue | 6 + web/src/layouts/default/parts/Callbar.vue | 345 ++ web/src/layouts/default/parts/Notice.vue | 30 + web/src/layouts/default/parts/Popup.vue | 229 + web/src/main.js | 23 + web/src/router/index.js | 36 + web/src/stores/counter.js | 12 + web/src/stores/system.js | 67 + web/src/stores/theme.js | 18 + web/src/stores/user.js | 123 + web/src/views/account/Login.vue | 219 + web/src/views/dashboard/Index.vue | 8 + web/src/views/organize/department/Index.vue | 24 + web/src/views/redirect/Redirect.vue | 7 + web/vite.config.js | 18 + 85 files changed, 13758 insertions(+), 27 deletions(-) create mode 100644 internal/user/middleware.go create mode 100644 internal/user/passport/login.go create mode 100644 internal/user/passport/types.go create mode 100644 internal/user/passport/utils.go create mode 100644 internal/user/profile.go create mode 100644 internal/user/types/profile.go create mode 100644 internal/user/types/tokenize.go create mode 100644 models/login.go create mode 100644 web/.gitignore create mode 100644 web/README.md create mode 100644 web/index.html create mode 100644 web/jsconfig.json create mode 100644 web/package-lock.json create mode 100644 web/package.json create mode 100644 web/public/favicon.ico create mode 100644 web/src/App.vue create mode 100644 web/src/apis/organize.js create mode 100644 web/src/apis/request.js create mode 100644 web/src/apis/system.js create mode 100644 web/src/assets/js/deepcopy.js create mode 100644 web/src/assets/js/formatter.js create mode 100644 web/src/assets/js/menu.js create mode 100644 web/src/assets/js/status.js create mode 100644 web/src/assets/scss/common.scss create mode 100644 web/src/assets/scss/element.scss create mode 100644 web/src/assets/scss/style.scss create mode 100644 web/src/components/fragment/ActiveForm.vue create mode 100644 web/src/components/fragment/Description.vue create mode 100644 web/src/components/fragment/GridView.vue create mode 100644 web/src/components/fragment/PageHeader.vue create mode 100644 web/src/components/fragment/Skeleton.vue create mode 100644 web/src/components/fragment/Viewer.vue create mode 100644 web/src/components/fragment/Wrapper.vue create mode 100644 web/src/components/fragment/libs/codec.js create mode 100644 web/src/components/fragment/libs/crud.js create mode 100644 web/src/components/fragment/libs/error.js create mode 100644 web/src/components/fragment/libs/form.js create mode 100644 web/src/components/fragment/libs/model.js create mode 100644 web/src/components/fragment/parts/Action.vue create mode 100644 web/src/components/fragment/parts/Cell.vue create mode 100644 web/src/components/fragment/parts/FormItem.vue create mode 100644 web/src/components/fragment/parts/LevelSelect.vue create mode 100644 web/src/components/fragment/parts/RouteLink.vue create mode 100644 web/src/components/fragment/parts/Upload.vue create mode 100644 web/src/components/widgets/Action.vue create mode 100644 web/src/components/widgets/Audio.vue create mode 100644 web/src/components/widgets/Avatar.vue create mode 100644 web/src/components/widgets/Call.vue create mode 100644 web/src/components/widgets/Icon.vue create mode 100644 web/src/components/widgets/Import.vue create mode 100644 web/src/components/widgets/Loadmore.vue create mode 100644 web/src/components/widgets/MenuItem.vue create mode 100644 web/src/components/widgets/Percentage.vue create mode 100644 web/src/components/widgets/Preview.vue create mode 100644 web/src/components/widgets/Tag.vue create mode 100644 web/src/components/widgets/UserPanel.vue create mode 100644 web/src/components/widgets/UserPick.vue create mode 100644 web/src/config/menu.js create mode 100644 web/src/directive/permission.js create mode 100644 web/src/i18n/index.js create mode 100644 web/src/i18n/locale/en.js create mode 100644 web/src/i18n/locale/zh-cn.js create mode 100644 web/src/layouts/default/Headerbar.vue create mode 100644 web/src/layouts/default/Layout.vue create mode 100644 web/src/layouts/default/Sidebar.vue create mode 100644 web/src/layouts/default/Statusbar.vue create mode 100644 web/src/layouts/default/Viewer.vue create mode 100644 web/src/layouts/default/parts/Callbar.vue create mode 100644 web/src/layouts/default/parts/Notice.vue create mode 100644 web/src/layouts/default/parts/Popup.vue create mode 100644 web/src/main.js create mode 100644 web/src/router/index.js create mode 100644 web/src/stores/counter.js create mode 100644 web/src/stores/system.js create mode 100644 web/src/stores/theme.js create mode 100644 web/src/stores/user.js create mode 100644 web/src/views/account/Login.vue create mode 100644 web/src/views/dashboard/Index.vue create mode 100644 web/src/views/organize/department/Index.vue create mode 100644 web/src/views/redirect/Redirect.vue create mode 100644 web/vite.config.js diff --git a/api.go b/api.go index 60629a3..e4ab067 100644 --- a/api.go +++ b/api.go @@ -1,5 +1,53 @@ package moto -func (svr *Server) routes() { +import ( + "git.nobla.cn/golang/kos" + "git.nobla.cn/golang/kos/entry/http" + "git.nobla.cn/golang/moto/internal/user" + "git.nobla.cn/golang/moto/internal/user/passport" + "git.nobla.cn/golang/moto/internal/user/types" +) +func (svr *Server) handleLogin(ctx *http.Context) (err error) { + var ( + tk *types.Tokenize + req *passport.LoginRequest + ) + req = &passport.LoginRequest{} + if err = ctx.Bind(req); err != nil { + return ctx.Error(http.ErrInvalidPayload, err.Error()) + } + if tk, err = passport.Login(ctx.Context(), req); err != nil { + return ctx.Error(http.ErrPermissionDenied, err.Error()) + } + return ctx.Success(tk) +} + +func (svr *Server) handleLogout(ctx *http.Context) (err error) { + passport.Logout(ctx.Context(), ctx.User().Get("token")) + return ctx.Success("logout") +} + +func (svr *Server) handleProfile(ctx *http.Context) (err error) { + var ( + profile *types.Profile + ) + if profile, err = user.Profile(ctx.Context(), ctx.User().ID); err != nil { + return ctx.Error(http.ErrTemporaryUnavailable, err.Error()) + } + return ctx.Success(profile) +} + +func (svr *Server) handleGetConfigure(ctx *http.Context) (err error) { + return ctx.Success(map[string]string{}) +} + +func (svr *Server) routes() { + kos.Http().Use(user.AuthMiddleware) + user.AllowUri("/passport/login") + + kos.Http().Handle(http.MethodPost, "/passport/login", svr.handleLogin) + kos.Http().Handle(http.MethodDelete, "/passport/logout", svr.handleLogout) + kos.Http().Handle(http.MethodGet, "/user/profile", svr.handleProfile) + kos.Http().Handle(http.MethodGet, "/user/configures", svr.handleGetConfigure) } diff --git a/go.mod b/go.mod index e769a48..fee40a1 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,8 @@ require ( git.nobla.cn/golang/kos v0.1.32 git.nobla.cn/golang/rest v0.0.1 github.com/go-sql-driver/mysql v1.8.1 + github.com/google/uuid v1.6.0 + github.com/mssola/useragent v1.0.0 gopkg.in/yaml.v3 v3.0.1 gorm.io/driver/mysql v1.5.7 gorm.io/gorm v1.25.12 @@ -13,21 +15,14 @@ require ( require ( filippo.io/edwards25519 v1.1.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.3 // indirect - github.com/go-playground/locales v0.14.1 // indirect - github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.23.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/kr/text v0.2.0 // indirect - github.com/leodido/go-urn v1.4.0 // indirect github.com/mattn/go-runewidth v0.0.3 // indirect github.com/patrickmn/go-cache v2.1.0+incompatible // indirect github.com/peterh/liner v1.2.2 // indirect - github.com/rs/xid v1.6.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect - golang.org/x/crypto v0.19.0 // indirect - golang.org/x/net v0.21.0 // indirect + github.com/stretchr/testify v1.8.4 // indirect golang.org/x/sys v0.17.0 // indirect golang.org/x/text v0.14.0 // indirect ) diff --git a/go.sum b/go.sum index c675e54..455679e 100644 --- a/go.sum +++ b/go.sum @@ -7,19 +7,11 @@ git.nobla.cn/golang/rest v0.0.1/go.mod h1:tGDOul2GGJtxk6fAeu+YLpMt/Up/TsBonTkygy github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= -github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= -github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= -github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= -github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= -github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= -github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.23.0 h1:/PwmTwZhS0dPkav3cdK9kV1FsAmrL8sThn8IHr/sO+o= -github.com/go-playground/validator/v10 v10.23.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= @@ -28,10 +20,10 @@ github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= -github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/mattn/go-runewidth v0.0.3 h1:a+kO+98RDGEfo6asOGMmpodZq4FNtnGP54yps8BzLR4= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mssola/useragent v1.0.0 h1:WRlDpXyxHDNfvZaPEut5Biveq86Ze4o4EMffyMxmH5o= +github.com/mssola/useragent v1.0.0/go.mod h1:hz9Cqz4RXusgg1EdI4Al0INR62kP7aPSRNHnpU+b85Y= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/peterh/liner v1.2.2 h1:aJ4AOodmL+JxOZZEL2u9iJf8omNRpqHc/EbrK+3mAXw= @@ -40,16 +32,10 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= -github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= diff --git a/internal/user/middleware.go b/internal/user/middleware.go new file mode 100644 index 0000000..8a54389 --- /dev/null +++ b/internal/user/middleware.go @@ -0,0 +1,80 @@ +package user + +import ( + "git.nobla.cn/golang/kos/entry/http" + "git.nobla.cn/golang/moto/internal/user/passport" + "git.nobla.cn/golang/moto/internal/user/types" + "os" + "strings" +) + +var ( + allowUris []string + + CookieName = "MOTO_US" +) + +func init() { + allowUris = make([]string, 0, 10) +} + +func AllowUri(s string) { + allowUris = append(allowUris, s) +} + +func isAllowed(uriPath string) bool { + for _, s := range allowUris { + sl := len(s) + if sl <= 0 { + continue + } + if s[sl-1] == '*' { + if strings.HasPrefix(uriPath, s[:sl-1]) { + return true + } + } else if s == uriPath { + return true + } + } + return false +} + +func AuthMiddleware(next http.HandleFunc) http.HandleFunc { + return func(ctx *http.Context) (err error) { + if isAllowed(ctx.Request().URL.Path) { + return next(ctx) + } + var ( + pos int + accessToken string + ui *http.Userinfo + tk *types.Tokenize + ) + if accessToken = ctx.Query("access_token"); accessToken != "" { + goto __end + } + if accessToken = ctx.GetCookieValue(CookieName); accessToken != "" { + goto __end + } + if accessToken = ctx.Request().Header.Get("Authorization"); accessToken != "" { + goto __end + } + __end: + accessToken = strings.TrimSpace(accessToken) + if pos = strings.IndexByte(accessToken, ' '); pos > -1 { + accessToken = accessToken[pos+1:] + } + if tk, err = passport.Validate(ctx.Context(), accessToken); err != nil { + err = ctx.Error(http.ErrAccessDenied, "access denied") + err = os.ErrPermission + return + } + ui = &http.Userinfo{ + ID: tk.UID, + Name: tk.Name, + } + ui.Set("token", tk.Token) + ctx.SetUser(ui) + return next(ctx) + } +} diff --git a/internal/user/passport/login.go b/internal/user/passport/login.go new file mode 100644 index 0000000..fd0277a --- /dev/null +++ b/internal/user/passport/login.go @@ -0,0 +1,108 @@ +package passport + +import ( + "context" + "fmt" + "git.nobla.cn/golang/kos/pkg/cache" + "git.nobla.cn/golang/moto/common/db" + "git.nobla.cn/golang/moto/internal/user/types" + "git.nobla.cn/golang/moto/models" + "github.com/mssola/useragent" + "strings" + "sync" + "time" +) + +var ( + tokenizeLocker sync.RWMutex + tokenizes map[string]*types.Tokenize + + LoginMaxTires = 5 +) + +func init() { + tokenizes = make(map[string]*types.Tokenize) +} + +func Login(ctx context.Context, req *LoginRequest) (tk *types.Tokenize, err error) { + var ( + tires int + duration time.Duration + ) + tx := db.WithContext(ctx) + userModel := &models.User{} + if req.Remember { + duration = time.Hour * 24 + } else { + duration = time.Hour * 2 + } + cacheKey := fmt.Sprintf("passport:login:%s:attempts", req.RealIP) + if LoginMaxTires > 0 { + if err = cache.Load(ctx, cacheKey, &tires); err == nil { + if tires > LoginMaxTires { + err = ErrTooManyAttempts + return + } + } + } + if err = tx.Where("uid=?", req.Username).First(userModel).Error; err == nil { + if userModel.Password == req.Password || md5Hash(req.Password) == userModel.Password { + tk = types.NewTokenize(userModel.UID, duration) + tokenizeLocker.Lock() + tokenizes[tk.Token] = tk + tokenizeLocker.Unlock() + + tk.Name = userModel.Username + ua := useragent.New(req.UserAgent) + loginModel := &models.Login{ + UID: userModel.UID, + IP: req.RealIP, + Os: ua.OS(), + Platform: ua.Platform(), + AccessToken: tk.Token, + UserAgent: req.UserAgent, + } + browser, browserVersion := ua.Browser() + loginModel.Browser = browser + "/" + browserVersion + tx.Save(loginModel) + } else { + err = ErrInvalidPassword + _ = cache.StoreEx(ctx, cacheKey, tires+1, time.Minute*10) + } + } else { + _ = cache.StoreEx(ctx, cacheKey, tires+1, time.Minute*10) + } + return +} + +func Validate(ctx context.Context, token string) (tk *types.Tokenize, err error) { + var ( + ok bool + ) + tokenizeLocker.Lock() + defer tokenizeLocker.Unlock() + token = strings.TrimSpace(token) + if token == "" { + return nil, ErrPermissionDenied + } + if tk, ok = tokenizes[token]; !ok { + return nil, ErrPermissionDenied + } else { + if tk.Validate() { + return tk, nil + } else { + delete(tokenizes, token) + return nil, ErrPermissionDenied + } + } + return +} + +func Logout(ctx context.Context, token string) (ok bool) { + tokenizeLocker.Lock() + if _, ok = tokenizes[token]; ok { + delete(tokenizes, token) + } + tokenizeLocker.Unlock() + return +} diff --git a/internal/user/passport/types.go b/internal/user/passport/types.go new file mode 100644 index 0000000..5de41df --- /dev/null +++ b/internal/user/passport/types.go @@ -0,0 +1,19 @@ +package passport + +import ( + "errors" +) + +var ( + ErrPermissionDenied = errors.New("permission denied") + ErrInvalidPassword = errors.New("invalid password") + ErrTooManyAttempts = errors.New("too many attempts") +) + +type LoginRequest struct { + Username string `json:"username"` + Password string `json:"password"` + Remember bool `json:"remember"` + RealIP string `json:"real_ip"` + UserAgent string `json:"user_agent"` +} diff --git a/internal/user/passport/utils.go b/internal/user/passport/utils.go new file mode 100644 index 0000000..87ccec0 --- /dev/null +++ b/internal/user/passport/utils.go @@ -0,0 +1,13 @@ +package passport + +import ( + "crypto/md5" + "encoding/hex" + "git.nobla.cn/golang/kos/util/bs" +) + +func md5Hash(s string) string { + hash := md5.New() + hash.Write(bs.StringToBytes(s)) + return hex.EncodeToString(hash.Sum(nil)) +} diff --git a/internal/user/profile.go b/internal/user/profile.go new file mode 100644 index 0000000..e7ad564 --- /dev/null +++ b/internal/user/profile.go @@ -0,0 +1,17 @@ +package user + +import ( + "context" + "git.nobla.cn/golang/moto/common/db" + "git.nobla.cn/golang/moto/internal/user/types" +) + +func Profile(ctx context.Context, uid string) (profile *types.Profile, err error) { + profile = &types.Profile{} + tx := db.WithContext(ctx) + err = tx.Table("users AS u"). + Select("u.uid as id", "u.username", "u.avatar", "u.email", "u.description", "u.role", "r.permissions"). + Joins("left join roles AS r on r.id = u.role").Where("u.uid=? ", uid). + First(profile).Error + return +} diff --git a/internal/user/types/profile.go b/internal/user/types/profile.go new file mode 100644 index 0000000..94af401 --- /dev/null +++ b/internal/user/types/profile.go @@ -0,0 +1,13 @@ +package types + +type ( + Profile struct { + ID string `json:"id"` + Username string `json:"username"` + Role string `json:"role"` + Email string `json:"email"` + Avatar string `json:"avatar"` + Description string `json:"description"` + Permissions string `json:"permissions"` + } +) diff --git a/internal/user/types/tokenize.go b/internal/user/types/tokenize.go new file mode 100644 index 0000000..1b49dbf --- /dev/null +++ b/internal/user/types/tokenize.go @@ -0,0 +1,29 @@ +package types + +import ( + "git.nobla.cn/golang/kos/util/random" + "github.com/google/uuid" + "strings" + "time" +) + +type Tokenize struct { + UID string `json:"uid"` + Name string `json:"name"` + Token string `json:"token"` + ExpireIn int `json:"expire_in"` + ExpiredAt time.Time `json:"-"` +} + +func (tk *Tokenize) Validate() bool { + return time.Now().Before(tk.ExpiredAt) +} + +func NewTokenize(uid string, duration time.Duration) *Tokenize { + return &Tokenize{ + UID: uid, + Token: random.String(32) + strings.ReplaceAll(uuid.New().String(), "-", ""), + ExpireIn: int(duration / time.Second), + ExpiredAt: time.Now().Add(duration), + } +} diff --git a/models/login.go b/models/login.go new file mode 100644 index 0000000..7334607 --- /dev/null +++ b/models/login.go @@ -0,0 +1,18 @@ +package models + +type Login struct { + ID string `json:"id" gorm:"primaryKey;size:20" comment:"ID" scenarios:"view;export"` + CreatedAt int64 `json:"created_at" gorm:"autoCreateTime" comment:"登录时间" scenarios:"list;search;view;export" position:"2"` + Domain string `json:"domain" gorm:"index;size:60;not null;default:'default'" comment:"域" scenarios:"export"` + UID string `json:"uid" gorm:"column:uid;index;size:20;not null;default:''" props:"match:exactly" comment:"座席" format:"user" scenarios:"search;list;export" position:"1"` + IP string `json:"ip" gorm:"size:20;not null;default:''" comment:"IP" scenarios:"search;list;export"` + Browser string `json:"browser" gorm:"size:200;not null;default:''" comment:"浏览器" scenarios:"search;list;export"` + Os string `json:"os" gorm:"size:200;not null;default:''" comment:"操作系统" scenarios:"search;list;export"` + Platform string `json:"platform" gorm:"size:200;not null;default:''" comment:"平台" scenarios:"search;list;export"` + AccessToken string `json:"access_token" gorm:"size:200;not null;default:''" comment:"访问令牌" scenarios:"export"` + UserAgent string `json:"user_agent" gorm:"size:1024;not null;default:''" comment:"UserAgent" scenarios:"export"` +} + +func (model *Login) TableName() string { + return "user_logins" +} diff --git a/server.go b/server.go index 60f88a2..d6fa461 100644 --- a/server.go +++ b/server.go @@ -26,6 +26,7 @@ func (svr *Server) prepare() (err error) { values := []any{ &models.User{}, &models.Role{}, + &models.Login{}, &models.Department{}, } for _, item := range values { diff --git a/web/.gitignore b/web/.gitignore new file mode 100644 index 0000000..8ee54e8 --- /dev/null +++ b/web/.gitignore @@ -0,0 +1,30 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +*.tsbuildinfo diff --git a/web/README.md b/web/README.md new file mode 100644 index 0000000..d863828 --- /dev/null +++ b/web/README.md @@ -0,0 +1,29 @@ +# web + +This template should help get you started developing with Vue 3 in Vite. + +## Recommended IDE Setup + +[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur). + +## Customize configuration + +See [Vite Configuration Reference](https://vite.dev/config/). + +## Project Setup + +```sh +npm install +``` + +### Compile and Hot-Reload for Development + +```sh +npm run dev +``` + +### Compile and Minify for Production + +```sh +npm run build +``` diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..8008388 --- /dev/null +++ b/web/index.html @@ -0,0 +1,17 @@ + + + + + + + + MOTO + + + + +
+ + + + \ No newline at end of file diff --git a/web/jsconfig.json b/web/jsconfig.json new file mode 100644 index 0000000..5a1f2d2 --- /dev/null +++ b/web/jsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "paths": { + "@/*": ["./src/*"] + } + }, + "exclude": ["node_modules", "dist"] +} diff --git a/web/package-lock.json b/web/package-lock.json new file mode 100644 index 0000000..d25a8d7 --- /dev/null +++ b/web/package-lock.json @@ -0,0 +1,4631 @@ +{ + "name": "web", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "web", + "version": "0.0.0", + "dependencies": { + "@element-plus/icons-vue": "^2.3.1", + "axios": "^1.7.9", + "color": "^4.2.3", + "dayjs": "^1.11.13", + "element-plus": "^2.9.0", + "normalize.css": "^8.0.1", + "pinia": "^2.2.6", + "pinia-plugin-persistedstate": "^4.1.3", + "pluralize": "^8.0.0", + "query-string": "^9.1.1", + "sass": "^1.82.0", + "screenfull": "^6.0.2", + "vue": "^3.5.13", + "vue-router": "^4.4.5", + "vue3-puzzle-vcode": "^1.1.7" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^5.2.1", + "vite": "^6.0.1", + "vite-plugin-vue-devtools": "^7.6.5" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@antfu/utils": { + "version": "0.7.10", + "resolved": "https://registry.npmmirror.com/@antfu/utils/-/utils-0.7.10.tgz", + "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.3", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.26.3.tgz", + "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.0", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.3", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.26.3.tgz", + "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.26.3", + "@babel/types": "^7.26.3", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.9", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.9", + "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.25.9", + "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.25.9", + "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", + "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.9", + "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.0", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.3", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.3" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.25.9", + "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz", + "integrity": "sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-decorators": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.25.9", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz", + "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.26.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz", + "integrity": "sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/standalone": { + "version": "7.26.4", + "resolved": "https://registry.npmmirror.com/@babel/standalone/-/standalone-7.26.4.tgz", + "integrity": "sha512-SF+g7S2mhTT1b7CHyfNjDkPU1corxg4LPYsyP0x5KuCl+EbtBQHRLqr9N3q7e7+x7NQ5LYxQf8mJ2PmzebLr0A==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.4", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.26.4.tgz", + "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.3", + "@babel/parser": "^7.26.3", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.3", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.3", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@element-plus/icons-vue": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz", + "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==", + "license": "MIT", + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", + "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.24.0.tgz", + "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", + "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.24.0.tgz", + "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", + "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", + "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", + "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", + "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", + "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", + "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", + "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", + "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", + "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", + "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", + "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", + "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", + "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", + "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", + "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", + "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", + "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", + "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", + "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", + "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.8", + "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.6.8.tgz", + "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.8" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.12", + "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.6.12.tgz", + "integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.8" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.8", + "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.8.tgz", + "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==", + "license": "MIT" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nuxt/kit": { + "version": "3.14.1592", + "resolved": "https://registry.npmmirror.com/@nuxt/kit/-/kit-3.14.1592.tgz", + "integrity": "sha512-r9r8bISBBisvfcNgNL3dSIQHSBe0v5YkX5zwNblIC2T0CIEgxEVoM5rq9O5wqgb5OEydsHTtT2hL57vdv6VT2w==", + "license": "MIT", + "dependencies": { + "@nuxt/schema": "3.14.1592", + "c12": "^2.0.1", + "consola": "^3.2.3", + "defu": "^6.1.4", + "destr": "^2.0.3", + "globby": "^14.0.2", + "hash-sum": "^2.0.0", + "ignore": "^6.0.2", + "jiti": "^2.4.0", + "klona": "^2.0.6", + "knitwork": "^1.1.0", + "mlly": "^1.7.3", + "pathe": "^1.1.2", + "pkg-types": "^1.2.1", + "scule": "^1.3.0", + "semver": "^7.6.3", + "ufo": "^1.5.4", + "unctx": "^2.3.1", + "unimport": "^3.13.2", + "untyped": "^1.5.1" + }, + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/@nuxt/kit/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nuxt/schema": { + "version": "3.14.1592", + "resolved": "https://registry.npmmirror.com/@nuxt/schema/-/schema-3.14.1592.tgz", + "integrity": "sha512-A1d/08ueX8stTXNkvGqnr1eEXZgvKn+vj6s7jXhZNWApUSqMgItU4VK28vrrdpKbjIPwq2SwhnGOHUYvN9HwCQ==", + "license": "MIT", + "dependencies": { + "c12": "^2.0.1", + "compatx": "^0.1.8", + "consola": "^3.2.3", + "defu": "^6.1.4", + "hookable": "^5.5.3", + "pathe": "^1.1.2", + "pkg-types": "^1.2.1", + "scule": "^1.3.0", + "std-env": "^3.8.0", + "ufo": "^1.5.4", + "uncrypto": "^0.1.3", + "unimport": "^3.13.2", + "untyped": "^1.5.1" + }, + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.5.0.tgz", + "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.0", + "@parcel/watcher-darwin-arm64": "2.5.0", + "@parcel/watcher-darwin-x64": "2.5.0", + "@parcel/watcher-freebsd-x64": "2.5.0", + "@parcel/watcher-linux-arm-glibc": "2.5.0", + "@parcel/watcher-linux-arm-musl": "2.5.0", + "@parcel/watcher-linux-arm64-glibc": "2.5.0", + "@parcel/watcher-linux-arm64-musl": "2.5.0", + "@parcel/watcher-linux-x64-glibc": "2.5.0", + "@parcel/watcher-linux-x64-musl": "2.5.0", + "@parcel/watcher-win32-arm64": "2.5.0", + "@parcel/watcher-win32-ia32": "2.5.0", + "@parcel/watcher-win32-x64": "2.5.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", + "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", + "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", + "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", + "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", + "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", + "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", + "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", + "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", + "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", + "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", + "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", + "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", + "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.28", + "resolved": "https://registry.npmmirror.com/@polka/url/-/url-1.0.0-next.28.tgz", + "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@popperjs/core": { + "name": "@sxzz/popperjs-es", + "version": "2.11.7", + "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", + "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.3", + "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.1.3.tgz", + "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.28.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz", + "integrity": "sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.28.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz", + "integrity": "sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.28.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz", + "integrity": "sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.28.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz", + "integrity": "sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.28.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz", + "integrity": "sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.28.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz", + "integrity": "sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.28.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz", + "integrity": "sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.28.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz", + "integrity": "sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.28.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz", + "integrity": "sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.28.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz", + "integrity": "sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.28.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz", + "integrity": "sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.28.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz", + "integrity": "sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.28.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz", + "integrity": "sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.28.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz", + "integrity": "sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.28.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz", + "integrity": "sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.28.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz", + "integrity": "sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.28.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz", + "integrity": "sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.28.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz", + "integrity": "sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.28.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz", + "integrity": "sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.13", + "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.13.tgz", + "integrity": "sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==", + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.16", + "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", + "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz", + "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.2.5.tgz", + "integrity": "sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.2.5.tgz", + "integrity": "sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.6", + "@babel/types": "^7.25.6", + "@vue/babel-helper-vue-transform-on": "1.2.5", + "@vue/babel-plugin-resolve-type": "1.2.5", + "html-tags": "^3.3.1", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@vue/babel-plugin-resolve-type": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.2.5.tgz", + "integrity": "sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/parser": "^7.25.6", + "@vue/compiler-sfc": "^3.5.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.13", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.13.tgz", + "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/shared": "3.5.13", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.13", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", + "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.13", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", + "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/compiler-core": "3.5.13", + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.11", + "postcss": "^8.4.48", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.13", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", + "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/@vue/devtools-core": { + "version": "7.6.8", + "resolved": "https://registry.npmmirror.com/@vue/devtools-core/-/devtools-core-7.6.8.tgz", + "integrity": "sha512-8X4roysTwzQ94o7IobjVcOd1aZF5iunikrMrHPI2uUdigZCi2kFTQc7ffYiFiTNaLElCpjOhCnM7bo7aK1yU7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.6.8", + "@vue/devtools-shared": "^7.6.8", + "mitt": "^3.0.1", + "nanoid": "^5.0.9", + "pathe": "^1.1.2", + "vite-hot-client": "^0.2.4" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@vue/devtools-core/node_modules/nanoid": { + "version": "5.0.9", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-5.0.9.tgz", + "integrity": "sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.6.8", + "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.6.8.tgz", + "integrity": "sha512-JhJ8M3sPU+v0P2iZBF2DkdmR9L0dnT5RXJabJqX6o8KtFs3tebdvfoXV2Dm3BFuqeECuMJIfF1aCzSt+WQ4wrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.6.8", + "birpc": "^0.2.19", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.1" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.6.8", + "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.6.8.tgz", + "integrity": "sha512-9MBPO5Z3X1nYGFqTJyohl6Gmf/J7UNN1oicHdyzBVZP4jnhZ4c20MgtaHDIzWmHDHCMYVS5bwKxT3jxh7gOOKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.13", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.13.tgz", + "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.13", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.13.tgz", + "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.13", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz", + "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.13", + "@vue/runtime-core": "3.5.13", + "@vue/shared": "3.5.13", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.13", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.13.tgz", + "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13" + }, + "peerDependencies": { + "vue": "3.5.13" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.13", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.13.tgz", + "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "9.13.0", + "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz", + "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.16", + "@vueuse/metadata": "9.13.0", + "@vueuse/shared": "9.13.0", + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/metadata": { + "version": "9.13.0", + "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz", + "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "9.13.0", + "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz", + "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", + "license": "MIT", + "dependencies": { + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.7.9", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/birpc": { + "version": "0.2.19", + "resolved": "https://registry.npmmirror.com/birpc/-/birpc-0.2.19.tgz", + "integrity": "sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.2", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/c12": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/c12/-/c12-2.0.1.tgz", + "integrity": "sha512-Z4JgsKXHG37C6PYUtIxCfLJZvo6FyhHJoClwwb9ftUkLpPSkuYqn6Tr+vnaN8hymm0kIbcg6Ey3kv/Q71k5w/A==", + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.1", + "confbox": "^0.1.7", + "defu": "^6.1.4", + "dotenv": "^16.4.5", + "giget": "^1.2.3", + "jiti": "^2.3.0", + "mlly": "^1.7.1", + "ohash": "^1.1.4", + "pathe": "^1.1.2", + "perfect-debounce": "^1.0.0", + "pkg-types": "^1.2.0", + "rc9": "^2.1.2" + }, + "peerDependencies": { + "magicast": "^0.3.5" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001687", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", + "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chokidar": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.1.tgz", + "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmmirror.com/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compatx": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/compatx/-/compatx-0.1.8.tgz", + "integrity": "sha512-jcbsEAR81Bt5s1qOFymBufmCbXCXbk0Ql+K5ouj6gCyx2yHlu6AgmGIi9HxfKixpUDO5bCFJUHQ5uM6ecbTebw==", + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "license": "MIT" + }, + "node_modules/consola": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/consola/-/consola-3.2.3.tgz", + "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-uri-component": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.4.1.tgz", + "integrity": "sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/deep-pick-omit": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/deep-pick-omit/-/deep-pick-omit-1.2.1.tgz", + "integrity": "sha512-2J6Kc/m3irCeqVG42T+SaUMesaK7oGWaedGnQQK/+O0gYc+2SP5bKh/KKTE7d7SJ+GCA9UUE1GRzh6oDe0EnGw==", + "license": "MIT" + }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmmirror.com/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/destr": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/destr/-/destr-2.0.3.tgz", + "integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.73", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.73.tgz", + "integrity": "sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg==", + "license": "ISC" + }, + "node_modules/element-plus": { + "version": "2.9.0", + "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.9.0.tgz", + "integrity": "sha512-ccOFXKsauo2dtokAr4OX7gZsb7TuAoVxA2zGRZo5o2yyDDBLBaZxOoFQPoxITSLcHbBfQuNDGK5Iag5hnyKkZA==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^3.4.1", + "@element-plus/icons-vue": "^2.3.1", + "@floating-ui/dom": "^1.0.1", + "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", + "@types/lodash": "^4.14.182", + "@types/lodash-es": "^4.17.6", + "@vueuse/core": "^9.1.0", + "async-validator": "^4.2.5", + "dayjs": "^1.11.13", + "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.2.0" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-stack-parser-es": { + "version": "0.1.5", + "resolved": "https://registry.npmmirror.com/error-stack-parser-es/-/error-stack-parser-es-0.1.5.tgz", + "integrity": "sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/esbuild": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.24.0.tgz", + "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.0", + "@esbuild/android-arm": "0.24.0", + "@esbuild/android-arm64": "0.24.0", + "@esbuild/android-x64": "0.24.0", + "@esbuild/darwin-arm64": "0.24.0", + "@esbuild/darwin-x64": "0.24.0", + "@esbuild/freebsd-arm64": "0.24.0", + "@esbuild/freebsd-x64": "0.24.0", + "@esbuild/linux-arm": "0.24.0", + "@esbuild/linux-arm64": "0.24.0", + "@esbuild/linux-ia32": "0.24.0", + "@esbuild/linux-loong64": "0.24.0", + "@esbuild/linux-mips64el": "0.24.0", + "@esbuild/linux-ppc64": "0.24.0", + "@esbuild/linux-riscv64": "0.24.0", + "@esbuild/linux-s390x": "0.24.0", + "@esbuild/linux-x64": "0.24.0", + "@esbuild/netbsd-x64": "0.24.0", + "@esbuild/openbsd-arm64": "0.24.0", + "@esbuild/openbsd-x64": "0.24.0", + "@esbuild/sunos-x64": "0.24.0", + "@esbuild/win32-arm64": "0.24.0", + "@esbuild/win32-ia32": "0.24.0", + "@esbuild/win32-x64": "0.24.0" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/execa": { + "version": "9.5.2", + "resolved": "https://registry.npmmirror.com/execa/-/execa-9.5.2.tgz", + "integrity": "sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.3", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.0", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/filter-obj": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/filter-obj/-/filter-obj-5.1.0.tgz", + "integrity": "sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/giget": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/giget/-/giget-1.2.3.tgz", + "integrity": "sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==", + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.2.3", + "defu": "^6.1.4", + "node-fetch-native": "^1.6.3", + "nypm": "^0.3.8", + "ohash": "^1.1.3", + "pathe": "^1.1.2", + "tar": "^6.2.0" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "14.0.2", + "resolved": "https://registry.npmmirror.com/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/globby/node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "license": "MIT" + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/human-signals": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-8.0.0.tgz", + "integrity": "sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/ignore": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-6.0.2.tgz", + "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/immutable/-/immutable-5.0.3.tgz", + "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", + "license": "MIT" + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT" + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmmirror.com/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/jiti/-/jiti-2.4.1.tgz", + "integrity": "sha512-yPBThwecp1wS9DmoA4x4KR2h3QoslacnDR8ypuFM962kI4/456Iy1oHx2RAgh4jfZNdn0bctsdadceiBUgpU1g==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/knitwork": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/knitwork/-/knitwork-1.1.0.tgz", + "integrity": "sha512-oHnmiBUVHz1V+URE77PNot2lv3QiYU2zQf1JjOVkMt3YDKGbu8NAFr+c4mcNOhdsGrB/VpVbRwPwhiXrPhxQbw==", + "license": "MIT" + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/local-pkg": { + "version": "0.5.1", + "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.5.1.tgz", + "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", + "license": "MIT", + "dependencies": { + "mlly": "^1.7.3", + "pkg-types": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/lodash-unified": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz", + "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", + "license": "MIT", + "peerDependencies": { + "@types/lodash-es": "*", + "lodash": "*", + "lodash-es": "*" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.15", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.15.tgz", + "integrity": "sha512-zXeaYRgZ6ldS1RJJUrMrYgNJ4fdwnyI6tVqoiIhyCyv5IVTK9BU8Ic2l253GGETQHxI4HNUwhJ3fjDhKqEoaAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true, + "license": "MIT" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mlly": { + "version": "1.7.3", + "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.7.3.tgz", + "integrity": "sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==", + "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "pathe": "^1.1.2", + "pkg-types": "^1.2.1", + "ufo": "^1.5.4" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT", + "optional": true + }, + "node_modules/node-fetch-native": { + "version": "1.6.4", + "resolved": "https://registry.npmmirror.com/node-fetch-native/-/node-fetch-native-1.6.4.tgz", + "integrity": "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "license": "MIT" + }, + "node_modules/normalize-wheel-es": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", + "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==", + "license": "BSD-3-Clause" + }, + "node_modules/normalize.css": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/normalize.css/-/normalize.css-8.0.1.tgz", + "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==", + "license": "MIT" + }, + "node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nypm": { + "version": "0.3.12", + "resolved": "https://registry.npmmirror.com/nypm/-/nypm-0.3.12.tgz", + "integrity": "sha512-D3pzNDWIvgA+7IORhD/IuWzEk4uXv6GsgOxiid4UU3h9oq5IqV1KtPDi63n4sZJ/xcWlr88c0QM2RgN5VbOhFA==", + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.2.3", + "execa": "^8.0.1", + "pathe": "^1.1.2", + "pkg-types": "^1.2.0", + "ufo": "^1.5.4" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": "^14.16.0 || >=16.10.0" + } + }, + "node_modules/nypm/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/nypm/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nypm/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/nypm/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nypm/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nypm/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nypm/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ohash": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/ohash/-/ohash-1.1.4.tgz", + "integrity": "sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==", + "license": "MIT" + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/open/-/open-10.1.0.tgz", + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pinia": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.3.0.tgz", + "integrity": "sha512-ohZj3jla0LL0OH5PlLTDMzqKiVw2XARmC1XYLdLWIPBMdhDW/123ZWr4zVAhtJm+aoSkFa13pYXskAvAscIkhQ==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.3", + "vue-demi": "^0.14.10" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.4.4", + "vue": "^2.7.0 || ^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia-plugin-persistedstate": { + "version": "4.1.3", + "resolved": "https://registry.npmmirror.com/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-4.1.3.tgz", + "integrity": "sha512-5Rad7oSoEh0na+j4jEViVQMtAYE38KjU7ixKc+am33QX/clJ1mb19zTZqMJXvq+PnQW7uuEuL33Q6NL0GbkfWw==", + "license": "MIT", + "dependencies": { + "@nuxt/kit": "^3.13.2", + "deep-pick-omit": "^1.2.1", + "defu": "^6.1.4", + "destr": "^2.0.3" + }, + "peerDependencies": { + "@pinia/nuxt": ">=0.5.0", + "pinia": ">=2.0.0" + }, + "peerDependenciesMeta": { + "@pinia/nuxt": { + "optional": true + }, + "pinia": { + "optional": true + } + } + }, + "node_modules/pkg-types": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.2.1.tgz", + "integrity": "sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.2", + "pathe": "^1.1.2" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/pretty-ms": { + "version": "9.2.0", + "resolved": "https://registry.npmmirror.com/pretty-ms/-/pretty-ms-9.2.0.tgz", + "integrity": "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/query-string": { + "version": "9.1.1", + "resolved": "https://registry.npmmirror.com/query-string/-/query-string-9.1.1.tgz", + "integrity": "sha512-MWkCOVIcJP9QSKU52Ngow6bsAWAPlPK2MludXvcrS2bGZSl+T1qX9MZvRIkqUIkGLJquMJHWfsT6eRqUpp4aWg==", + "license": "MIT", + "dependencies": { + "decode-uri-component": "^0.4.1", + "filter-obj": "^5.1.0", + "split-on-first": "^3.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/rc9": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/rc9/-/rc9-2.1.2.tgz", + "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", + "license": "MIT", + "dependencies": { + "defu": "^6.1.4", + "destr": "^2.0.3" + } + }, + "node_modules/readdirp": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "license": "MIT", + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.28.1", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.28.1.tgz", + "integrity": "sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.28.1", + "@rollup/rollup-android-arm64": "4.28.1", + "@rollup/rollup-darwin-arm64": "4.28.1", + "@rollup/rollup-darwin-x64": "4.28.1", + "@rollup/rollup-freebsd-arm64": "4.28.1", + "@rollup/rollup-freebsd-x64": "4.28.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.28.1", + "@rollup/rollup-linux-arm-musleabihf": "4.28.1", + "@rollup/rollup-linux-arm64-gnu": "4.28.1", + "@rollup/rollup-linux-arm64-musl": "4.28.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.28.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.28.1", + "@rollup/rollup-linux-riscv64-gnu": "4.28.1", + "@rollup/rollup-linux-s390x-gnu": "4.28.1", + "@rollup/rollup-linux-x64-gnu": "4.28.1", + "@rollup/rollup-linux-x64-musl": "4.28.1", + "@rollup/rollup-win32-arm64-msvc": "4.28.1", + "@rollup/rollup-win32-ia32-msvc": "4.28.1", + "@rollup/rollup-win32-x64-msvc": "4.28.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sass": { + "version": "1.82.0", + "resolved": "https://registry.npmmirror.com/sass/-/sass-1.82.0.tgz", + "integrity": "sha512-j4GMCTa8elGyN9A7x7bEglx0VgSpNUG4W4wNedQ33wSMdnkqQCT8HTwOaVSV4e6yQovcu/3Oc4coJP/l0xhL2Q==", + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/screenfull": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/screenfull/-/screenfull-6.0.2.tgz", + "integrity": "sha512-AQdy8s4WhNvUZ6P8F6PB21tSPIYKniic+Ogx0AacBMjKP1GUHN2E9URxQHtCusiwxudnCKkdy4GrHXPPJSkCCw==", + "license": "MIT", + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/sirv": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/sirv/-/sirv-3.0.0.tgz", + "integrity": "sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmmirror.com/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-on-first": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/split-on-first/-/split-on-first-3.0.0.tgz", + "integrity": "sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/std-env": { + "version": "3.8.0", + "resolved": "https://registry.npmmirror.com/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", + "license": "MIT" + }, + "node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-2.1.1.tgz", + "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "license": "MIT" + }, + "node_modules/superjson": { + "version": "2.2.2", + "resolved": "https://registry.npmmirror.com/superjson/-/superjson-2.2.2.tgz", + "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmmirror.com/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/to-regex-range": { + "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==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ufo": { + "version": "1.5.4", + "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.5.4.tgz", + "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", + "license": "MIT" + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", + "license": "MIT" + }, + "node_modules/unctx": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/unctx/-/unctx-2.4.0.tgz", + "integrity": "sha512-VSwGlVn3teRLkFS9OH4JoZ25ky133vVPQkS6qHv/itYVrqHBa+7SO46Yh07Zve1WEi9A1X135g9DR6KMv6ZsJg==", + "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.15", + "unplugin": "^2.0.0" + } + }, + "node_modules/unctx/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unimport": { + "version": "3.14.5", + "resolved": "https://registry.npmmirror.com/unimport/-/unimport-3.14.5.tgz", + "integrity": "sha512-tn890SwFFZxqaJSKQPPd+yygfKSATbM8BZWW1aCR2TJBTs1SDrmLamBueaFtYsGjHtQaRgqEbQflOjN2iW12gA==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.3", + "acorn": "^8.14.0", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "fast-glob": "^3.3.2", + "local-pkg": "^0.5.1", + "magic-string": "^0.30.14", + "mlly": "^1.7.3", + "pathe": "^1.1.2", + "picomatch": "^4.0.2", + "pkg-types": "^1.2.1", + "scule": "^1.3.0", + "strip-literal": "^2.1.1", + "unplugin": "^1.16.0" + } + }, + "node_modules/unimport/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/unimport/node_modules/unplugin": { + "version": "1.16.0", + "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-1.16.0.tgz", + "integrity": "sha512-5liCNPuJW8dqh3+DM6uNM2EI3MLLpCKp/KY+9pB5M2S2SR2qvvDHhKgBOaTWEbZTAws3CXfB0rKTIolWKL05VQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unplugin": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-2.1.0.tgz", + "integrity": "sha512-us4j03/499KhbGP8BU7Hrzrgseo+KdfJYWcbcajCOqsAyb8Gk0Yn2kiUIcZISYCb1JFaZfIuG3b42HmguVOKCQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/untyped": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/untyped/-/untyped-1.5.1.tgz", + "integrity": "sha512-reBOnkJBFfBZ8pCKaeHgfZLcehXtM6UTxc+vqs1JvCps0c4amLNp3fhdGBZwYp+VLyoY9n3X5KOP7lCyWBUX9A==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.25.7", + "@babel/standalone": "^7.25.7", + "@babel/types": "^7.25.7", + "defu": "^6.1.4", + "jiti": "^2.3.1", + "mri": "^1.2.0", + "scule": "^1.3.0" + }, + "bin": { + "untyped": "dist/cli.mjs" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/vite": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/vite/-/vite-6.0.3.tgz", + "integrity": "sha512-Cmuo5P0ENTN6HxLSo6IHsjCLn/81Vgrp81oaiFFMRa8gGDj5xEjIcEpf2ZymZtZR8oU0P2JX5WuUp/rlXcHkAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.24.0", + "postcss": "^8.4.49", + "rollup": "^4.23.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-hot-client": { + "version": "0.2.4", + "resolved": "https://registry.npmmirror.com/vite-hot-client/-/vite-hot-client-0.2.4.tgz", + "integrity": "sha512-a1nzURqO7DDmnXqabFOliz908FRmIppkBKsJthS8rbe8hBEXwEwe4C3Pp33Z1JoFCYfVL4kTOMLKk0ZZxREIeA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0" + } + }, + "node_modules/vite-plugin-inspect": { + "version": "0.8.9", + "resolved": "https://registry.npmmirror.com/vite-plugin-inspect/-/vite-plugin-inspect-0.8.9.tgz", + "integrity": "sha512-22/8qn+LYonzibb1VeFZmISdVao5kC22jmEKm24vfFE8siEn47EpVcCLYMv6iKOYMJfjSvSJfueOwcFCkUnV3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@antfu/utils": "^0.7.10", + "@rollup/pluginutils": "^5.1.3", + "debug": "^4.3.7", + "error-stack-parser-es": "^0.1.5", + "fs-extra": "^11.2.0", + "open": "^10.1.0", + "perfect-debounce": "^1.0.0", + "picocolors": "^1.1.1", + "sirv": "^3.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.1" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/vite-plugin-vue-devtools": { + "version": "7.6.8", + "resolved": "https://registry.npmmirror.com/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-7.6.8.tgz", + "integrity": "sha512-32aIps8C1Y7UEoqyWf+ES3J1OozsCYMIqTqd+I5qass+R0Tcf8SaA2bX1/rskAzkcKCteVoBjEENmqwTcMebbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-core": "^7.6.8", + "@vue/devtools-kit": "^7.6.8", + "@vue/devtools-shared": "^7.6.8", + "execa": "^9.5.1", + "sirv": "^3.0.0", + "vite-plugin-inspect": "~0.8.9", + "vite-plugin-vue-inspector": "^5.3.1" + }, + "engines": { + "node": ">=v14.21.3" + }, + "peerDependencies": { + "vite": "^3.1.0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0" + } + }, + "node_modules/vite-plugin-vue-inspector": { + "version": "5.3.1", + "resolved": "https://registry.npmmirror.com/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-5.3.1.tgz", + "integrity": "sha512-cBk172kZKTdvGpJuzCCLg8lJ909wopwsu3Ve9FsL1XsnLBiRT9U3MePcqrgGHgCX2ZgkqZmAGR8taxw+TV6s7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.0", + "@babel/plugin-proposal-decorators": "^7.23.0", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.22.15", + "@vue/babel-plugin-jsx": "^1.1.5", + "@vue/compiler-dom": "^3.3.4", + "kolorist": "^1.8.0", + "magic-string": "^0.30.4" + }, + "peerDependencies": { + "vite": "^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0" + } + }, + "node_modules/vue": { + "version": "3.5.13", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.13.tgz", + "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-sfc": "3.5.13", + "@vue/runtime-dom": "3.5.13", + "@vue/server-renderer": "3.5.13", + "@vue/shared": "3.5.13" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.5.0.tgz", + "integrity": "sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue3-puzzle-vcode": { + "version": "1.1.7", + "resolved": "https://registry.npmmirror.com/vue3-puzzle-vcode/-/vue3-puzzle-vcode-1.1.7.tgz", + "integrity": "sha512-mW780dz7HKjrElnE60CeYSeHGidKBKHoMjTDYfqF21330rTkFOsfDK1FQKZ22MktgMtTEoS/imfpEDlM1cxY/g==" + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yoctocolors": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/yoctocolors/-/yoctocolors-2.1.1.tgz", + "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/web/package.json b/web/package.json new file mode 100644 index 0000000..fecf0aa --- /dev/null +++ b/web/package.json @@ -0,0 +1,33 @@ +{ + "name": "web", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@element-plus/icons-vue": "^2.3.1", + "axios": "^1.7.9", + "color": "^4.2.3", + "dayjs": "^1.11.13", + "element-plus": "^2.9.0", + "normalize.css": "^8.0.1", + "pinia": "^2.2.6", + "pinia-plugin-persistedstate": "^4.1.3", + "pluralize": "^8.0.0", + "query-string": "^9.1.1", + "sass": "^1.82.0", + "screenfull": "^6.0.2", + "vue": "^3.5.13", + "vue-router": "^4.4.5", + "vue3-puzzle-vcode": "^1.1.7" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^5.2.1", + "vite": "^6.0.1", + "vite-plugin-vue-devtools": "^7.6.5" + } +} diff --git a/web/public/favicon.ico b/web/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..df36fcfb72584e00488330b560ebcf34a41c64c2 GIT binary patch literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S literal 0 HcmV?d00001 diff --git a/web/src/App.vue b/web/src/App.vue new file mode 100644 index 0000000..2279844 --- /dev/null +++ b/web/src/App.vue @@ -0,0 +1,47 @@ + + + \ No newline at end of file diff --git a/web/src/apis/organize.js b/web/src/apis/organize.js new file mode 100644 index 0000000..083f9eb --- /dev/null +++ b/web/src/apis/organize.js @@ -0,0 +1,117 @@ +import request, { getBaseUrl } from './request' + +export function getUserProfile() { + return request.get(`/user/profile`) +} + +export function getUserInfo(uid) { + return request.get(`/user/info/${uid}`) +} + +export function userLogin(username, password) { + let domain = 'test.cc.echo.me'; + if (process.env.NODE_ENV === 'production') { + domain = window.location.hostname; + } + return request.post(`/passport/login`, { + "domain": domain, + "username": username, + "password": password, + "remember": true + }) +} + +export function getUserTypes() { + return request.get('/organize/user-types') +} + +export function userLogout() { + return request.delete('/passport/logout') +} + +export function updateProfile(data) { + return request.put('/organize/profile', data) +} + +export function resetPassword(oldPwd, newPwd) { + return request.put('/organize/password', { + old_password: oldPwd, + new_password: newPwd + }) +} + +export function lastLogin() { + return request.get('/organize/last-login'); +} + +export function getNestedDepartments() { + return request.get('/organize/department-nested') +} + +export function getDepartmentUsers(id) { + return request.get(`/organize/department-users/${id}`) +} + +export function getUsers(id) { + return request.get(`/organize/user-list`) +} + +export function getClientHello() { + return request.post(`/organize/client-hello`) +} + +export function getUserAvatar(uid) { + return `${getBaseUrl()}/organize/avatar/${uid}` +} + +export function setUserAttr(name, value) { + let data = ''; + if (typeof value !== 'string') { + try { + data = JSON.stringify(value) + } catch (e) { + data = value + } + } else { + data = value + } + return request.put(`/organize/user-variable`, { + name: name, + value: data, + }) +} + +export function getUserAttr(name) { + return new Promise((resolve, reject) => { + request.get(`/organize/user-variable/${name}`).then(res => { + if (res.value) { + try { + let data = JSON.parse(res.value); + resolve(data); + } catch (e) { + resolve(res.value) + } + } else { + reject(new Error("not found")) + } + }).catch(e => { + reject(e); + }) + }) +} + +export function getUnreadMsgCount() { + return request.get(`/organize/unread/count`) +} + +export function readUserMsg(id) { + return request.put(`/organize/notice-read/${id}`) +} + +export function getDepartmentUserNested() { + return request.put(`/organize/department-users`) +} + +export function getStatusTypes() { + return request.post(`/organize/status-types`) +} \ No newline at end of file diff --git a/web/src/apis/request.js b/web/src/apis/request.js new file mode 100644 index 0000000..df4d7a6 --- /dev/null +++ b/web/src/apis/request.js @@ -0,0 +1,63 @@ + +import axios from "axios"; + + +const client = axios.create({ + baseURL: getBaseUrl() +}); + +export function getBaseHost() { + if (process.env.NODE_ENV === 'production') { + return location.host; + } else { + return 'api-dev.echo.me' + } +} + +export function getBaseUrl() { + let host = getBaseHost(); + if (process.env.NODE_ENV === 'production') { + return location.protocol + '//' + host; + } else { + return location.protocol + '//' + host + } +} + +class HttpError extends Error { + constructor(message, code) { + super(message) + this.code = code + this.name = 'HttpError' + } +} + +client.interceptors.request.use(req => { + let accessToken = sessionStorage.getItem('G_PSID1'); + if (accessToken) { + req.headers.Authorization = accessToken; + } + return req; +}) + +client.interceptors.response.use(res => { + if (res.status != 200) { + return Promise.reject(new Error(`http response ${res.status}:${res.statusText}`)) + } + if (typeof res.data === 'object' && res.data.hasOwnProperty('code')) { + if (res.data['code'] === 0) { + return res.data['data'] + } else { + return Promise.reject(new HttpError(res.data['reason'], res.data['code'])) + } + } + if (typeof res.data === 'object' && res.data.hasOwnProperty('errno')) { + if (res.data['errno'] == 0) { + return res.data['result'] + } else { + return Promise.reject(new HttpError(res.data['errmsg'], res.data['errno'])) + } + } + return res; +}) + +export default client; \ No newline at end of file diff --git a/web/src/apis/system.js b/web/src/apis/system.js new file mode 100644 index 0000000..f5a576d --- /dev/null +++ b/web/src/apis/system.js @@ -0,0 +1,15 @@ +import request from './request' + +/** + * 连接到指定的endpoint + * @param {String} e + * @returns + */ +export function connectEndpoint(e) { + return request.put(`/endpoint/connect/${e}`) +} + + +export function getConfigure() { + return request.get(`/user/configures`) +} diff --git a/web/src/assets/js/deepcopy.js b/web/src/assets/js/deepcopy.js new file mode 100644 index 0000000..4ed074b --- /dev/null +++ b/web/src/assets/js/deepcopy.js @@ -0,0 +1,23 @@ + +export function deepCopy(v1, v2, ps) { + for (let k in v2) { + if (ps && typeof ps === 'object' && Array.isArray(ps)) { + if (ps.indexOf(k) == -1) { + continue + } + } + let v = v2[k]; + if (typeof v === 'object') { + if (!v1[k]) { + v1[k] = Array.isArray(v) ? [] : {}; + } + if (typeof v1[k] !== 'object') { + continue + } + v1[k] = deepCopy(v1[k], v) + } else { + v1[k] = v + } + } + return v1 +} \ No newline at end of file diff --git a/web/src/assets/js/formatter.js b/web/src/assets/js/formatter.js new file mode 100644 index 0000000..64ac7b4 --- /dev/null +++ b/web/src/assets/js/formatter.js @@ -0,0 +1,61 @@ +export function durationFormat(duration, sep = null) { + duration = parseInt(duration); + if (isNaN(duration)) { + return ''; + } + var hour = parseInt(duration / 3600); + var r = duration % 3600; + var min = parseInt(r / 60); + var sec = parseInt(r % 60); + hour = isNaN(hour) ? 0 : hour; + min = isNaN(min) ? 0 : min; + sec = isNaN(sec) ? 0 : sec; + if (sep) { + hour = hour > 9 ? hour : '0' + hour + min = min > 9 ? min : '0' + min + sec = sec > 9 ? sec : '0' + sec + return hour + sep + min + sep + sec; + } else { + let s = ''; + if (hour > 0) { + s += hour + "h" + } + if (min > 0 || s != '') { + s += min + "m" + } + s += sec + "s"; + return s; + } +} + +export function monryFormat(number, decimals = 2, decPoint = '.', thousandsSep = ',') { + number = (number + '').replace(/[^0-9+-Ee.]/g, '') + let n = !isFinite(+number) ? 0 : +number + let prec = !isFinite(+decimals) ? 0 : Math.abs(decimals) + let sep = (typeof thousandsSep === 'undefined') ? ',' : thousandsSep + let dec = (typeof decPoint === 'undefined') ? '.' : decPoint + let s = '' + let toFixedFix = function (n, prec) { + let k = Math.pow(10, prec) + return '' + Math.ceil(n * k) / k + } + s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.') + let re = /(-?\d+)(\d{3})/ + while (re.test(s[0])) { + s[0] = s[0].replace(re, '$1' + sep + '$2') + } + if ((s[1] || '').length < prec) { + s[1] = s[1] || '' + s[1] += new Array(prec - s[1].length + 1).join('0') + } + return s.join(dec) +} + +export function byteFormat(bytes) { + if (bytes === 0) return '0 B'; + var k = 1024; + let sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; + let i = Math.floor(Math.log(bytes) / Math.log(k)) //return (bytes / Math.pow(k, i)) + ' ' + sizes[i]; + + return (bytes / Math.pow(k, i)).toPrecision(3) + ' ' + sizes[i]; +} \ No newline at end of file diff --git a/web/src/assets/js/menu.js b/web/src/assets/js/menu.js new file mode 100644 index 0000000..7dcf012 --- /dev/null +++ b/web/src/assets/js/menu.js @@ -0,0 +1,184 @@ +import rawMenus from '@/config/menu' +import pluralize from 'pluralize' +import { deepCopy } from './deepcopy'; + +function capitalize(s) { + return s.replace(/\b(\w)(\w*)/g, ($0, $1, $2) => { + return $1.toUpperCase() + $2.toLowerCase(); + }) +} + +/** + * 获取所有的菜单数据 + * @returns + */ +export function getMenus() { + let cloneMenus = deepCopy(rawMenus) + return cloneMenus +} + +/** + * 序列化对象 + * @param {Object} menu + * @returns + */ +export function nameize(menu) { + let componentName = menu.name || ''; + if (componentName === '') { + componentName = menu.route.substr(1).split('/').map(v => { + return v[0] === ":" ? "" : capitalize(pluralize.singular(v)); + }).join('') + } + return componentName +} + +/** + * 查找指定路由的导航路径 + * @param {Array} values + * @param {String} target + */ +export function findNavigation(values, target) { + let paths = []; + for (let i in values) { + let row = values[i]; + if (row.route && row.route === target) { + paths.push({ + navigation: row.navigation || false, + label: row.label, + route: row.route + }) + return paths; + } + if (row.children && Array.isArray(row.children)) { + let vs = findNavigation(row.children, target); + if (Array.isArray(vs)) { + paths.push({ + navigation: row.navigation || false, + label: row.label, + route: row.route + }); + for (let j in vs) { + paths.push(vs[j]) + } + return paths; + } + } + } + return false; +} + +/** + * 通过菜单配置构建菜单菜单路由组件 + * @param {Array} rows + * @param {Object} components + * @returns + */ +export function buildRoutes(rows, components) { + let routes = []; + for (let menu of rows) { + let route = { name: '', path: menu.route || '/', meta: {}, component: null, props: {} } + route.meta.title = menu.label || ''; + route.props.title = route.meta.title + route.name = nameize(menu) + route.meta.hidden = menu.hidden ? true : false + route.meta.cache = menu.cache ? true : false + if (menu.permissions) { + route.meta.permissions = menu.permissions + } + let viewPath = menu.view; + if (!viewPath) { + let tokens = menu.route.substr(1).split('/').map((v) => { + return v[0] === ":" ? "" : v; + }).filter((v) => { + return v !== ""; + }) + let totalLength = tokens.length; + if (totalLength > 0) { + if (totalLength == 1 || pluralize.isPlural(tokens[totalLength - 1])) { + if (pluralize.isPlural(tokens[totalLength - 1])) { + tokens[totalLength - 1] = pluralize.singular(tokens[totalLength - 1]) + } + tokens.push('index'); + totalLength++; + } + tokens[totalLength - 1] = capitalize(tokens[totalLength - 1]); + } + viewPath = '../views/' + tokens.join("/") + ".vue" + } + if (components[viewPath]) { + route.component = components[viewPath] + } + if (Array.isArray(menu.children)) { + for (let child of buildRoutes(menu.children, components)) { + if (!child.meta) { + child.meta = {}; + } + child.meta.children = true; + child.meta.route = { + parent: menu.route + } + routes.push(child); + } + } + routes.push(route); + } + return routes; +} + +/** + * 判断该路由是否有权限访问 + * @param {Object} row + * @param {Array} permissions + * @returns + */ +function isAllowed(row, permissions) { + if (row.access && row.access == 'allow') { + return true + } + let name = nameize(row) + if (permissions.indexOf(name) > -1) { + return true + } + //只要有页面下面一个权限,那么就要显示该页面 + if (Array.isArray(row.permissions)) { + for (let per of row.permissions) { + if (permissions.indexOf(name + '.' + per)) { + return true + } + } + } + //只要有一个子项目有权限,那么他就有权限 + if (Array.isArray(row.children)) { + for (let child of row.children) { + if (isAllowed(child, permissions)) { + return true; + } + } + } + return false +} + +function filterMenusInner(items, permissions) { + let data = []; + for (let i in items) { + let row = Object.assign({}, items[i]); + if (!row.hidden) { + if (isAllowed(row, permissions)) { + if (Array.isArray(row.children)) { + row.children = filterMenusInner(row.children, permissions) + } + data.push(row) + } + } + } + return data +} + +/** + * 过滤有权限的菜单 + * @param {Array} permissions + * @returns + */ +export function filterMenus(permissions) { + return filterMenusInner(getMenus(), permissions) +} \ No newline at end of file diff --git a/web/src/assets/js/status.js b/web/src/assets/js/status.js new file mode 100644 index 0000000..b4999b6 --- /dev/null +++ b/web/src/assets/js/status.js @@ -0,0 +1,125 @@ + +import Color from 'color' + +let statusMap = [ + { + "label": "空闲", + "value": "idle", + "color": "#198754", + "retain": false + }, + { + "label": "忙碌", + "value": "onBreak", + "color": "#F09D00", + "retain": false + }, + { + "label": "用餐", + "value": "dining", + "color": "#83261e", + "retain": false + }, + { + "label": "休假", + "value": "holiday", + "color": "#b3261e", + "retain": false + }, + { + "label": "振铃", + "value": "ringing", + "color": "#e63757", + "retain": true + }, + { + "label": "通话", + "value": "answer", + "color": "#b3261e", + "retain": true + }, + { + "label": "静音", + "value": "muted", + "color": "#34AB62", + "retain": true + }, + { + "label": "转接", + "value": "transfer", + "color": "#C8D541", + "retain": true + }, + { + "label": "耳语", + "value": "whisper", + "color": "#43539D", + "retain": true + }, + { + "label": "监听", + "value": "eavesdrop", + "color": "#0824F8", + "retain": true + }, + { + "label": "未注册", + "value": "unavailable", + "color": "#bbbbbb", + "retain": true + }, + { + "label": "话后", + "value": "wrapUp", + "color": "#E36B09", + "retain": true + } +] + +const statusList = ['answer', 'transfer', 'whisper', 'eavesdrop', 'ringing', 'idle', 'onBreak']; + + +export function updateStatusMap(x) { + if (Array.isArray(x)) { + statusMap = x; + } +} + +export function getStatusPosition(s) { + let pos = statusList.indexOf(s); + if (pos === -1) { + pos = statusList.length + 1 + } + return pos +} + +export function getUserStatus() { + return statusMap.filter(v => { + return !v.retain; + }) +} + +export function getStatusText(s) { + for (let i in statusMap) { + let row = statusMap[i]; + if (row.value === s) { + return row.label; + } + } + return s; +} + +export function getStatusTextColor(s) { + for (let i in statusMap) { + let row = statusMap[i]; + if (row.value === s) { + return row.color; + } + } + return '#1c1d21' +} + +export function getStatusBGColor(s) { + let c = getStatusTextColor(s); + return Color(c).fade(0.8).hsl() +} \ No newline at end of file diff --git a/web/src/assets/scss/common.scss b/web/src/assets/scss/common.scss new file mode 100644 index 0000000..e6b6138 --- /dev/null +++ b/web/src/assets/scss/common.scss @@ -0,0 +1,562 @@ +#app { + --el-text-color-primary: #213547; + --el-text-color-muted: #95aac9; + --form-control-width: 210px; + --box-shadow: 0px 0px 30px 8px rgba(0, 0, 0, 0.046); + --placeholder-text-color: #c1ccdb; + --form-control-border-color: #d2ddec; + --el-color-available: #00d97e; + --el-color-link: #0067b8; + + .el-card { + margin-bottom: 1.5rem; + + } + + .el-dialog { + --el-dialog-border-radius: 6px; + + .el-dialog__title { + --el-dialog-title-font-size: .95rem; + font-weight: bold; + } + } + + .el-footer { + --el-footer-padding: 0 20px; + + .d-flex { + height: 100%; + } + } + + .cursor-pointer { + cursor: pointer; + } + + .el-tag { + border: none !important; + --el-tag-border-radius: 6px; + --el-tag-font-size: .7rem; + + &.el-tag--primary { + --el-tag-bg-color: var(--el-color-primary-light-8); + } + + &.el-tag--success { + --el-tag-bg-color: var(--el-color-success-light-8); + } + + &.el-tag--info { + --el-tag-bg-color: var(--el-color-info-light-8); + } + + &.el-tag--warning { + --el-tag-bg-color: var(--el-color-warning-light-8); + } + + &.el-tag--danger { + --el-tag-bg-color: var(--el-color-danger-light-8); + } + } + + .el-input { + --el-input-border-color: var(--form-control-border-color); + + .el-input__inner { + &::placeholder { + font-size: .75rem; + color: var(--placeholder-text-color); + } + } + + &.round { + .el-input__wrapper { + border-radius: 20px; + } + } + } + + .el-textarea { + --el-input-border-color: var(--form-control-border-color); + + .el-textarea__inner { + &::placeholder { + font-size: .75rem; + color: var(--placeholder-text-color); + } + } + } + + .el-range-input { + &::placeholder { + font-size: .75rem; + color: var(--placeholder-text-color); + } + } + + .el-date-editor { + font-size: .8rem; + --el-input-border-color: var(--form-control-border-color); + } + + .el-date-range-picker__time-header { + .el-input { + width: auto !important; + } + } + + .el-date-editor--datetimerange { + /** + * TODO 设置了这个值会导致点击框框后弹出的选择日期的组件错位,小于270像素会导致错位 + */ + // --el-date-editor-datetimerange-width: calc( - 20px); + --el-date-editor-datetimerange-width: calc(var(--form-control-width) - 16px); + + &.el-input__wrapper { + padding: 0 8px; + } + + .el-range-input { + font-size: .8rem; + width: 80px; + } + } + + .sidebar-drawer { + .el-drawer__body { + --el-drawer-padding-primary: 0; + } + + .el-drawer__close { + color: var(--el-color-white); + } + } +} + +*::-webkit-scrollbar-thumb { + position: relative; + display: block; + cursor: pointer; + border-radius: inherit; + background-color: rgba(144, 147, 153, 0.3); + border-radius: 10px; + transition: background-color 0.3s; + + &:hover { + background-color: rgba(144, 147, 153, 0.5); + } +} + +*::-webkit-scrollbar { + z-index: 1; + width: 6px; + height: 6px; + border-radius: 10px; + transition: opacity 0.12s ease-out; +} + +.px-1 { + padding-left: .5rem; + padding-right: .5rem; +} + +.px-2 { + padding-left: 1rem; + padding-right: 1rem; +} + +.py-1 { + padding-top: .5rem; + padding-bottom: .5rem; +} + +.py-2 { + padding-top: 1rem; + padding-bottom: 1rem; +} + +.text-left { + text-align: left; +} + +.text-right { + text-align: right; +} + +.text-muted { + color: var(--el-text-color-muted); +} + +.text-primary { + color: var(--el-color-primary); +} + +.text-info { + color: var(--el-color-info); +} + +.text-success { + color: var(--el-color-success); +} + +.text-warning { + color: var(--el-color-warning); +} + +.text-error { + color: var(--el-color-error); +} + +.text-danger { + color: var(--el-color-error); +} + +.flex-align-center { + align-items: center; +} + +.d-flex { + display: flex; + + &.align-center { + align-items: center; + } + + .flex-fill { + flex: 1 1 auto !important; + + &.border-right { + border-right: 1px solid var(--el-border-color); + } + + &.border-left { + border-left: 1px solid var(--el-border-color); + } + } + + .flex-shrink { + flex-shrink: 0; + + &.border-right { + border-right: 1px solid var(--el-border-color); + } + + &.border-left { + border-left: 1px solid var(--el-border-color); + } + } + + &.flex-horizontal, + &.flex-row { + flex-direction: row; + } + + &.flex-vertical, + &.flex-column { + flex-direction: column; + } +} + + +// for segment element +.segment-container { + .segment-header { + align-items: center; + box-sizing: border-box; + padding: 0rem 0rem 1rem .5rem; + + h3 { + font-size: 1.038rem; + margin: 0; + color: var(--el-text-color-primary); + // color: var(--el-color-info); + } + } + + .segment-body { + padding: 1.5rem 1rem; + border-radius: 10px; + background-color: var(--el-color-white); + box-shadow: var(--box-shadow); + + &.plain { + padding: .5rem; + background-color: transparent; + box-shadow: none; + } + } + + .segment-toolbar { + text-align: right; + margin-bottom: .38rem; + + .iconfont { + margin-left: 1rem; + font-size: .9rem; + cursor: pointer; + color: var(--el-text-color-muted); + transition: all ease .5s; + + &:hover { + color: var(--el-text-color-primary); + } + } + + ul { + li { + display: inline-block; + } + } + } + + &.segment-wrapper { + .segment-header { + margin-bottom: 1rem; + } + } + + .el-descriptions { + margin-bottom: 1.5rem; + + .el-descriptions__content { + word-break: break-all; + } + } +} + +.loading-more { + span { + cursor: pointer; + font-size: .8rem; + color: var(--el-text-color-muted); + } +} + +.preview-item, +.segment-dataview, +.segment-descriptions { + .el-tag { + padding-left: 1rem; + padding-right: 1rem; + border: none; + + .el-tag__content { + font-size: .76rem; + } + } + + .el-pagination { + margin-top: 1rem; + } + + .el-table { + th.el-table__cell { + color: var(--el-text-color-primary); + background-color: #f9fbfd; + } + + td.el-table__cell { + font-size: .82rem; + } + + .cell { + a { + color: var(--el-color-link); + } + } + } + + .segment-action { + cursor: pointer; + } + + .segment-tag { + display: inline-flex; + justify-content: center; + align-items: center; + height: 24px; + padding: 0 1rem; + line-height: 1; + border-radius: 9999px; + box-sizing: border-box; + white-space: nowrap; + font-size: .76rem; + } +} + +.segment-descriptions { + margin-bottom: 1.5rem; + + .el-descriptions__label { + display: inline-block; + margin-right: 1rem; + } + + .is-bordered { + .el-descriptions__label { + display: table-cell; + margin-right: 0; + } + } +} + +.segment-form { + + .el-form--inline { + .el-form-item__label { + min-width: 80px; + } + } + + .el-textarea { + width: auto !important; + min-width: 80%; + } + + .el-upload-dragger { + --el-upload-dragger-padding-horizontal: 1px; + --el-upload-dragger-padding-vertical: 20px; + font-size: .8rem; + } + + .grid-form { + .el-textarea { + width: 100% !important; + } + } + + .el-input { + width: var(--form-control-width); + + &.round { + --el-input-border-radius: 30px; + } + + + .el-input__wrapper { + transition: all .8s; + padding: 1px 10px; + + &:hover { + background-color: var(--el-input-bg-color, var(--el-fill-color-blank)); + } + } + + .el-textarea__inner { + background-color: rgb(242, 243, 245); + transition: all .8s; + + &:hover { + background-color: var(--el-input-bg-color, var(--el-fill-color-blank)); + } + } + } + + .icon-info { + margin-left: .8rem; + } +} + +.segment-action { + display: inline-block; + margin-right: .5rem; + + &:last-child { + margin-right: 0; + } +} + +.list-plain { + list-style: none; + padding: 0; + margin: 0; +} + +a { + text-decoration: none; +} + +.avatar-group { + display: inline-flex; + box-sizing: border-box; + padding: 5px 0; + align-items: center; + + .avatar-smaples { + display: inline-flex; + justify-content: center; + } + + .avatar-plus { + text-align: center; + display: inline-flex; + justify-content: center; + align-items: center; + width: var(--el-avatar-size); + height: var(--el-avatar-size); + border-radius: var(--el-avatar-size); + background-color: var(--el-fill-color); + cursor: pointer; + transition: all .5s; + margin-right: .5rem; + + &:hover { + background-color: var(--el-fill-color-darker); + } + } + + .el-avatar { + margin-left: calc(-1* var(--el-avatar-size) / 4); + + &:first-child { + margin-left: 0; + } + } +} + + +.avatar-container { + .avatar-list { + margin-bottom: 1rem; + + .el-avatar{ + margin-right: .25rem; + margin-bottom: .25rem; + cursor: pointer; + } + } + .avatar-footer{ + text-align: right; + font-size: .8rem; + } +} + +.invisible-form { + .el-button { + --el-button-bg-color: transparent; + --el-button-border-color: transparent; + --el-button-hover-bg-color: transparent; + --el-button-hover-border-color: transparent; + } + + .el-select { + --el-input-border-color: transparent; + --el-select-input-focus-border-color: transparent; + --el-select-border-color-hover: transparent; + } + + .el-input { + --el-input-border-color: transparent !important; + --el-input-bg-color: transparent; + --el-input-icon-color: var(--el-text-color-primary); + } +} + +@media only screen and (max-width: 768px) { + #app { + .el-main { + --el-main-padding: 10px 5px; + } + } +} \ No newline at end of file diff --git a/web/src/assets/scss/element.scss b/web/src/assets/scss/element.scss new file mode 100644 index 0000000..7d0dc93 --- /dev/null +++ b/web/src/assets/scss/element.scss @@ -0,0 +1,28 @@ +@forward 'element-plus/theme-chalk/src/common/var.scss' with ($colors: ('primary': ('base': #0b57d0, + ), + 'success': ('base': #00d97e, + ), + 'warning':('base':#F09D00, + ), + 'danger':('base':#e63757, + ), + 'error':('base':#b3261e, + ), + 'info':('base':#6e84a3, + )), +); + +@use "element-plus/theme-chalk/src/index.scss" as *; + +@import 'element-plus/theme-chalk/display.css'; + + +.el-cascader { + .el-input { + .icon-arrow-down { + &::before { + content: none !important; + } + } + } +} \ No newline at end of file diff --git a/web/src/assets/scss/style.scss b/web/src/assets/scss/style.scss new file mode 100644 index 0000000..f25f3ed --- /dev/null +++ b/web/src/assets/scss/style.scss @@ -0,0 +1,1118 @@ +html, +body, +#app { + height: 100%; +} + + +#app { + + // --el-text-color-regular: '', + // --el-text-color-secondary: '', + + .page { + height: 100%; + + .container { + height: calc(100% - var(--el-header-height)); + overflow: hidden; + } + } + + >.el-skeleton { + height: 100%; + + .skeleton { + width: 100%; + height: 100%; + align-items: center; + text-align: center; + } + } + + .el-header { + --el-header-padding: 0px; + box-shadow: 0px 0px 20px 4px rgba(0, 0, 0, 0.02), 0px 8px 20px rgba(0, 0, 0, 0.06); + + .header-wrapper { + height: 100%; + padding: 0 1em; + align-items: center; + + .header-avatar { + position: relative; + border-radius: 50%; + } + + .logo { + i { + cursor: pointer; + font-size: 1.38rem; + } + } + + .user-status { + --user-status-size: 12px; + + position: absolute; + display: block; + right: 0; + bottom: 0px; + border: 1px solid var(--el-color-white); + width: var(--user-status-size); + height: var(--user-status-size); + border-radius: var(--user-status-size); + background-color: var(--el-color-primary); + } + + ul { + list-style: none; + padding: 0; + margin: 0; + + li { + display: inline-block; + cursor: pointer; + vertical-align: middle; + padding: 0 15px; + + .iconfont { + font-size: 1.36rem; + } + } + } + } + } + + .el-aside { + height: 100%; + overflow-y: auto; + + .aside-wrapper { + height: 100%; + + >.flex-fill { + overflow-y: auto; + } + } + + .drag-bar { + width: 3px; + cursor: e-resize; + + &.active { + background-color: var(--el-fill-color-dark); + } + } + } + + .el-menu { + border-right: none; + + &.el-menu--collapse { + .iconfont { + margin-right: 0; + font-size: 1.3rem; + } + } + + .iconfont { + margin-right: .5rem; + font-size: 1.06rem; + } + } + + .el-footer { + --el-footer-height: 40px; + box-shadow: var(--box-shadow); + border-top: 1px solid var(--el-border-color-light); + + .user-status { + display: inline; + cursor: pointer; + padding: .28em 1.38rem; + font-size: .8rem; + border-radius: 20px; + } + } + + + .webrtc-video-player { + position: fixed; + top: 60px; + right: 5px; + z-index: -1; + } + + &.call-answering { + .webrtc-video-player { + z-index: 999; + } + } +} + +@keyframes shake { + + 10%, + 90% { + transform: translate3d(-1px, 0, 0); + } + + 20%, + 80% { + transform: translate3d(+2px, 0, 0); + } + + 30%, + 70% { + transform: translate3d(-4px, 0, 0); + } + + 40%, + 60% { + transform: translate3d(+4px, 0, 0); + } + + 50% { + transform: translate3d(-4px, 0, 0); + } +} + +.popup-dialog { + position: fixed; + z-index: 9; + width: 250px; + border-radius: 5px; + display: block; + box-shadow: var(--el-box-shadow); + --el-notification-padding: 10px; + padding: 0 1rem 1.5rem 1rem; + box-sizing: border-box; + background-image: linear-gradient(180deg, #e2d1c3 0%, #e7f0fd 100%); + // background-image: radial-gradient(transparent 1px, rgba(222, 223, 255, .4) 1px); + backdrop-filter: blur(10px); + + &.noanswer { + animation: shake 1.5s linear -5s infinite; + } + + .popup-header { + display: block; + text-align: right; + cursor: move; + padding: 1rem 0 1.5rem 0; + } + + .el-notification__group { + margin: 0; + } + + .popup-container { + width: 100%; + --button-size: 38px; + + .popup-avatar { + box-sizing: border-box; + width: 100%; + text-align: center; + padding: .5rem 0 1rem 0; + + h3 { + color: var(--el-text-color-primary); + margin: 1rem 0 0rem 0; + } + } + + .popup-content { + box-sizing: border-box; + padding: 1rem 0 2rem 0; + text-align: center; + } + + .popup-actions { + text-align: center; + + .el-button--large.is-circle { + --el-button-size: 38px; + } + } + + .popup-button { + width: var(--button-size); + height: var(--button-size); + border-radius: var(--button-size); + font-size: 1.6rem; + display: inline-block; + background-color: var(--el-color-white); + margin: 0 1rem; + padding: .5rem; + text-align: center; + cursor: pointer; + } + + .popup-timer { + font-size: .68rem; + text-align: center; + width: 100%; + display: block; + margin-top: 1rem; + } + } +} + +.status-dialog { + --status-icon-size: 20px; + + background-color: var(--el-bg-color-page); + + .current-status { + box-sizing: border-box; + padding: 2rem 0 4rem 0; + text-align: center; + + i { + display: inline-block; + vertical-align: middle; + width: var(--status-icon-size); + height: var(--status-icon-size); + border-radius: var(--status-icon-size); + } + + span { + display: inline-block; + vertical-align: middle; + margin-left: .5rem; + } + } +} + +.status-item { + box-sizing: border-box; + padding: 1rem 0; + text-align: center; + transition: all .5s; + background-color: var(--el-color-white); + margin-bottom: 10px; + border-radius: 6px; + + i { + display: inline-block; + width: var(--status-icon-size); + height: var(--status-icon-size); + border-radius: var(--status-icon-size); + } + + &:hover, + &.active { + color: var(--el-color-white); + background-color: var(--el-color-primary); + cursor: pointer; + + } + + .status-text { + padding: .5rem 0; + } +} + +.draggable-handle { + cursor: move !important; +} + +.form-list-wrapper { + + ul { + list-style: none; + padding: 0 0 0 0px; + margin: 0 0 1rem 0; + } + + li { + box-sizing: border-box; + padding: 0 1.5rem 0 0; + display: inline-block; + + i { + cursor: pointer; + margin-right: .5rem; + } + } +} + +.user-monitor-item { + box-sizing: border-box; + padding: 1rem; + border-radius: 6px; + cursor: pointer; + background-color: var(--el-color-white); + box-shadow: var(--box-shadow); + margin-bottom: 10px; + + &.offline { + .user-avatar { + background-image: radial-gradient(transparent 1px, rgba(0, 0, 0, .5) 1px); + backdrop-filter: saturate(50%) blur(4px); + } + + .el-avatar { + img { + -webkit-filter: grayscale(100%); + -moz-filter: grayscale(100%); + -ms-filter: grayscale(100%); + -o-filter: grayscale(100%); + filter: grayscale(100%); + filter: gray; + } + } + } + + &.online { + .user-avatar { + i { + background-color: var(--el-color-available); + border-color: var(--el-color-white); + } + } + } + + .user-avatar { + width: 56px; + height: 56px; + border-radius: 50%; + position: relative; + border: 2px solid var(--el-border-color-light); + + i { + display: block; + width: 12px; + height: 12px; + border-radius: 50%; + position: absolute; + right: 6px; + bottom: 0px; + border: 1px solid transparent; + } + } + + &:hover { + background-color: rgba(0, 0, 0, .055); + } + + .user-monitor-bar { + padding: .5rem 0; + --icon-size: 26px; + + ul { + list-style: none; + padding: 0; + margin: 0; + + li { + display: inline-block; + box-sizing: border-box; + width: var(--icon-size); + height: var(--icon-size); + line-height: var(--icon-size); + border-radius: var(--icon-size); + text-align: center; + + &:hover { + background-color: var(--el-bg-color-page); + } + } + } + } + + .status-control-wrapper { + margin-top: .9rem; + } + + .status-control { + font-size: .7rem; + padding: .28rem 1rem; + border-radius: 20px; + } + + .user-monitor-content { + box-sizing: border-box; + padding: 0 0 0 .68rem; + } + + h3 { + margin: 0; + padding: 0; + font-size: 1rem; + font-weight: normal; + } + + p { + margin: 3px 0; + } +} + +.monitor-wrapper { + + --element-height: 360px; + + &.fullscreen { + padding: 2rem; + background-color: #021349; + --el-text-color-primary: rgba(238, 238, 238, .9); + --el-border-color-light: #071d64; + --el-bg-color-page: rgba(0, 0, 0, .98); + --fullscreen-bg-color: rgba(0, 0, 0, .68); + + .el-card { + --el-card-bg-color: var(--fullscreen-bg-color); + --el-card-border-color: var(--el-border-color-light); + } + + .el-table { + --el-table-bg-color: transparent; + --el-table-tr-bg-color: transparent; + --el-table-border-color: var(--el-border-color-light); + --el-table-border: 1px solid var(--el-border-color-light); + } + + .el-statistic { + background-color: var(--fullscreen-bg-color); + } + + .toggle-fullscreen { + top: 2rem; + } + } + + .el-row { + margin-bottom: 20px; + } + + .el-card { + border: none; + border-radius: 6px; + --el-box-shadow-light: var(--box-shadow); + margin-bottom: 0px !important; + } + + .el-statistic { + background-color: var(--el-color-white); + box-shadow: var(--box-shadow); + text-align: center; + padding: 1.5rem 0; + border-radius: 6px; + + .el-statistic__head { + font-size: 1rem; + color: var(--el-text-color-primary); + margin-bottom: 1rem; + } + } + + .monitor-waiting-container { + height: var(--element-height); + + .el-table { + th.el-table__cell { + background-color: transparent; + } + } + + ul { + list-style: none; + padding: 0; + margin: 0; + width: 200px; + height: 100%; + overflow-y: auto; + border-right: 1px solid var(--el-border-color-light); + + li { + box-sizing: border-box; + font-size: .8rem; + padding: .8rem 1rem; + cursor: pointer; + display: flex; + width: 100%; + + span { + flex: 1 1 auto !important; + } + + &:hover, + &.active { + color: var(--el-text-color-primary); + background-color: var(--el-bg-color-page); + } + } + } + } + + .agent-ranking-container { + height: var(--element-height); + box-sizing: border-box; + padding: 1rem; + overflow-y: auto; + + li { + box-sizing: border-box; + padding: .5rem; + cursor: pointer; + transition: all .5s; + border-radius: 6px; + + &:hover { + background-color: var(--el-bg-color-page); + } + + &:first { + padding-top: 0; + } + } + } + + .toggle-fullscreen { + text-align: right; + position: fixed; + right: 0; + top: 80px; + + span { + width: 23px; + font-size: .78rem; + word-break: break-all; + cursor: pointer; + color: var(--el-color-white); + background-color: var(--el-color-info-light-5); + display: inline-block; + box-sizing: border-box; + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; + padding: .8rem .2rem .8rem .3rem; + transition: all ease .5s; + + &:hover { + background-color: var(--el-color-info); + } + } + } +} + +.percentage-label { + margin-right: .5rem; + + &::after { + content: ':'; + } +} + +.shortcut { + text-align: center; + margin-bottom: 2rem; + cursor: pointer; + + &:hover { + color: var(--el-color-primary); + + span { + color: var(--el-color-primary-3); + } + } + + .iconfont { + font-size: 2rem; + } + + span { + display: block; + text-align: center; + color: var(--el-text-color-muted); + font-size: .6rem; + margin-top: .5rem; + } +} + +.statistic-block-card { + .el-statistic { + background-color: transparent; + box-shadow: none; + padding: 1.5rem 0; + margin-bottom: 1rem; + text-align: center; + + .el-statistic__head { + font-size: .9rem; + color: var(--el-text-color-muted); + } + + .el-statistic__number { + font-size: 2.3rem; + } + + .el-statistic__suffix { + display: inline-block; + } + + &.block-statistic { + .el-statistic__suffix { + .el-text { + --el-text-font-size: inherit; + } + + display: block; + font-size: .78rem; + margin-top: 1rem; + color: var(--el-text-color-muted); + } + } + } + + .metric-chart { + box-sizing: border-box; + padding-top: 4rem; + } +} + +.audio-notification { + --el-notification-padding: 0; + --el-notification-group-margin-left: 0; + --el-notification-group-margin-right: 0; + --el-bg-color-overlay: transparent; + --el-notification-close-color: var(--el-text-color-primary); + --el-notification-close-font-size: 12px; + // background-image: linear-gradient(to top, #dad4ec 0%, #dad4ec 1%, #f3e7e9 100%); + // background-image: linear-gradient(180deg, #e2d1c3 0%, #e7f0fd 100%); + background-image: linear-gradient(120deg, #e1edee 0%, #fcfafa 100%); + backdrop-filter: blur(4px); + + // &:before { + // content: ''; + // width: 100%; + // height: 100%; + // position: absolute; + // background-image: url(data:image/png;base64,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); + // } + + .el-progress-bar__outer { + cursor: pointer; + --el-border-color-lighter: #ceddf6; + } + + .el-notification__group { + width: 100%; + position: relative; + padding: 1rem .8rem; + + .el-notification__closeBtn { + position: absolute; + top: 10px; + right: 15px; + } + } + + .el-notification__content { + width: 100%; + + .el-icon { + color: var(--el-text-color-primary); + } + } + + .audio-toolbar { + margin-bottom: .1rem; + } + + .audio-duration { + font-size: .68rem; + color: var(--el-text-color-muted); + text-align: center; + } + + .audio-control { + display: inline-block; + margin-right: .8rem; + vertical-align: middle; + + i { + cursor: pointer; + font-size: 1.2rem; + color: var(--el-text-color-primary); + + &.playing { + color: var(--el-color-primary); + } + } + } +} + +.viewer-container { + .el-card { + border: none; + border-radius: 6px; + box-shadow: var(--box-shadow); + } + + .segment-descriptions { + padding: 1rem; + border-radius: 6px; + background-color: var(--el-color-white); + box-shadow: var(--box-shadow); + } +} + +.dashboard-container { + --banner-height: 150px; + + .dashboard-primary-container { + .el-statistic { + background-color: var(--el-color-white); + box-shadow: var(--box-shadow); + text-align: center; + padding: 1.5rem 0; + box-sizing: border-box; + border-radius: 6px; + height: var(--banner-height); + margin-bottom: 1.5rem; + + .el-statistic__head { + font-size: 1rem; + color: var(--el-text-color-primary); + margin-bottom: 1rem; + } + + .el-statistic__suffix { + display: block; + margin-top: 1rem; + color: var(--el-text-color-muted); + font-size: .83rem; + } + } + } + + .el-card { + border: none; + border-radius: 6px; + box-shadow: var(--box-shadow); + } + + .dashboard-banner { + height: var(--banner-height); + background-image: linear-gradient(90deg, #f8fafc 0%, #fdfefe 100%); + border-radius: 6px; + box-shadow: var(--box-shadow); + margin-bottom: 1.5rem; + + + .banner-content { + box-sizing: border-box; + padding: 1rem; + line-height: 1.6rem; + } + + img { + height: var(--banner-height); + } + } + + .secure-content { + display: block; + background-color: var(--el-color-white); + box-sizing: border-box; + padding: 1.5rem; + text-align: center; + border-radius: 6px; + box-shadow: var(--box-shadow); + } + + a { + color: var(--el-color-primary); + } +} + +.dialplate { + display: block; + + .dialplate-input { + display: block; + } + + .dialplate-clear { + text-align: right; + height: 20px; + box-sizing: border-box; + padding-top: 5px; + + .el-icon { + cursor: pointer; + } + } + + .el-input { + --el-input-border: none; + --el-input-bg-color: var(--el-bg-color-page); + --el-input-border-color: transparent; + --el-input-hover-border-color: transparent; + --el-input-focus-border-color: transparent; + } + + .dialplate-actions { + text-align: center; + --action-size: 36px; + + .dialplate-action { + .el-button { + margin: 0 .5rem; + } + + &:first-child { + text-align: right; + } + + &:last-child { + text-align: left; + } + } + } + + .dialplate-button { + display: inline-block; + width: 33%; + text-align: center; + padding: 1rem 0; + box-sizing: border-box; + border-radius: 3px; + + &:hover { + color: var(--el-text-color-primary); + background-color: var(--el-bg-color-page); + cursor: pointer; + } + } +} + +.v-puzzle-code { + .vue-auth-box_ { + padding: 10px; + } + + .reset_ { + width: 22px !important; + content: url('data:image/png;base64,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'); + } +} + +.trail-form { + border: 2px solid var(--el-bg-color-page); + + .el-textarea__inner { + box-shadow: none; + } + + .trail-action { + + background-color: var(--el-bg-color-page); + text-align: right; + } +} + +.trail-timeline { + margin-top: 2rem; + + .el-timeline { + padding-left: 5px; + + .el-timeline-item__tail { + left: 10px; + } + + .preview-item { + .preview-item-label { + min-width: 2rem; + } + } + } +} + +.trail-container { + .el-tabs__header { + margin-bottom: 0; + } + + .el-tabs__content { + background-color: var(--el-color-white); + box-sizing: border-box; + padding-top: 1rem; + padding-bottom: 1rem; + color: var(--el-text-color-primary); + margin-bottom: 1.5rem; + } + + .el-timeline-item__content { + position: relative; + } + + .trail-actions { + position: absolute; + right: 0; + top: -25px; + text-align: right; + + li { + display: inline-block; + margin-left: .38rem; + cursor: pointer; + + &:first-child { + margin-left: 0; + } + } + } +} + +.outbound-container { + background-color: var(--el-color-white); + padding: 2rem 1rem; + box-shadow: var(--box-shadow); + border-radius: 6px; + margin-top: 2.5rem; + box-sizing: border-box; + + .outbound-actions { + margin-top: 3rem; + text-align: center; + } + + .outbound-download-template { + display: block; + margin-bottom: 2rem; + } + + .outbound-step { + .icon-congratulate { + background-image: -webkit-linear-gradient(top, #4f0200, #d75d10, #f5d9ab); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + font-size: 4rem; + } + } +} + +.campaign-container { + .preview-item { + margin-bottom: .2rem; + } + + .campaign-actions { + i { + font-size: 1.2rem; + cursor: pointer; + } + } + + .campaign-member { + display: block; + font-size: .8rem; + border-radius: 3px; + padding: .38rem .5rem; + + &:hover { + background-color: var(--el-fill-color); + } + + .campaign-member-name { + margin-right: 1rem; + } + } +} + +.notice-container { + .notice-body { + display: block; + box-sizing: border-box; + padding: .5rem 0 1rem 0; + } + + .notice-footer { + text-align: right; + } +} + +.call-widget { + cursor: pointer; + color: var(--el-color-primary); +} + +.flow-wrapper { + width: 100%; + height: 400px; + + .vue-flow__node { + display: block; + padding: 6px 10px; + border-radius: 6px; + border: none; + color: var(--el-color-white); + font-size: 12px; + background-color: var(--el-color-info); + + &.vue-flow__node-input { + background-color: var(--el-color-success); + + &.selected { + background-color: var(--el-color-success-dark-2); + } + } + + &.vue-flow__node-output { + background-color: var(--el-color-danger); + + &.selected { + background-color: var(--el-color-danger-dark-2); + } + } + + &.primary-node { + background-color: var(--el-color-primary); + + &.selected { + background-color: var(--el-color-primary-dark-2); + } + } + + &.info-node { + background-color: var(--el-color-info); + + &.selected { + background-color: var(--el-color-info-dark-2); + } + } + + &.success-node { + background-color: var(--el-color-success); + + &.selected { + background-color: var(--el-color-success-dark-2); + } + } + + &.warning-node { + background-color: var(--el-color-warning); + + &.selected { + background-color: var(--el-color-warning-dark-2); + } + } + + &.danger-node { + background-color: var(--el-color-danger); + + &.selected { + background-color: var(--el-color-danger-dark-2); + } + } + + &.selected { + border: none; + background-color: var(--el-color-info-dark-2); + } + } +} \ No newline at end of file diff --git a/web/src/components/fragment/ActiveForm.vue b/web/src/components/fragment/ActiveForm.vue new file mode 100644 index 0000000..24c6a71 --- /dev/null +++ b/web/src/components/fragment/ActiveForm.vue @@ -0,0 +1,296 @@ + + + + + \ No newline at end of file diff --git a/web/src/components/fragment/Description.vue b/web/src/components/fragment/Description.vue new file mode 100644 index 0000000..8d6cab0 --- /dev/null +++ b/web/src/components/fragment/Description.vue @@ -0,0 +1,71 @@ + + + \ No newline at end of file diff --git a/web/src/components/fragment/GridView.vue b/web/src/components/fragment/GridView.vue new file mode 100644 index 0000000..fb8cccc --- /dev/null +++ b/web/src/components/fragment/GridView.vue @@ -0,0 +1,106 @@ + + + + + \ No newline at end of file diff --git a/web/src/components/fragment/PageHeader.vue b/web/src/components/fragment/PageHeader.vue new file mode 100644 index 0000000..fd27317 --- /dev/null +++ b/web/src/components/fragment/PageHeader.vue @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/web/src/components/fragment/Skeleton.vue b/web/src/components/fragment/Skeleton.vue new file mode 100644 index 0000000..ac00181 --- /dev/null +++ b/web/src/components/fragment/Skeleton.vue @@ -0,0 +1,45 @@ + + + \ No newline at end of file diff --git a/web/src/components/fragment/Viewer.vue b/web/src/components/fragment/Viewer.vue new file mode 100644 index 0000000..a913d58 --- /dev/null +++ b/web/src/components/fragment/Viewer.vue @@ -0,0 +1,592 @@ + + + \ No newline at end of file diff --git a/web/src/components/fragment/Wrapper.vue b/web/src/components/fragment/Wrapper.vue new file mode 100644 index 0000000..57d6bc2 --- /dev/null +++ b/web/src/components/fragment/Wrapper.vue @@ -0,0 +1,77 @@ + + \ No newline at end of file diff --git a/web/src/components/fragment/libs/codec.js b/web/src/components/fragment/libs/codec.js new file mode 100644 index 0000000..17db744 --- /dev/null +++ b/web/src/components/fragment/libs/codec.js @@ -0,0 +1,238 @@ +import dayjs from "dayjs" + +function mustMarshal(v, s) { + let value = null + switch (s) { + case 'integer': + if (v instanceof Date) { + value = v.getTime() / 1000 + } else { + value = parseInt(v) + value = isNaN(value) ? 0 : value + } + break + case 'decimal': + case 'float': + value = parseFloat(v) + value = isNaN(value) ? 0 : value + break + case 'boolean': + value = Boolean(v) + break + case 'string': + if (v instanceof Date) { + value = dayjs(v).format("YYYY-MM-DD HH:mm:ss") + } else if (typeof v === 'object') { + value = JSON.stringify(v) + } else { + value = v + '' + } + break + default: + value = v + } + return value +} + +/** + * 把对象转换成时间对象 + * @param {Object} v + * @returns + */ +export function toDate(v) { + if (typeof v === 'string') { + return dayjs(v, ['YYYY-MM-DD HH:mm:ss', 'YYYY-MM-DD']).toDate(); + } else if (typeof v === 'number') { + if (v / 1000000000 < 1000) { + v = v * 1000; + } + return new Date(v); + } + return v; +} + +/** + * 模型数据编码为数据库数 + * @param {Object} raw + * @param {Array} schemas + * @returns + */ +export function encode(raw, schemas, scenario) { + let data = {} + let excludes = [] + if (!raw || !schemas) { + return data + } + scenario = scenario || 'unknown'; + for (let schema of schemas) { + if (schema.attribute.live.enable && schema.attribute.live.type == 'cascader') { + let columns = schema.attribute.live.columns + //级联数据如果没有配置字段,那么对结果进行JSON编码处理 + if (!Array.isArray(columns) || columns.length == 0) { + data[schema.column] = JSON.stringify(raw[schema.column]) + } else { + let vals = raw[schema.column] + if (vals && Array.isArray(vals)) { + for (let i in vals) { + if (columns[i]) { + //级联数据所有数据都必须是同一个类型的数据 + data[columns[i]] = mustMarshal(vals[i], schema.type) + excludes.push(columns[i]) + } + } + } + } + } else if (['multiSelect'].indexOf(schema.format) > -1) { + try { + if (typeof raw[schema.column] === 'object') { + data[schema.column] = mustMarshal( + JSON.stringify(raw[schema.column]), + schema.type + ) + } + } catch (e) { } + } else if (['date', 'datetime', 'timestamp'].indexOf(schema.format) > -1) { + let value = raw[schema.column]; + if (Array.isArray(value)) { + let ps = [] + for (let i in value) { + let row = value[i]; + ps.push(mustMarshal(toDate(row), schema.type)) + } + data[schema.column] = ps.join('/') + } else { + data[schema.column] = mustMarshal(toDate(value), schema.type) + } + } else { + //先前已经有过赋值的列数据 + if (excludes.indexOf(schema.column) > -1) { + continue + } + //如果是bool类型的变量,并且值为空不进行类型转换 + if (['boolean', 'bool'].indexOf(schema.format) > -1) { + if (typeof raw[schema.column] === 'undefined') { + continue + } + if (typeof raw[schema.column] === 'string' && raw[schema.column] == '') { + continue + } + } + if (raw[schema.column]) { + data[schema.column] = mustMarshal(raw[schema.column], schema.type) + } else { + data[schema.column] = mustMarshal( + scenario === 'create' ? schema.attribute.default_value : '', + schema.type + ) + } + } + } + return data +} + +/** + * 数据库数据解码为模型数据 + * @param {Object} raw + * @param {Array} schemas + * @returns + */ +export function decode(raw, schemas, scenario) { + let data = {} + scenario = scenario || 'unknown'; + if (!raw || !schemas) { + return data + } + for (let schema of schemas) { + if ( + schema.attribute.live.enable && + schema.attribute.live.type == 'cascader' + ) { + let columns = schema.attribute.live.columns + //级联数据如果没有配置字段,那么对结果进行JSON解码处理 + if (!Array.isArray(columns) || columns.length == 0) { + if (raw[schema.column]) { + data[schema.column] = JSON.parse(raw[schema.column]) + } else { + data[schema.column] = [] + } + } else { + data[schema.column] = [] + for (let column of columns) { + let v = raw[column] + if (!v) { + break + } + data[schema.column].push(mustMarshal(v, schema.type)) + } + } + } else if ( + (schema.attribute.live.enable && + schema.attribute.live.type == 'dropdown') || + schema.format == 'dropdown' + ) { + //强制重新设置字段的format + if (schema.format !== 'dropdown') { + schema.format = 'dropdown'; + } + //下拉列转成字符串显示 + let v = null; + if (raw.hasOwnProperty(schema.column)) { + v = raw[schema.column]; + } else if (scenario === 'create') { + v = schema.attribute.default_value; + } + data[schema.column] = mustMarshal(v || '', 'string') + } else if (schema.format === 'multiSelect') { + try { + if (typeof raw[schema.column] === 'string') { + data[schema.column] = JSON.parse(raw[schema.column]) + } + } catch (e) { } + } else if (['time', 'date', 'datetime', 'timestamp'].indexOf(schema.format) > -1) { + if (raw.hasOwnProperty(schema.column)) { + let v = raw[schema.column]; + if (v) { + if (typeof v === 'string' && v.indexOf('/') > -1) { + let ss = v.split('/', 2); + let st = toDate(ss[0]); + let et = toDate(ss[1]); + switch (schema.format) { + case 'time': + data[schema.column] = [dayjs(st).format('HH:mm'), dayjs(et).format('HH:mm')] + break; + case 'date': + data[schema.column] = [dayjs(st).format('YYYY-MM-DD'), dayjs(et).format('YYYY-MM-DD')]; + break; + default: + data[schema.column] = [dayjs(st).format('YYYY-MM-DD HH:mm:ss'), dayjs(et).format('YYYY-MM-DD HH:mm:ss')]; + break + } + } else { + let ts = toDate(v); + switch (schema.format) { + case 'time': + data[schema.column] = dayjs(ts).format('HH:mm'); + break; + case 'date': + data[schema.column] = dayjs(ts).format('YYYY-MM-DD'); + break; + default: + data[schema.column] = dayjs(ts).format('YYYY-MM-DD HH:mm:ss'); + break + } + } + + } + } + } else { + let v = null; + if (raw.hasOwnProperty(schema.column)) { + v = raw[schema.column]; + } else if (scenario === 'create') { + v = schema.attribute.default_value; + } + data[schema.column] = mustMarshal(v || '', schema.type) + } + } + return data +} \ No newline at end of file diff --git a/web/src/components/fragment/libs/crud.js b/web/src/components/fragment/libs/crud.js new file mode 100644 index 0000000..16b80e3 --- /dev/null +++ b/web/src/components/fragment/libs/crud.js @@ -0,0 +1,680 @@ +import httpclicent from '@/apis/request' +import pluralize from 'pluralize'; +import { getModelValue } from './model'; + +class CRUD { + constructor(opts) { + opts = Object.assign({ + moduleName: '', + tableName: '', + apiPrefix: '/v1', + schemas: [], + }, opts); + this.opts = opts + this.primaryKey = '' + this.modelName = opts.moduleName + this.tableName = opts.tableName + this.models = [] + this.sortable = [] + this.queryParams = {} + this.fixedQueueParams = {} + this.pagination = { + index: 1, + size: 15, + totalCount: 0, + } + //初始化schema + if (Array.isArray(opts.schemas)) { + this.schemas = opts.schemas + } else if (!Array.isArray(opts.schemas) && typeof opts.Array === 'object') { + this.schemas = []; + for (let k in opts.schemas) { + this.schemas.push(opts.schemas[k]) + } + } else { + this.schemas = [] + } + } + + /** + * 预处理一些变量 + */ + __prepare() { + for (let i in this.schemas) { + let schema = this.schemas[i] + this.schemas[i].error = '' + if (schema.attribute.primary_key) { + this.primaryKey = schema.column + } + if (schema.attribute.live.enable) { + this._lazyFetach(schema).then(res => { + schema.attribute.values = res + }).catch(e => { + console.log(e.message) + }) + } + } + } + + _lazyFetach(schema) { + return new Promise((resolve, reject) => { + if (schema.attribute.live.method === 'post') { + httpclicent.post( + schema.attribute.live.url, + schema.attribute.live.body, + { + headers: { 'Content-Type': schema.attribute.live.content_type } + } + ).then(res => { + resolve(res) + }).catch(e => { + reject(e) + }) + } else { + httpclicent.get(schema.attribute.live.url).then(res => { + resolve(res) + }).catch(e => { + reject(e) + }) + } + }) + + } + + /** + * 刷新列表的一个模型数据 + * @param {*} primaryKey + */ + __refreshModel(primaryKey) { + return new Promise((resolve, reject) => { + let qs = {} + qs[this.primaryKey] = primaryKey + qs['__format'] = 'both' + qs['scenario'] = 'list' + this.getModel(qs).then(res => { + let isExists = false; + let primaryKey = this.findModelPrimaryKey(res); + if (primaryKey === false) { + reject('can not find model primary key') + return + } + for (let k in this.models) { + let pk = getModelValue(this.models[k], this.primaryKey); + if (pk == primaryKey) { + isExists = true + this.models[k] = res + break + } + } + if (!isExists) { + this.models.push(res) + } + resolve(res) + }).catch(e => { reject(e) }) + }) + + } + + /** + * 删除一个模型 + * @param {*} primaryKey + */ + __removeModel(primaryKey) { + for (let k in this.models) { + let pk = getModelValue(this.models[k], this.primaryKey); + if (primaryKey === pk) { + this.models.splice(k, 1) + } + } + } + + /** + * 构建请求的接口地址 + * @param {String} scenario + * @param {any} primaryKey + * @returns + */ + __buildUri(scenario, primaryKey) { + return this.__buildModelUri(this.modelName, this.tableName, scenario, primaryKey); + } + + __buildModelUri(moduleName, tableNanme, scenario, primaryKey) { + primaryKey = primaryKey || '' + let uri = this.opts.apiPrefix ? this.opts.apiPrefix : ''; + let pluralizeName = pluralize.plural(tableNanme); + let singularName = pluralize.singular(tableNanme); + switch (scenario) { + case 'create': + uri += `/${moduleName}/${singularName}` + break + case 'update': + uri += `/${moduleName}/${singularName}/${primaryKey}` + break + case 'delete': + uri += `/${moduleName}/${singularName}/${primaryKey}` + break + case 'get': + uri += `/${moduleName}/${singularName}/${primaryKey}` + break + case 'search': + uri += `/${moduleName}/${pluralizeName}` + break + case 'export': + uri += `/${moduleName}/${singularName}-export` + break + case 'import': + uri += `/${moduleName}/${singularName}-import` + break + } + return uri + } + + /** + * 初始化CRUD组件 + * @returns + */ + initialize() { + return new Promise((resolve, reject) => { + if (Array.isArray(this.schemas) && this.schemas.length > 0) { + this.__prepare() + resolve(this, this.schemas) + return + } + httpclicent.get(`/rest/schema/${this.modelName}/${this.tableName}`).then(res => { + this.schemas = res; + this.__prepare() + resolve(this, this.schemas); + }).catch(e => { + reject(e) + }) + }) + } + + /** + * 获取所有的字段描述信息 + * @returns + */ + getSchemas() { + return this.schemas + } + + /** + * 设置指定列的错误信息 + * @param {string} column + * @param {string} error + */ + setColumnError(column, error) { + for (let i in this.schemas) { + if (this.schemas[i].column === column) { + this.schemas[i].error = error + } + } + } + + /** + * 重置所有列的错误信息 + */ + resetError() { + for (let i in this.schemas) { + this.schemas[i].error = '' + } + } + + /** + * 获取所有模型集合 + * @returns + */ + getModels() { + return this.models; + } + + /** + * 设置分页索引 + * @param {Number} index 分页索引 + * @returns CRUD + */ + setPaginationIndex(index) { + this.pagination.index = index + return this + } + + /** + * 获取当前分页的索引 + * @returns + */ + getPaginationIndex() { + return this.pagination.index + } + + /** + * 设置分页大小 + * @returns CRUD + * @param {Number} pageSize 分页大小 + */ + setPaginationSize(pageSize) { + this.pagination.size = pageSize + return this + } + + /** + * 获取分页大小 + * @returns + */ + getPaginationSize() { + return this.pagination.size || 10 + } + + + /** + * 获取分页信息中的总数据条数 + * @returns + */ + getPaginationCount() { + return this.pagination.totalCount + } + + /** + * 重置分页配置 + * @returns CRUD + */ + resetPagination() { + this.pagination.index = 1 + return this + } + + /** + * 设置字段排序 + * @param {String} column 字段列 + * @param {String} order 排序规则 + * @returns CRUD + */ + setSortable(column, order) { + if (!column) { + this.sortable = {} + } else { + this.sortable = { + column: column, + order: order || 'ascending', + } + } + return this; + } + + /** + * 添加固定的查询参数 + * @param {*} k + * @param {*} v + */ + addFixedQueueParams(k, v) { + this.fixedQueueParams[k] = v; + } + + /** + * 设置查询参数 + * @param {Object} qs 查询参数 + * @returns + */ + setQueryParams(qs) { + this.queryParams = qs + return this + } + + /** + * 添加查询参数 + * @param {String} k + * @param {String} v + */ + addQueryParams(k, v) { + this.queryParams[k] = v; + } + + /** + * 查找模型的主键的值 + * @param {Object} model 表模型 + * @returns Boolean | mixed + */ + findModelPrimaryKey(model) { + if (typeof model === 'object') { + return getModelValue(model, this.primaryKey); + } else { + return model; + } + } + + /** + * 创建一个模型 + * @param {Object} model + */ + createModel(model) { + return new Promise((resolve, reject) => { + httpclicent.post(this.__buildUri('create'), model).then(res => { + this.__refreshModel(res.id).then(res => { + resolve(res) + }).catch(e => { reject(e) }) + }).catch(e => { reject(e) }) + }) + } + + + /** + * 创建一个资源 + * @param {String} moduleName + * @param {String} tableName + * @param {Object} model + * @returns + */ + createResource(moduleName, tableName, model) { + return new Promise((resolve, reject) => { + httpclicent.post(this.__buildModelUri(moduleName, tableName, 'create'), model).then(res => { + resolve(res) + }).catch(e => { reject(e) }) + }) + } + + /** + * 更新一个模型 + * @param {Object} model + */ + updateModel(model) { + return new Promise((resolve, reject) => { + let primaryKey = this.findModelPrimaryKey(model); + if (primaryKey === false) { + reject('can not find model primary key') + return + } + httpclicent.put(this.__buildUri('update', primaryKey), model).then(res => { + this.__refreshModel(primaryKey).then(res => { + resolve(res) + }).catch(e => { reject(e) }) + }).catch(e => { reject(e) }) + }) + } + + /** + * 更新一个资源 + * @param {String} moduleName + * @param {String} tableName + * @param {Object} model + */ + updateResource(moduleName, tableName, model) { + return new Promise((resolve, reject) => { + let primaryKey = this.findModelPrimaryKey(model); + if (primaryKey === false) { + reject('can not find model primary key') + return + } + httpclicent.put(this.__buildModelUri(moduleName, tableName, 'update', primaryKey), model).then(res => { + resolve(res) + }).catch(e => { reject(e) }) + }) + } + + /** + * 删除一个模型 + * @param {Object} model + */ + deleteModel(model) { + let primaryKey = ''; + if (typeof model === 'object') { + primaryKey = this.findModelPrimaryKey(model) + } else { + primaryKey = model + } + return new Promise((resolve, reject) => { + httpclicent.delete(this.__buildUri('delete', primaryKey), model).then(res => { + this.__removeModel(primaryKey) + resolve(res) + }).catch(e => { reject(e) }) + }) + } + + /** + * 删除一个资源 + * @param {String} moduleName + * @param {String} tableName + * @param {Object} model + * @returns + */ + deleteResource(moduleName, tableName, model) { + let primaryKey = ''; + if (typeof model === 'object') { + primaryKey = this.findModelPrimaryKey(model) + } else { + primaryKey = model + } + return new Promise((resolve, reject) => { + httpclicent.delete(this.__buildModelUri(moduleName, tableName, 'delete', primaryKey), model).then(res => { + resolve(res) + }).catch(e => { reject(e) }) + }) + } + + + /** + * 获取一个资源 + * @param {String} moduleName + * @param {String} tableName + * @param {Object} model + * @returns + */ + getResource(moduleName, tableName, qs) { + return new Promise((resolve, reject) => { + let primaryKey = ''; + let params = {} + if (typeof qs === 'object') { + for (let k in qs) { + if (k === this.primaryKey) { + primaryKey = qs[k] + } else { + params[k] = qs[k] + } + } + } else { + primaryKey = qs + } + if (!primaryKey) { + reject('can not find model primary key') + return + } + httpclicent.get(this.__buildModelUri(moduleName, tableName, 'get', primaryKey), { params: params }).then(res => { + resolve(res) + }).catch(e => { reject(e) }) + }) + } + + /** + * + * @param {*} pk + * @param {*} qs + * @returns + */ + fetchModel(pk, qs) { + if (typeof qs !== 'object') { + qs = {} + } + qs[this.primaryKey] = pk + return this.getModel(qs) + } + + /** + * 获取一个模型数据 + * @param {*} qs + */ + getModel(qs) { + return new Promise((resolve, reject) => { + let primaryKey = ''; + let params = {} + if (typeof qs === 'object') { + for (let k in qs) { + if (k === this.primaryKey) { + primaryKey = qs[k] + } else { + params[k] = qs[k] + } + } + } else { + primaryKey = qs + } + if (!primaryKey) { + reject('can not find model primary key') + return + } + httpclicent.get(this.__buildUri('get', primaryKey), { params: params }).then(res => { + resolve(res) + }).catch(e => { reject(e) }) + }) + } + + + /** + * 查询模型数据 + */ + searchModel() { + let queryParams = Object.assign({}, this.queryParams); + queryParams['page'] = this.pagination.index + queryParams['pagesize'] = this.pagination.size || 15 + if (this.sortable && this.sortable.column != '') { + queryParams['sort'] = this.sortable.order == 'descending' ? '-' + this.sortable.column : this.sortable.column + } + queryParams['__format'] = 'both'; + if (typeof this.fixedQueueParams === 'object') { + for (let k in this.fixedQueueParams) { + queryParams[k] = this.fixedQueueParams[k]; + } + } + return new Promise((resolve, reject) => { + httpclicent.get(this.__buildUri('search'), { params: queryParams }).then(res => { + this.pagination.index = parseInt(res.page); + this.pagination.size = parseInt(res.pagesize); + this.pagination.totalCount = parseInt(res.totalCount); + this.models = res.data + resolve() + }).catch(e => { reject(e) }) + }) + } + + /** + * 批量删除模型 + * @param {Array} data + */ + deleteModels(data) { + let pks = []; + for (let val of data) { + if (typeof val === 'object') { + let pk = this.findModelPrimaryKey(val) + if (pk) { + pks.push(pk) + } + } else { + pks.push(val) + } + } + if (pks.length <= 0) { + return + } + let ps = []; + for (let pk of pks) { + ps.push(this.deleteModel(pk)) + } + return new Promise((resolve, reject) => { + Promise.all(ps).then(res => { + let data = { + total: 0, + success: 0, + responses: res, + }; + data.total = pks.length + data.success = res.length + resolve(data) + }).catch(e => { + reject(e) + }) + }) + } + + /** + * 下载指定资源的导入模板 + * @param {String} moduleName + * @param {String} tableName + * @returns + */ + downloadResourceTemplate(moduleName, tableName) { + return new Promise((resolve, reject) => { + httpclicent.get(this.__buildModelUri(moduleName, tableName, 'import')).then(res => { + let element = document.createElement('a') + let disposition = res.headers['content-disposition'] + let filename = this.tableName + '.csv'; + //获取文件名称 + if (disposition) { + let pos = -1; + let ps = disposition.split(';') + for (let s of ps) { + pos = s.indexOf('filename=') + if (pos === 0) { + filename = s.substring(9) + break + } + } + } + element.style.display = 'none' + element.href = window.URL.createObjectURL(new Blob([res.data], { type: res.headers['content-type'] })) + element.target = '_blank' + element.setAttribute('download', filename) + document.body.appendChild(element) + element.click() + window.URL.revokeObjectURL(element.href) + document.body.removeChild(element) + }).catch(e => { reject(e) }) + }) + } + + /** + * 下载导入模板 + * @returns + */ + downloadTemplate() { + return this.downloadResourceTemplate(this.modelName, this.tableName); + } + + /** + * 导出模型数据 + * @returns + */ + exportModels() { + let queryParams = Object.assign({}, this.queryParams); + if (this.sortable && this.sortable.column != '') { + queryParams['sort'] = this.sortable.order == 'descending' ? '-' + this.sortable.column : this.sortable.column + } + return new Promise((resolve, reject) => { + httpclicent.get(this.__buildUri('export'), { params: queryParams }).then(res => { + let element = document.createElement('a') + let disposition = res.headers['content-disposition'] + let filename = this.tableName + '.csv'; + //获取文件名称 + if (disposition) { + let pos = -1; + let ps = disposition.split(';') + for (let s of ps) { + pos = s.indexOf('filename=') + if (pos === 0) { + filename = s.substring(9) + break + } + } + } + element.style.display = 'none' + element.href = window.URL.createObjectURL(new Blob([res.data], { type: res.headers['content-type'] })) + element.target = '_blank' + element.setAttribute('download', filename) + document.body.appendChild(element) + element.click() + window.URL.revokeObjectURL(element.href) + document.body.removeChild(element) + }).catch(e => { reject(e) }) + }) + } + + +} + +export default CRUD \ No newline at end of file diff --git a/web/src/components/fragment/libs/error.js b/web/src/components/fragment/libs/error.js new file mode 100644 index 0000000..a2f913d --- /dev/null +++ b/web/src/components/fragment/libs/error.js @@ -0,0 +1,9 @@ +class ValidateError extends Error { + constructor(column) { + super(column.message) + this.schema = column + this.name = 'ValidateError' + } +} + +export default ValidateError \ No newline at end of file diff --git a/web/src/components/fragment/libs/form.js b/web/src/components/fragment/libs/form.js new file mode 100644 index 0000000..7a0bc39 --- /dev/null +++ b/web/src/components/fragment/libs/form.js @@ -0,0 +1,161 @@ + +/** + * 清理搜索模型的空字段 + * @param {Object} model + * @param {Array} schemas + */ +export function clearSearchModel(model, schemas) { + let ps = {} + for (let schema of schemas) { + if (schema.type === 'string') { + if (model[schema.column] === '') { + continue + } + } + if (['integer', 'double'].indexOf(schema.type) > -1 && ['boolean', 'bool'].indexOf(schema.format) === -1) { + if (model[schema.column] === 0) { + continue + } + } + ps[schema.column] = model[schema.column] + } + return ps; +} + + +/** + * 判断指定的字段是否显示 + * @param {Object} schema + * @param {Object} model + */ +export function checkSchemaVisible(schema, model) { + if (!Array.isArray(schema.attribute.visible)) { + return true + } + if (schema.attribute.visible.length <= 0) { + return true + } + for (let cond of schema.attribute.visible) { + let column = cond['column'] + let values = cond['values'] + if (!column || column === '') { + continue + } + values.map((v) => { + return v + '' + }) + let compareValue = model[column] + if (typeof compareValue === 'undefined') { + return false + } + if (values.indexOf(compareValue + '') === -1) { + return false + } + } + return true +} + + +/** + * 生成规则 + * @param {Object} schema + * @param {String} scenario + * @returns + */ +export function generateSchemaRule(schema, scenario) { + let rules = [] + if (schema.rule.required.indexOf(scenario) > -1) { + rules.push({ + required: true, + message: `${schema.label}字段的值不能为空`, + trigger: 'blur', + }) + } + //长度过滤把在线搜索的情况过滤掉 + if (['string', 'text'].indexOf(schema.type) > -1 && schema.format !== 'cascader') { + rules.push({ + type: 'string', + message: `${schema.label}字段的值不是有效的字符串`, + trigger: 'blur', + }) + if (schema.rule.max > 0 && schema.rule.min > 0) { + rules.push({ + max: schema.rule.max, + min: schema.rule.min, + message: `${schema.label}字段长度必须在${schema.rule.min} - ${schema.rule.max}个字符之间`, + trigger: 'blur', + }) + } else if (schema.rule.max > 0) { + rules.push({ + max: schema.rule.max, + message: `${schema.label}字段长度不能大于${schema.rule.max}个字符`, + trigger: 'blur', + }) + } + + } + if (['integer', 'decimal', 'number'].indexOf(schema.type) > -1) { + if (['date', 'datetime', 'timestamp'].indexOf(schema.format) == -1) { + rules.push({ + type: 'number', + message: `${schema.label}字段的值不是有效的数字`, + trigger: 'blur', + }) + if (schema.rule.min !== 0 && schema.rule.max !== 0) { + rules.push({ + max: schema.rule.max, + min: schema.rule.min, + message: `${schema.label}的值必须在${schema.rule.min} - ${schema.rule.max}之间`, + trigger: 'blur', + }) + } else if (schema.rule.max !== 0) { + // rules.push({ + // max: schema.rule.max, + // message: `${schema.label}最大值不能大于${schema.rule.max}`, + // trigger: 'blur', + // }) + } + } + } + if (['date', 'datetime', 'timestamp'].indexOf(schema.format) > -1) { + rules.push({ + type: 'date', + message: `${schema.label}字段的值是无效的`, + trigger: 'blur', + }) + } + if (schema.rule.regular !== '') { + rules.push({ + type: 'regexp', + pattern: schema.rule.regular, + message: `${schema.label}字段的值不符合规范`, + trigger: 'blur', + }) + } + return rules +} + +export function generateSchemaDescription(schema, scenario) { + if (typeof schema.attribute.description === 'string' && schema.attribute.description !== '') { + return schema.attribute.description + } + let messages = [] + if (schema.rule.required.indexOf(scenario) > -1) { + messages.push("不能为空") + } + if (['string', 'text'].indexOf(schema.type) > -1) { + if (schema.rule.max > 0 && schema.rule.min > 0) { + messages.push(`长度必须在${schema.rule.min} - ${schema.rule.max}个字符之间`) + } else if (schema.rule.max > 0) { + messages.push(`长度必须小于${schema.rule.max}个字符`) + } + } + if (['integer', 'decimal', 'number'].indexOf(schema.type) > -1) { + if (schema.rule.max > 0 && schema.rule.min > 0) { + messages.push(`值必须在${schema.rule.min} - ${schema.rule.max}之间`) + } else if (schema.rule.max > 0) { + messages.push(`值必须小于${schema.rule.max}`) + } + } + return messages.join(', ') +} \ No newline at end of file diff --git a/web/src/components/fragment/libs/model.js b/web/src/components/fragment/libs/model.js new file mode 100644 index 0000000..0ad4922 --- /dev/null +++ b/web/src/components/fragment/libs/model.js @@ -0,0 +1,60 @@ +export function getModelValue(model, column) { + if (typeof model !== 'object') { + return null; + } + if (!model.hasOwnProperty(column)) { + return null; + } + let value = model[column]; + if (typeof value === 'object' && value.hasOwnProperty('value')) { + return value['value'] + } + return value; +} + + +export function getModelLabel(model, column) { + if (typeof model !== 'object') { + return null; + } + if (!model.hasOwnProperty(column)) { + return null; + } + let value = model[column]; + if (typeof value === 'object' && value.hasOwnProperty('label')) { + return value['label'] + } + return value; +} + +export function modelValueOf(model) { + if (typeof model !== 'object') { + return {}; + } + let result = {} + for (let i in model) { + let row = model[i]; + if (typeof row === 'object' && row.hasOwnProperty('value')) { + result[i] = row['value'] + } else { + result[i] = row + } + } + return result; +} + +export function modelLabelOf(model) { + if (typeof model !== 'object') { + return {}; + } + let result = {} + for (let i in model) { + let row = model[i]; + if (typeof row === 'object' && row.hasOwnProperty('label')) { + result[i] = row['label'] + } else { + result[i] = row + } + } + return result; +} \ No newline at end of file diff --git a/web/src/components/fragment/parts/Action.vue b/web/src/components/fragment/parts/Action.vue new file mode 100644 index 0000000..cb63d4d --- /dev/null +++ b/web/src/components/fragment/parts/Action.vue @@ -0,0 +1,46 @@ + + + + + \ No newline at end of file diff --git a/web/src/components/fragment/parts/Cell.vue b/web/src/components/fragment/parts/Cell.vue new file mode 100644 index 0000000..0197cbc --- /dev/null +++ b/web/src/components/fragment/parts/Cell.vue @@ -0,0 +1,195 @@ + + + \ No newline at end of file diff --git a/web/src/components/fragment/parts/FormItem.vue b/web/src/components/fragment/parts/FormItem.vue new file mode 100644 index 0000000..e97f50e --- /dev/null +++ b/web/src/components/fragment/parts/FormItem.vue @@ -0,0 +1,281 @@ + + + \ No newline at end of file diff --git a/web/src/components/fragment/parts/LevelSelect.vue b/web/src/components/fragment/parts/LevelSelect.vue new file mode 100644 index 0000000..77642e5 --- /dev/null +++ b/web/src/components/fragment/parts/LevelSelect.vue @@ -0,0 +1,67 @@ + + + \ No newline at end of file diff --git a/web/src/components/fragment/parts/RouteLink.vue b/web/src/components/fragment/parts/RouteLink.vue new file mode 100644 index 0000000..62ada7e --- /dev/null +++ b/web/src/components/fragment/parts/RouteLink.vue @@ -0,0 +1,41 @@ + + + \ No newline at end of file diff --git a/web/src/components/fragment/parts/Upload.vue b/web/src/components/fragment/parts/Upload.vue new file mode 100644 index 0000000..abf0f49 --- /dev/null +++ b/web/src/components/fragment/parts/Upload.vue @@ -0,0 +1,64 @@ + + \ No newline at end of file diff --git a/web/src/components/widgets/Action.vue b/web/src/components/widgets/Action.vue new file mode 100644 index 0000000..2281fe5 --- /dev/null +++ b/web/src/components/widgets/Action.vue @@ -0,0 +1,52 @@ + + + \ No newline at end of file diff --git a/web/src/components/widgets/Audio.vue b/web/src/components/widgets/Audio.vue new file mode 100644 index 0000000..0ad5410 --- /dev/null +++ b/web/src/components/widgets/Audio.vue @@ -0,0 +1,126 @@ + + + \ No newline at end of file diff --git a/web/src/components/widgets/Avatar.vue b/web/src/components/widgets/Avatar.vue new file mode 100644 index 0000000..0cbd691 --- /dev/null +++ b/web/src/components/widgets/Avatar.vue @@ -0,0 +1,92 @@ + + + \ No newline at end of file diff --git a/web/src/components/widgets/Call.vue b/web/src/components/widgets/Call.vue new file mode 100644 index 0000000..e6eeba9 --- /dev/null +++ b/web/src/components/widgets/Call.vue @@ -0,0 +1,44 @@ + + + \ No newline at end of file diff --git a/web/src/components/widgets/Icon.vue b/web/src/components/widgets/Icon.vue new file mode 100644 index 0000000..f5f7b43 --- /dev/null +++ b/web/src/components/widgets/Icon.vue @@ -0,0 +1,28 @@ + + \ No newline at end of file diff --git a/web/src/components/widgets/Import.vue b/web/src/components/widgets/Import.vue new file mode 100644 index 0000000..327c23c --- /dev/null +++ b/web/src/components/widgets/Import.vue @@ -0,0 +1,104 @@ + + + + + \ No newline at end of file diff --git a/web/src/components/widgets/Loadmore.vue b/web/src/components/widgets/Loadmore.vue new file mode 100644 index 0000000..d9af8a1 --- /dev/null +++ b/web/src/components/widgets/Loadmore.vue @@ -0,0 +1,39 @@ + + + \ No newline at end of file diff --git a/web/src/components/widgets/MenuItem.vue b/web/src/components/widgets/MenuItem.vue new file mode 100644 index 0000000..9bc76a5 --- /dev/null +++ b/web/src/components/widgets/MenuItem.vue @@ -0,0 +1,49 @@ + + + diff --git a/web/src/components/widgets/Percentage.vue b/web/src/components/widgets/Percentage.vue new file mode 100644 index 0000000..b5f2b68 --- /dev/null +++ b/web/src/components/widgets/Percentage.vue @@ -0,0 +1,50 @@ + + + \ No newline at end of file diff --git a/web/src/components/widgets/Preview.vue b/web/src/components/widgets/Preview.vue new file mode 100644 index 0000000..947d526 --- /dev/null +++ b/web/src/components/widgets/Preview.vue @@ -0,0 +1,57 @@ + + + + + + \ No newline at end of file diff --git a/web/src/components/widgets/Tag.vue b/web/src/components/widgets/Tag.vue new file mode 100644 index 0000000..c83ae0e --- /dev/null +++ b/web/src/components/widgets/Tag.vue @@ -0,0 +1,37 @@ + + + + + \ No newline at end of file diff --git a/web/src/components/widgets/UserPanel.vue b/web/src/components/widgets/UserPanel.vue new file mode 100644 index 0000000..ce5289c --- /dev/null +++ b/web/src/components/widgets/UserPanel.vue @@ -0,0 +1,72 @@ + + + \ No newline at end of file diff --git a/web/src/components/widgets/UserPick.vue b/web/src/components/widgets/UserPick.vue new file mode 100644 index 0000000..b9755ff --- /dev/null +++ b/web/src/components/widgets/UserPick.vue @@ -0,0 +1,239 @@ + + + + + \ No newline at end of file diff --git a/web/src/config/menu.js b/web/src/config/menu.js new file mode 100644 index 0000000..0a0b631 --- /dev/null +++ b/web/src/config/menu.js @@ -0,0 +1,708 @@ +const menu = [ + { + label: "控制面板", + icon: "dashboard", + hidden: false, + route: "/dashboard", + children: [ + { + label: "字段配置", + hidden: true, + access: 'allow', + route: "/setting/schemas" + }, + { + label: "消息通知", + hidden: true, + access: 'allow', + route: "/organize/user/notice" + } + ] + }, + { + label: "组织架构", + icon: "org", + hidden: false, + route: '/organizers', + children: [ + { + label: "个人设置", + hidden: true, + access: 'allow', + route: "/organize/user/profile" + }, + { + label: "角色管理", + route: "/organize/roles", + permissions: [ + { + label: '新建', + value: 'create' + }, + { + label: '更新', + value: 'update' + }, + { + label: '删除', + value: 'delete' + } + ] + }, + { + label: "部门管理", + route: "/organize/departments", + permissions: [ + { + label: '新建', + value: 'create' + }, + { + label: '更新', + value: 'update' + }, + { + label: '删除', + value: 'delete' + } + ] + }, + { + label: "座席管理", + route: "/organize/users", + permissions: [ + { + label: '新建', + value: 'create' + }, + { + label: '更新', + value: 'update' + }, + { + label: '删除', + value: 'delete' + } + ] + }, + ] + }, + { + label: "客户管理", + icon: "group", + hidden: false, + route: "/customer", + children: [ + { + label: "联系人", + navigation: true, + route: "/customer/contacts", + children: [ + { + label: "新建联系人", + hidden: true, + route: "/customer/contact/create", + view: '../views/customer/contact/Form.vue' + }, + { + label: "编辑联系人", + hidden: true, + route: "/customer/contact/update", + view: '../views/customer/contact/Form.vue' + }, + { + label: "联系人详情", + hidden: true, + route: "/customer/contact/view", + view: '../views/customer/contact/View.vue' + }, + ], + permissions: [ + { + label: '新建', + value: 'create' + }, + { + label: '更新', + value: 'update' + }, + { + label: '删除', + value: 'delete' + }, + { + label: '详情', + value: 'view' + } + ] + } + ] + }, + { + label: "呼叫任务", + icon: "outbound", + hidden: false, + route: "/outbounds", + children: [ + { + label: "全部任务", + hidden: false, + navigation: true, + route: "/outbound/campaigns", + children: [ + { + label: "新建任务", + hidden: true, + route: "/outbound/campaign/create", + view: '../views/outbound/campaign/Form.vue' + }, + { + label: "编辑任务", + hidden: true, + route: "/outbound/campaign/update", + view: '../views/outbound/campaign/Form.vue' + }, + { + label: "任务详情", + hidden: true, + route: "/outbound/campaign/view", + view: '../views/outbound/campaign/View.vue' + }, + ], + permissions: [ + { + label: '新建', + value: 'create' + }, + { + label: '更新', + value: 'update' + }, + { + label: '删除', + value: 'delete' + }, + { + label: '详情', + value: 'view' + }, + { + label: '启动', + value: 'start' + }, + { + label: '暂停', + value: 'pause' + }, + { + label: '停止', + value: 'stop' + }, + { + label: '导入', + value: 'import' + } + ] + } + ] + }, + { + label: "记录报表", + icon: "data", + route: "/record", + children: [ + { + label: "话单记录", + route: "/record/cdrs", + children: [ + { + label: "通话记录", + route: "/record/cdr/logs" + }, + { + label: "来电未接", + route: "/record/cdr/noanswers" + }, + { + label: "座席未接", + route: "/record/cdr/usernoanswers" + }, + ] + }, + { + label: "话单报表", + route: "/record/reports", + children: [ + { + label: "座席报表", + route: "/record/report/users" + }, + { + label: "呼入报表", + route: "/record/report/inbounds" + }, + ] + }, + { + label: "日志记录", + route: "/record/log", + children: [ + { + label: "登录记录", + route: "/record/log/logins" + }, + { + label: "考勤记录", + route: "/record/log/attendances" + }, + { + label: "操作记录", + route: "/record/log/activities" + }, + { + label: "导入导出", + route: "/record/log/genfiles" + }, + ] + }, + ] + }, + { + label: "状态监控", + icon: "jiankong", + route: "/monitor", + children: [ + { + label: "座席监控", + route: "/monitor/users", + }, + { + label: "话务监控", + route: "/monitor/calls", + }, + { + label: "系统监控", + hidden: true, + route: "/monitor/systems", + }, + ] + }, + { + label: "系统配置", + icon: "set", + hidden: false, + route: "/settings", + children: [ + { + label: "匹配规则", + route: "/setting/rules", + children: [ + { + label: "号码匹配", + navigation: true, + route: "/setting/rule/numbersets", + children: [ + { + label: "号码列表", + hidden: true, + route: "/setting/rule/numberset/list" + } + ], + permissions: [ + { + label: '新建', + value: 'create' + }, + { + label: '更新', + value: 'update' + }, + { + label: '删除', + value: 'delete' + } + ] + }, + { + label: "正则匹配", + route: "/setting/rule/regexps", + permissions: [ + { + label: '新建', + value: 'create' + }, + { + label: '更新', + value: 'update' + }, + { + label: '删除', + value: 'delete' + } + ] + }, + { + label: "时间匹配", + route: "/setting/rule/timeslots", + permissions: [ + { + label: '新建', + value: 'create' + }, + { + label: '更新', + value: 'update' + }, + { + label: '删除', + value: 'delete' + } + ] + }, + { + label: "地区匹配", + route: "/setting/rule/zones", + permissions: [ + { + label: '新建', + value: 'create' + }, + { + label: '更新', + value: 'update' + }, + { + label: '删除', + value: 'delete' + } + ] + } + ] + }, + { + label: "应用配置", + route: "/setting/destinations", + children: [ + { + label: "语言导航", + navigation: true, + route: "/setting/destination/ivrs", + children: [ + { + label: "新建技能组", + hidden: true, + route: "/setting/destination/ivr/create", + view: '../views/setting/destination/ivr/Form.vue' + }, + { + label: "编辑技能组", + hidden: true, + route: "/setting/destination/ivr/update", + view: '../views/setting/destination/ivr/Form.vue' + }, + ], + permissions: [ + { + label: '新建', + value: 'create' + }, + { + label: '更新', + value: 'update' + }, + { + label: '删除', + value: 'delete' + } + ] + }, + { + label: "呼叫队列", + navigation: true, + route: "/setting/destination/queues", + children: [ + { + label: "新建队列", + hidden: true, + route: "/setting/destination/queue/create", + view: '../views/setting/destination/queue/Form.vue' + }, + { + label: "编辑队列", + hidden: true, + route: "/setting/destination/queue/update", + view: '../views/setting/destination/queue/Form.vue' + }, + ], + permissions: [ + { + label: '新建', + value: 'create' + }, + { + label: '更新', + value: 'update' + }, + { + label: '删除', + value: 'delete' + } + ] + }, + { + label: "语言文件", + route: "/setting/destination/sounds", + permissions: [ + { + label: '新建', + value: 'create' + }, + { + label: '更新', + value: 'update' + }, + { + label: '删除', + value: 'delete' + } + ] + }, + { + label: "脚本程序", + route: "/setting/destination/scripts", + permissions: [ + { + label: '新建', + value: 'create' + }, + { + label: '更新', + value: 'update' + }, + { + label: '删除', + value: 'delete' + } + ] + }, + { + label: "快捷功能", + route: "/setting/destination/shortcuts", + permissions: [ + { + label: '新建', + value: 'create' + }, + { + label: '更新', + value: 'update' + }, + { + label: '删除', + value: 'delete' + } + ] + }, + { + label: "网关管理", + navigation: true, + route: "/setting/destination/gateways", + children: [ + { + label: "新建网关", + hidden: true, + route: "/setting/destination/gateway/create", + view: '../views/setting/destination/gateway/Form.vue' + }, + { + label: "编辑网关", + hidden: true, + route: "/setting/destination/gateway/update", + view: '../views/setting/destination/gateway/Form.vue' + }, + ], + permissions: [ + { + label: '新建', + value: 'create' + }, + { + label: '更新', + value: 'update' + }, + { + label: '删除', + value: 'delete' + } + ] + }, + { + label: "设备列表", + route: "/setting/destination/devices", + permissions: [ + { + label: '新建', + value: 'create' + }, + { + label: '更新', + value: 'update' + }, + { + label: '删除', + value: 'delete' + } + ] + }, + ] + }, + { + label: "路由配置", + route: "/setting/routes", + children: [ + { + label: "呼入路由", + route: "/setting/route/inbounds", + navigation: true, + children: [ + { + label: "新增路由", + hidden: true, + route: "/setting/route/inbound/create", + view: '../views/setting/route/inbound/Form.vue' + }, + { + label: "更新路由", + hidden: true, + route: "/setting/route/inbound/update", + view: '../views/setting/route/inbound/Form.vue' + }, + ], + permissions: [ + { + label: '新建', + value: 'create' + }, + { + label: '更新', + value: 'update' + }, + { + label: '删除', + value: 'delete' + } + ] + }, + { + label: "呼出路由", + route: "/setting/route/outbounds", + navigation: true, + children: [ + { + label: "新增路由", + hidden: true, + route: "/setting/route/outbound/create", + view: '../views/setting/route/outbound/Form.vue' + }, + { + label: "更新路由", + hidden: true, + route: "/setting/route/outbound/update", + view: '../views/setting/route/outbound/Form.vue' + }, + ], + permissions: [ + { + label: '新建', + value: 'create' + }, + { + label: '更新', + value: 'update' + }, + { + label: '删除', + value: 'delete' + } + ] + }, + ] + }, + { + label: "高级设置", + route: "/setting/advanced", + children: [ + { + label: "访问控制", + navigation: true, + route: "/setting/advanced/acls", + children: [ + { + label: "规则列表", + hidden: true, + route: "/setting/advanced/acl/list" + } + ], + permissions: [ + { + label: '新建', + value: 'create' + }, + { + label: '更新', + value: 'update' + }, + { + label: '删除', + value: 'delete' + } + ] + }, + { + label: "变量设置", + route: "/setting/advanced/variables", + permissions: [ + { + label: '新建', + value: 'create' + }, + { + label: '更新', + value: 'update' + }, + { + label: '删除', + value: 'delete' + } + ] + }, + { + label: "状态设置", + route: "/setting/advanced/statuses", + permissions: [ + { + label: '新建', + value: 'create' + }, + { + label: '更新', + value: 'update' + }, + { + label: '删除', + value: 'delete' + } + ] + }, + { + label: "字段配置", + hidden: true, + route: "/setting/schemas", + }, + ] + }, + ] + }, +]; + +export default menu; \ No newline at end of file diff --git a/web/src/directive/permission.js b/web/src/directive/permission.js new file mode 100644 index 0000000..81ce8c3 --- /dev/null +++ b/web/src/directive/permission.js @@ -0,0 +1,26 @@ +import useUserStore from '@/stores/user' +const installPermission = (app) => { + app.directive("permission", { + mounted: function (el, binding) { + const { hasPermission } = useUserStore(); + let permission = binding.value; + if (typeof permission !== 'string') { + return; + } + if (permission.indexOf('.') === -1) { + if (app.config.globalProperties && app.config.globalProperties.$route) { + permission = app.config.globalProperties.$route.name + '.' + permission; + } + } + if (!hasPermission(permission)) { + if (el.parentNode) { + el.parentNode.removeChild(el) + } + } + }, + }); +}; + +export default { + install: installPermission +} \ No newline at end of file diff --git a/web/src/i18n/index.js b/web/src/i18n/index.js new file mode 100644 index 0000000..ccd8c8e --- /dev/null +++ b/web/src/i18n/index.js @@ -0,0 +1,4 @@ +const messages = {} + + +export default messages \ No newline at end of file diff --git a/web/src/i18n/locale/en.js b/web/src/i18n/locale/en.js new file mode 100644 index 0000000..c0060f0 --- /dev/null +++ b/web/src/i18n/locale/en.js @@ -0,0 +1,3 @@ +export default { + +} \ No newline at end of file diff --git a/web/src/i18n/locale/zh-cn.js b/web/src/i18n/locale/zh-cn.js new file mode 100644 index 0000000..c0060f0 --- /dev/null +++ b/web/src/i18n/locale/zh-cn.js @@ -0,0 +1,3 @@ +export default { + +} \ No newline at end of file diff --git a/web/src/layouts/default/Headerbar.vue b/web/src/layouts/default/Headerbar.vue new file mode 100644 index 0000000..3ca6d03 --- /dev/null +++ b/web/src/layouts/default/Headerbar.vue @@ -0,0 +1,175 @@ + + + \ No newline at end of file diff --git a/web/src/layouts/default/Layout.vue b/web/src/layouts/default/Layout.vue new file mode 100644 index 0000000..a527317 --- /dev/null +++ b/web/src/layouts/default/Layout.vue @@ -0,0 +1,107 @@ + + + \ No newline at end of file diff --git a/web/src/layouts/default/Sidebar.vue b/web/src/layouts/default/Sidebar.vue new file mode 100644 index 0000000..0315670 --- /dev/null +++ b/web/src/layouts/default/Sidebar.vue @@ -0,0 +1,82 @@ + + + \ No newline at end of file diff --git a/web/src/layouts/default/Statusbar.vue b/web/src/layouts/default/Statusbar.vue new file mode 100644 index 0000000..7436520 --- /dev/null +++ b/web/src/layouts/default/Statusbar.vue @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/web/src/layouts/default/Viewer.vue b/web/src/layouts/default/Viewer.vue new file mode 100644 index 0000000..733e193 --- /dev/null +++ b/web/src/layouts/default/Viewer.vue @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/web/src/layouts/default/parts/Callbar.vue b/web/src/layouts/default/parts/Callbar.vue new file mode 100644 index 0000000..0405628 --- /dev/null +++ b/web/src/layouts/default/parts/Callbar.vue @@ -0,0 +1,345 @@ + + + \ No newline at end of file diff --git a/web/src/layouts/default/parts/Notice.vue b/web/src/layouts/default/parts/Notice.vue new file mode 100644 index 0000000..d994dde --- /dev/null +++ b/web/src/layouts/default/parts/Notice.vue @@ -0,0 +1,30 @@ + + + \ No newline at end of file diff --git a/web/src/layouts/default/parts/Popup.vue b/web/src/layouts/default/parts/Popup.vue new file mode 100644 index 0000000..c4ca374 --- /dev/null +++ b/web/src/layouts/default/parts/Popup.vue @@ -0,0 +1,229 @@ + + \ No newline at end of file diff --git a/web/src/main.js b/web/src/main.js new file mode 100644 index 0000000..df8e463 --- /dev/null +++ b/web/src/main.js @@ -0,0 +1,23 @@ +import ElementPlus from 'element-plus' +import piniaPersistState from 'pinia-plugin-persistedstate' +import 'normalize.css' +import '@/assets/scss/element.scss' +import '@/assets/scss/common.scss' +import '@/assets/scss/style.scss' +import permission from '@/directive/permission' + + +import { createApp } from 'vue' +import { createPinia } from 'pinia' + +import App from './App.vue' +import router from './router' + +const app = createApp(App) + +app.use(createPinia().use(piniaPersistState)) +app.use(router) +app.use(ElementPlus) +app.use(permission) + +app.mount('#app') diff --git a/web/src/router/index.js b/web/src/router/index.js new file mode 100644 index 0000000..1e71422 --- /dev/null +++ b/web/src/router/index.js @@ -0,0 +1,36 @@ +import { createRouter, createWebHashHistory } from 'vue-router' +import LayoutView from '@/layouts/default/Layout.vue' +import { getMenus, buildRoutes } from '@/assets/js/menu' + +const components = import.meta.glob("../views/**/**.vue") + +const childRoutes = buildRoutes(getMenus(), components); + +const router = createRouter({ + history: createWebHashHistory(import.meta.env.BASE_URL), + routes: [ + { + path: '/', + redirect: '/dashboard' + }, + { + path: '/', + name: 'App', + component: LayoutView, + children: childRoutes + }, + { + path: '/login', + name: 'Login', + meta: { allowGuest: true }, + component: () => import('../views/account/Login.vue') + }, + { + path: '/redirect/:path*', + component: () => import('../views/redirect/Redirect.vue'), + } + ] +}) + + +export default router diff --git a/web/src/stores/counter.js b/web/src/stores/counter.js new file mode 100644 index 0000000..b6757ba --- /dev/null +++ b/web/src/stores/counter.js @@ -0,0 +1,12 @@ +import { ref, computed } from 'vue' +import { defineStore } from 'pinia' + +export const useCounterStore = defineStore('counter', () => { + const count = ref(0) + const doubleCount = computed(() => count.value * 2) + function increment() { + count.value++ + } + + return { count, doubleCount, increment } +}) diff --git a/web/src/stores/system.js b/web/src/stores/system.js new file mode 100644 index 0000000..a5f4de7 --- /dev/null +++ b/web/src/stores/system.js @@ -0,0 +1,67 @@ +import { defineStore } from 'pinia' + +const useSystemStore = defineStore('system', { + state: () => { + return { + loading: false, + collapse: false, + sidebarWidth: 200, + flowSidebarVisible: false, + lang: 'zh-CN', + logoUrl: '//s3.tebi.io/tenos/images/logo/jc.png', + copyright: '2005-2023 JUSTCALL 版权 © 2023 集时股份呼叫中心开发团队', + productName: '呼叫中心平台', + variables: {}, + } + }, + getters: { + }, + actions: { + activeLoading() { + this.loading = true + }, + inactiveLoading() { + this.loading = false + }, + setLanguage(lang) { + this.lang = lang + }, + toggleFlowSidebarVisible() { + this.flowSidebarVisible = !this.flowSidebarVisible; + if (this.flowSidebarVisible) { + this.collapse = false; + } else { + this.sidebarWidth = 200; + } + }, + closeFlowSidebar() { + if (this.flowSidebarVisible) { + this.toggleFlowSidebarVisible(); + } + }, + toggleCollapse() { + this.collapse = !this.collapse; + }, + setAttributeValue(attr, value) { + switch (attr) { + case 'name': + this.productName = value; + break + case 'logo': + this.logoUrl = value; + break; + case 'copyright': + this.copyright = value; + break; + default: + this.variables[attr] = value + } + } + }, + persist: { + key: 'G_PTST4', + paths: ['lang', 'collapse', 'sidebarWidth'] + }, +}) + +export default useSystemStore \ No newline at end of file diff --git a/web/src/stores/theme.js b/web/src/stores/theme.js new file mode 100644 index 0000000..7c7b98d --- /dev/null +++ b/web/src/stores/theme.js @@ -0,0 +1,18 @@ +import { defineStore } from 'pinia' + +const useThemeStore = defineStore('theme', { + state: () => { + return { + name: 'light', + backgroundColor: '#F9FBFD', + headerBackgroundColor: '#FFFFFF', + sidebarBackgroundColor: '#152e4d', + sidebarTextColor: '#a8b5c8', + sidebarActiveTextColor: '#ffffff', + } + }, + getters: {}, + persist: true, +}) + +export default useThemeStore \ No newline at end of file diff --git a/web/src/stores/user.js b/web/src/stores/user.js new file mode 100644 index 0000000..22ca25c --- /dev/null +++ b/web/src/stores/user.js @@ -0,0 +1,123 @@ +import { defineStore } from 'pinia' +import { getBaseUrl } from '@/apis/request' + +const useUserStore = defineStore('user', { + state: () => { + return { + uid: '', + username: '', + email: '', + avatar: '//rd.echo.me/fake/users/user-1.jpg', + pwdhash: '', + accessToken: '*', + tokenExpiredAt: 0, + permissions: [], + description: '', + loginDevice: false, + hiddlePhone: false, //号码是否隐藏 + deviceRegistered: false, + unreadMsgCount: 0, + } + }, + getters: {}, + actions: { + setUserID(uid) { + this.uid = uid + }, + setAccessToken(token, ttl) { + this.accessToken = token + if (ttl <= 0) { + this.tokenExpiredAt = 0; + sessionStorage.removeItem('G_PSID1'); + } else { + this.tokenExpiredAt = ((new Date()).getTime() / 1000) + ttl; + sessionStorage.setItem('G_PSID1', this.accessToken); + } + }, + setUsername(s) { + this.username = s + }, + + setEmail(s) { + this.email = s + }, + setPassword(s) { + this.pwdhash = btoa(s) + }, + setAvatar(s) { + if (s.indexOf('//') === -1) { + s = getBaseUrl() + s; + } + this.avatar = s + }, + setAutoLoginDevice(s) { + this.loginDevice = s; + }, + setDeviceRegisterState(ok) { + this.deviceRegistered = ok + }, + setPermissions(s) { + if (typeof s === 'string') { + try { + this.permissions = JSON.parse(s) + } catch (e) { } + } else { + this.permissions = s + } + }, + isAuthorization() { + let timestamp = (new Date()).getTime() / 1000; + return this.tokenExpiredAt > timestamp; + }, + incUnreadMsgCount() { + this.unreadMsgCount++ + }, + decUnreadMsgCount() { + this.unreadMsgCount-- + }, + setUnreadMsgCount(n) { + this.unreadMsgCount = n + }, + getUserID() { + return this.uid; + }, + getAccessToken() { + return this.accessToken; + }, + getAutoLoginDevice() { + return this.loginDevice + }, + getPassword() { + return atob(this.pwdhash); + }, + getUnreadMsgCount() { + return this.unreadMsgCount + }, + getDeviceRegistered() { + return this.deviceRegistered; + }, + hasPermission(permission) { + let ret = false + if (typeof permission === 'boolean') { + ret = permission + } else if (Array.isArray(permission)) { + for (let s of permission) { + if (this.permissions.indexOf(s) > -1) { + ret = true + break + } + } + } else { + ret = this.permissions.indexOf(permission) > -1 + } + return ret + }, + }, + persist: { + key: 'G_PTST3', + paths: ['accessToken', 'tokenExpiredAt', 'pwdhash', 'loginDevice'], + storage: sessionStorage, + }, +}) + +export default useUserStore \ No newline at end of file diff --git a/web/src/views/account/Login.vue b/web/src/views/account/Login.vue new file mode 100644 index 0000000..d54faa6 --- /dev/null +++ b/web/src/views/account/Login.vue @@ -0,0 +1,219 @@ + + + + + \ No newline at end of file diff --git a/web/src/views/dashboard/Index.vue b/web/src/views/dashboard/Index.vue new file mode 100644 index 0000000..a825ec6 --- /dev/null +++ b/web/src/views/dashboard/Index.vue @@ -0,0 +1,8 @@ + + + \ No newline at end of file diff --git a/web/src/views/organize/department/Index.vue b/web/src/views/organize/department/Index.vue new file mode 100644 index 0000000..e34c443 --- /dev/null +++ b/web/src/views/organize/department/Index.vue @@ -0,0 +1,24 @@ + + + \ No newline at end of file diff --git a/web/src/views/redirect/Redirect.vue b/web/src/views/redirect/Redirect.vue new file mode 100644 index 0000000..c6aa70e --- /dev/null +++ b/web/src/views/redirect/Redirect.vue @@ -0,0 +1,7 @@ + + + \ No newline at end of file diff --git a/web/vite.config.js b/web/vite.config.js new file mode 100644 index 0000000..4217010 --- /dev/null +++ b/web/vite.config.js @@ -0,0 +1,18 @@ +import { fileURLToPath, URL } from 'node:url' + +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import vueDevTools from 'vite-plugin-vue-devtools' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + vueDevTools(), + ], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + }, + }, +})