diff --git a/CHANGELOG.md b/CHANGELOG.md index 086f8f0a..685f5789 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # 更新日志 + +## v4.0.5 + +* 功能优化:已授权系统在后台显示授权信息 +* 功能优化:使用思维链提示词生成思维导图,确保生成的思维导图不会出现格式错误 +* 功能优化:优化首页登录注册页面的 UI +* BUG修复:修复License验证的逻辑漏洞 +* Bug修复:后台添加用户的时候密码规则限制跟前台注册保持一致 +* 功能新增:管理后台支持切换主题,支持 light 和 dark 两种主题 +* 功能新增:移动端新增 DALL-E 绘画功能 +* 功能新增:新增移动端首页功能,移动端支持 light 和 dark 两种主题 +* 功能新增:移动支持免登录预览功能 +* Bug修复:解决在同一个浏览器开启多个对话时候对话内容会相互乱串的问题 +* Bug修复:修复部分中转 API 模型会出现第一输出的字符被淹没的Bug + ## v4.0.4 + * Bug修复:修复统一千问第二句不回复的问题 * 功能优化:MJ 和 SD 任务正在执行时不更新已完成任务列表,加快页面渲染速度 * 功能新增:Dalle AI 绘画功能实现 @@ -21,15 +37,14 @@ * 功能新增:支持为模型绑定 API KEY,比如为 GPT3.5 模型绑定免费的 API KEY 给用户免费使用来引流不至于消耗你的收费 KEY。 * 功能新增:支持管理后台 Logo 修改 -## v4.0.2 - +## 4.0.2 * 功能新增:支持前端菜单可以配置 * 功能优化:在登录和注册界面标题显示软件版本号 * 功能优化:MJ 绘画支持 --sref 和 --cref 图片一致性参数 * 功能优化:使用 leveldb 解决 SD 绘图进度图片预览问题 -* Bug修复:解决因为图片上传使用相对路径而导致融图失败的问题 +* Bug修复:解决因为图片上传使用相对路径而导致融图失败的问题。 * 功能新增:手机端支持 Stable-Diffusion 绘画 -* Bug修复:修复管理后台 API KEY 删除失败的问题 +* 功能新增:管理后台登录页面增加行为验证码,防止爆破 ## v4.0.1 @@ -340,4 +355,4 @@ 5. 保存聊天记录,支持聊天上下文。 6. 重构后台管理模块,更友好,扩展性更好的后台管理系统。 7. 引入 ip2region 组件,记录用户的登录IP和地址。 -8. 支持会话搜索过滤。 +8. 支持会话搜索过滤。 \ No newline at end of file diff --git a/api/Makefile b/api/Makefile index deafd9ff..e72ae935 100644 --- a/api/Makefile +++ b/api/Makefile @@ -1,5 +1,5 @@ SHELL=/usr/bin/env bash -NAME := chatgpt-plus +NAME := geekai all: amd64 arm64 amd64: diff --git a/api/config.sample.toml b/api/config.sample.toml index 1f7849d5..2b9642de 100644 --- a/api/config.sample.toml +++ b/api/config.sample.toml @@ -108,7 +108,8 @@ WeChatBot = false ApiURL = "https://api.xunhupay.com" NotifyURL = "https://ai.r9it.com/api/payment/hupipay/notify" -[SmtpConfig] # 注意,阿里云服务器禁用了25号端口,所以如果需要使用邮件功能,请别用阿里云服务器 +[SmtpConfig] # 注意,阿里云服务器禁用了25号端口,请使用 465 端口,并开启 TLS 连接 + UseTls = false Host = "smtp.163.com" Port = 25 AppName = "极客学长" diff --git a/api/core/app_server.go b/api/core/app_server.go index d40feb90..7c6b99af 100644 --- a/api/core/app_server.go +++ b/api/core/app_server.go @@ -1,11 +1,18 @@ package core +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( "bytes" - "chatplus/core/types" - "chatplus/store/model" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core/types" + "geekai/store/model" + "geekai/utils" + "geekai/utils/resp" "context" "fmt" "github.com/gin-gonic/gin" @@ -200,10 +207,13 @@ func authorizeMiddleware(s *AppServer, client *redis.Client) gin.HandlerFunc { func needLogin(c *gin.Context) bool { if c.Request.URL.Path == "/api/user/login" || + c.Request.URL.Path == "/api/user/logout" || c.Request.URL.Path == "/api/user/resetPass" || c.Request.URL.Path == "/api/admin/login" || + c.Request.URL.Path == "/api/admin/logout" || c.Request.URL.Path == "/api/admin/login/captcha" || c.Request.URL.Path == "/api/user/register" || + c.Request.URL.Path == "/api/user/session" || c.Request.URL.Path == "/api/chat/history" || c.Request.URL.Path == "/api/chat/detail" || c.Request.URL.Path == "/api/chat/list" || diff --git a/api/core/config.go b/api/core/config.go index 74f7e305..04160490 100644 --- a/api/core/config.go +++ b/api/core/config.go @@ -1,10 +1,17 @@ package core +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( "bytes" - "chatplus/core/types" - logger2 "chatplus/logger" - "chatplus/utils" + "geekai/core/types" + logger2 "geekai/logger" + "geekai/utils" "os" "github.com/BurntSushi/toml" diff --git a/api/core/types/chat.go b/api/core/types/chat.go index b6b63aa2..4e90afaa 100644 --- a/api/core/types/chat.go +++ b/api/core/types/chat.go @@ -1,5 +1,12 @@ package types +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + // ApiRequest API 请求实体 type ApiRequest struct { Model string `json:"model,omitempty"` // 兼容百度文心一言 diff --git a/api/core/types/client.go b/api/core/types/client.go index 6988a60b..5f65ac59 100644 --- a/api/core/types/client.go +++ b/api/core/types/client.go @@ -1,5 +1,12 @@ package types +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( "errors" "github.com/gorilla/websocket" diff --git a/api/core/types/config.go b/api/core/types/config.go index 4c59875a..355b08e6 100644 --- a/api/core/types/config.go +++ b/api/core/types/config.go @@ -1,5 +1,12 @@ package types +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( "fmt" ) @@ -119,11 +126,11 @@ type RedisConfig struct { const LicenseKey = "Geek-AI-License" type License struct { - Key string // 许可证书密钥 - MachineId string // 机器码 - UserNum int // 用户数量 - ExpiredAt int64 // 过期时间 - IsActive bool // 是否激活 + Key string `json:"key"` // 许可证书密钥 + MachineId string `json:"machine_id"` // 机器码 + UserNum int `json:"user_num"` // 用户数量 + ExpiredAt int64 `json:"expired_at"` // 过期时间 + IsActive bool `json:"is_active"` // 是否激活 } func (c RedisConfig) Url() string { diff --git a/api/core/types/function.go b/api/core/types/function.go index 09808461..30ac03cf 100644 --- a/api/core/types/function.go +++ b/api/core/types/function.go @@ -1,5 +1,12 @@ package types +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + type ToolCall struct { Type string `json:"type"` Function struct { diff --git a/api/core/types/locked_map.go b/api/core/types/locked_map.go index 26ed6f46..5ae764bb 100644 --- a/api/core/types/locked_map.go +++ b/api/core/types/locked_map.go @@ -1,5 +1,12 @@ package types +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( "context" "sync" diff --git a/api/core/types/order.go b/api/core/types/order.go index 78a7c40b..90cc0cb1 100644 --- a/api/core/types/order.go +++ b/api/core/types/order.go @@ -1,5 +1,12 @@ package types +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + type OrderStatus int const ( diff --git a/api/core/types/oss.go b/api/core/types/oss.go index 596ec3df..9bc93b41 100644 --- a/api/core/types/oss.go +++ b/api/core/types/oss.go @@ -1,5 +1,12 @@ package types +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + type OSSConfig struct { Active string Local LocalStorageConfig diff --git a/api/core/types/session.go b/api/core/types/session.go index ab95de56..9108e51a 100644 --- a/api/core/types/session.go +++ b/api/core/types/session.go @@ -1,11 +1,17 @@ package types +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + const LoginUserID = "LOGIN_USER_ID" const LoginUserCache = "LOGIN_USER_CACHE" const UserAuthHeader = "Authorization" const AdminAuthHeader = "Admin-Authorization" -const ChatTokenHeader = "Chat-Token" // Session configs struct type Session struct { diff --git a/api/core/types/sms.go b/api/core/types/sms.go index 31d129af..510e8071 100644 --- a/api/core/types/sms.go +++ b/api/core/types/sms.go @@ -1,5 +1,12 @@ package types +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + type SMSConfig struct { Active string Ali SmsConfigAli diff --git a/api/core/types/task.go b/api/core/types/task.go index bb1f7689..fbae9a3a 100644 --- a/api/core/types/task.go +++ b/api/core/types/task.go @@ -1,5 +1,12 @@ package types +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + // TaskType 任务类别 type TaskType string diff --git a/api/core/types/web.go b/api/core/types/web.go index 041a9859..08f5ee90 100644 --- a/api/core/types/web.go +++ b/api/core/types/web.go @@ -1,5 +1,12 @@ package types +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + // BizVo 业务返回 VO type BizVo struct { Code BizCode `json:"code"` diff --git a/api/go.mod b/api/go.mod index dcc8c8dc..095eb217 100644 --- a/api/go.mod +++ b/api/go.mod @@ -1,4 +1,4 @@ -module chatplus +module geekai go 1.19 diff --git a/api/handler/admin/admin_handler.go b/api/handler/admin/admin_handler.go index d9d3e988..3fceab8e 100644 --- a/api/handler/admin/admin_handler.go +++ b/api/handler/admin/admin_handler.go @@ -1,14 +1,21 @@ package admin +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - "chatplus/handler" - logger2 "chatplus/logger" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/core/types" + "geekai/handler" + logger2 "geekai/logger" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" + "geekai/utils/resp" "context" "fmt" "github.com/go-redis/redis/v8" diff --git a/api/handler/admin/api_key_handler.go b/api/handler/admin/api_key_handler.go index 7935d0ba..87eab556 100644 --- a/api/handler/admin/api_key_handler.go +++ b/api/handler/admin/api_key_handler.go @@ -1,13 +1,20 @@ package admin +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - "chatplus/handler" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/core/types" + "geekai/handler" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" + "geekai/utils/resp" "github.com/gin-gonic/gin" "gorm.io/gorm" diff --git a/api/handler/admin/captcha_handler.go b/api/handler/admin/captcha_handler.go index 2377f027..e6b81cbf 100644 --- a/api/handler/admin/captcha_handler.go +++ b/api/handler/admin/captcha_handler.go @@ -1,9 +1,16 @@ package admin +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/handler" - "chatplus/utils/resp" + "geekai/core" + "geekai/handler" + "geekai/utils/resp" "github.com/gin-gonic/gin" "github.com/mojocn/base64Captcha" ) diff --git a/api/handler/admin/chat_handler.go b/api/handler/admin/chat_handler.go index 64fb5587..af76e76e 100644 --- a/api/handler/admin/chat_handler.go +++ b/api/handler/admin/chat_handler.go @@ -1,13 +1,20 @@ package admin +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - "chatplus/handler" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/core/types" + "geekai/handler" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" + "geekai/utils/resp" "github.com/gin-gonic/gin" "gorm.io/gorm" ) diff --git a/api/handler/admin/chat_model_handler.go b/api/handler/admin/chat_model_handler.go index ad0ce3c2..c5efe78d 100644 --- a/api/handler/admin/chat_model_handler.go +++ b/api/handler/admin/chat_model_handler.go @@ -1,13 +1,20 @@ package admin +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - "chatplus/handler" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/core/types" + "geekai/handler" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" + "geekai/utils/resp" "github.com/gin-gonic/gin" "gorm.io/gorm" ) diff --git a/api/handler/admin/chat_role_handler.go b/api/handler/admin/chat_role_handler.go index caec61b9..9ca2d3df 100644 --- a/api/handler/admin/chat_role_handler.go +++ b/api/handler/admin/chat_role_handler.go @@ -1,13 +1,20 @@ package admin +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - "chatplus/handler" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/core/types" + "geekai/handler" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" + "geekai/utils/resp" "time" "github.com/gin-gonic/gin" diff --git a/api/handler/admin/config_handler.go b/api/handler/admin/config_handler.go index adb1540e..303632a0 100644 --- a/api/handler/admin/config_handler.go +++ b/api/handler/admin/config_handler.go @@ -1,24 +1,34 @@ package admin +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - "chatplus/handler" - "chatplus/store" - "chatplus/store/model" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/core/types" + "geekai/handler" + "geekai/service" + "geekai/store" + "geekai/store/model" + "geekai/utils" + "geekai/utils/resp" "github.com/gin-gonic/gin" + "github.com/shirou/gopsutil/host" "gorm.io/gorm" ) type ConfigHandler struct { handler.BaseHandler - levelDB *store.LevelDB + levelDB *store.LevelDB + licenseService *service.LicenseService } -func NewConfigHandler(app *core.AppServer, db *gorm.DB, levelDB *store.LevelDB) *ConfigHandler { - return &ConfigHandler{BaseHandler: handler.BaseHandler{App: app, DB: db}, levelDB: levelDB} +func NewConfigHandler(app *core.AppServer, db *gorm.DB, levelDB *store.LevelDB, licenseService *service.LicenseService) *ConfigHandler { + return &ConfigHandler{BaseHandler: handler.BaseHandler{App: app, DB: db}, levelDB: levelDB, licenseService: licenseService} } func (h *ConfigHandler) Update(c *gin.Context) { @@ -88,3 +98,33 @@ func (h *ConfigHandler) Get(c *gin.Context) { resp.SUCCESS(c, value) } + +// Active 激活系统 +func (h *ConfigHandler) Active(c *gin.Context) { + var data struct { + License string `json:"license"` + } + if err := c.ShouldBindJSON(&data); err != nil { + resp.ERROR(c, types.InvalidArgs) + return + } + info, err := host.Info() + if err != nil { + resp.ERROR(c, err.Error()) + return + } + + err = h.licenseService.ActiveLicense(data.License, info.HostID) + if err != nil { + resp.ERROR(c, err.Error()) + return + } + + resp.SUCCESS(c, info.HostID) +} + +// GetLicense 获取 License 信息 +func (h *ConfigHandler) GetLicense(c *gin.Context) { + license := h.licenseService.GetLicense() + resp.SUCCESS(c, license) +} diff --git a/api/handler/admin/dashboard_handler.go b/api/handler/admin/dashboard_handler.go index 82a875a5..536cd497 100644 --- a/api/handler/admin/dashboard_handler.go +++ b/api/handler/admin/dashboard_handler.go @@ -1,11 +1,18 @@ package admin +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - "chatplus/handler" - "chatplus/store/model" - "chatplus/utils/resp" + "geekai/core" + "geekai/core/types" + "geekai/handler" + "geekai/store/model" + "geekai/utils/resp" "github.com/gin-gonic/gin" "github.com/shopspring/decimal" "gorm.io/gorm" diff --git a/api/handler/admin/function_handler.go b/api/handler/admin/function_handler.go index d9eed1fc..474f32b7 100644 --- a/api/handler/admin/function_handler.go +++ b/api/handler/admin/function_handler.go @@ -1,13 +1,20 @@ package admin +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - "chatplus/handler" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/core/types" + "geekai/handler" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" + "geekai/utils/resp" "github.com/golang-jwt/jwt/v5" diff --git a/api/handler/admin/menu_handler.go b/api/handler/admin/menu_handler.go index 7358ffa9..ef1991e2 100644 --- a/api/handler/admin/menu_handler.go +++ b/api/handler/admin/menu_handler.go @@ -1,13 +1,20 @@ package admin +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - "chatplus/handler" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/core/types" + "geekai/handler" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" + "geekai/utils/resp" "github.com/gin-gonic/gin" "gorm.io/gorm" ) diff --git a/api/handler/admin/order_handler.go b/api/handler/admin/order_handler.go index 1183e01f..a64fa281 100644 --- a/api/handler/admin/order_handler.go +++ b/api/handler/admin/order_handler.go @@ -1,13 +1,20 @@ package admin +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - "chatplus/handler" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/core/types" + "geekai/handler" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" + "geekai/utils/resp" "github.com/gin-gonic/gin" "gorm.io/gorm" diff --git a/api/handler/admin/power_log_handler.go b/api/handler/admin/power_log_handler.go index 3f15108e..56f63c84 100644 --- a/api/handler/admin/power_log_handler.go +++ b/api/handler/admin/power_log_handler.go @@ -1,13 +1,20 @@ package admin +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - "chatplus/handler" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/core/types" + "geekai/handler" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" + "geekai/utils/resp" "github.com/gin-gonic/gin" "gorm.io/gorm" diff --git a/api/handler/admin/product_handler.go b/api/handler/admin/product_handler.go index 42eff03f..92f0d228 100644 --- a/api/handler/admin/product_handler.go +++ b/api/handler/admin/product_handler.go @@ -1,13 +1,20 @@ package admin +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - "chatplus/handler" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/core/types" + "geekai/handler" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" + "geekai/utils/resp" "github.com/gin-gonic/gin" "gorm.io/gorm" "time" diff --git a/api/handler/admin/reward_handler.go b/api/handler/admin/reward_handler.go index a2c44cb9..50daa21d 100644 --- a/api/handler/admin/reward_handler.go +++ b/api/handler/admin/reward_handler.go @@ -1,13 +1,20 @@ package admin +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - "chatplus/handler" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/core/types" + "geekai/handler" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" + "geekai/utils/resp" "github.com/gin-gonic/gin" "gorm.io/gorm" ) diff --git a/api/handler/admin/upload_handler.go b/api/handler/admin/upload_handler.go index 17bbf9f4..64674329 100644 --- a/api/handler/admin/upload_handler.go +++ b/api/handler/admin/upload_handler.go @@ -1,11 +1,18 @@ package admin +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/handler" - "chatplus/service/oss" - "chatplus/store/model" - "chatplus/utils/resp" + "geekai/core" + "geekai/handler" + "geekai/service/oss" + "geekai/store/model" + "geekai/utils/resp" "github.com/gin-gonic/gin" "gorm.io/gorm" "time" diff --git a/api/handler/admin/user_handler.go b/api/handler/admin/user_handler.go index 430b66bb..4148edd8 100644 --- a/api/handler/admin/user_handler.go +++ b/api/handler/admin/user_handler.go @@ -1,13 +1,21 @@ package admin +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - "chatplus/handler" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/core/types" + "geekai/handler" + "geekai/service" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" + "geekai/utils/resp" "fmt" "time" @@ -17,10 +25,11 @@ import ( type UserHandler struct { handler.BaseHandler + licenseService *service.LicenseService } -func NewUserHandler(app *core.AppServer, db *gorm.DB) *UserHandler { - return &UserHandler{BaseHandler: handler.BaseHandler{App: app, DB: db}} +func NewUserHandler(app *core.AppServer, db *gorm.DB, licenseService *service.LicenseService) *UserHandler { + return &UserHandler{BaseHandler: handler.BaseHandler{App: app, DB: db}, licenseService: licenseService} } // List 用户列表 @@ -75,6 +84,13 @@ func (h *UserHandler) Save(c *gin.Context) { resp.ERROR(c, types.InvalidArgs) return } + // 检测最大注册人数 + var totalUser int64 + h.DB.Model(&model.User{}).Count(&totalUser) + if int(totalUser) >= h.licenseService.GetLicense().UserNum { + resp.ERROR(c, "当前注册用户数已达上限,请请升级 License") + return + } var user = model.User{} var res *gorm.DB var userVo vo.User diff --git a/api/handler/base_handler.go b/api/handler/base_handler.go index 2991b5d3..406b9b53 100644 --- a/api/handler/base_handler.go +++ b/api/handler/base_handler.go @@ -1,11 +1,18 @@ package handler +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - logger2 "chatplus/logger" - "chatplus/store/model" - "chatplus/utils" + "geekai/core" + "geekai/core/types" + logger2 "geekai/logger" + "geekai/store/model" + "geekai/utils" "errors" "fmt" "gorm.io/gorm" diff --git a/api/handler/captcha_handler.go b/api/handler/captcha_handler.go index fe186d15..57852b4a 100644 --- a/api/handler/captcha_handler.go +++ b/api/handler/captcha_handler.go @@ -1,9 +1,16 @@ package handler +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core/types" - "chatplus/service" - "chatplus/utils/resp" + "geekai/core/types" + "geekai/service" + "geekai/utils/resp" "github.com/gin-gonic/gin" ) diff --git a/api/handler/chat_model_handler.go b/api/handler/chat_model_handler.go index e852fc23..baf3e471 100644 --- a/api/handler/chat_model_handler.go +++ b/api/handler/chat_model_handler.go @@ -1,11 +1,18 @@ package handler +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" + "geekai/utils/resp" "github.com/gin-gonic/gin" "gorm.io/gorm" ) diff --git a/api/handler/chat_role_handler.go b/api/handler/chat_role_handler.go index a555256d..f246cb37 100644 --- a/api/handler/chat_role_handler.go +++ b/api/handler/chat_role_handler.go @@ -1,12 +1,19 @@ package handler +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/core/types" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" + "geekai/utils/resp" "github.com/gin-gonic/gin" "gorm.io/gorm" diff --git a/api/handler/chatimpl/azure_handler.go b/api/handler/chatimpl/azure_handler.go index 11b3b69a..30e19a59 100644 --- a/api/handler/chatimpl/azure_handler.go +++ b/api/handler/chatimpl/azure_handler.go @@ -1,11 +1,18 @@ package chatimpl +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( "bufio" - "chatplus/core/types" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" + "geekai/core/types" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" "context" "encoding/json" "fmt" diff --git a/api/handler/chatimpl/baidu_handler.go b/api/handler/chatimpl/baidu_handler.go index 08809dfe..4917d28b 100644 --- a/api/handler/chatimpl/baidu_handler.go +++ b/api/handler/chatimpl/baidu_handler.go @@ -1,11 +1,18 @@ package chatimpl +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( "bufio" - "chatplus/core/types" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" + "geekai/core/types" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" "context" "encoding/json" "fmt" diff --git a/api/handler/chatimpl/chat_handler.go b/api/handler/chatimpl/chat_handler.go index 6a70f281..e6ec7b81 100644 --- a/api/handler/chatimpl/chat_handler.go +++ b/api/handler/chatimpl/chat_handler.go @@ -1,20 +1,28 @@ package chatimpl +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( "bytes" - "chatplus/core" - "chatplus/core/types" - "chatplus/handler" - logger2 "chatplus/logger" - "chatplus/service/oss" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "chatplus/utils/resp" "context" "encoding/json" "errors" "fmt" + "geekai/core" + "geekai/core/types" + "geekai/handler" + logger2 "geekai/logger" + "geekai/service" + "geekai/service/oss" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" + "geekai/utils/resp" "net/http" "net/url" "regexp" @@ -35,15 +43,17 @@ var logger = logger2.GetLogger() type ChatHandler struct { handler.BaseHandler - redis *redis.Client - uploadManager *oss.UploaderManager + redis *redis.Client + uploadManager *oss.UploaderManager + licenseService *service.LicenseService } -func NewChatHandler(app *core.AppServer, db *gorm.DB, redis *redis.Client, manager *oss.UploaderManager) *ChatHandler { +func NewChatHandler(app *core.AppServer, db *gorm.DB, redis *redis.Client, manager *oss.UploaderManager, licenseService *service.LicenseService) *ChatHandler { return &ChatHandler{ - BaseHandler: handler.BaseHandler{App: app, DB: db}, - redis: redis, - uploadManager: manager, + BaseHandler: handler.BaseHandler{App: app, DB: db}, + redis: redis, + uploadManager: manager, + licenseService: licenseService, } } @@ -134,8 +144,10 @@ func (h *ChatHandler) ChatHandle(c *gin.Context) { for { _, msg, err := client.Receive() if err != nil { + logger.Debugf("close connection: %s", client.Conn.RemoteAddr()) client.Close() h.App.ChatClients.Delete(sessionId) + h.App.ChatSession.Delete(sessionId) cancelFunc := h.App.ReqCancelFunc.Get(sessionId) if cancelFunc != nil { cancelFunc() @@ -469,16 +481,24 @@ func (h *ChatHandler) StopGenerate(c *gin.Context) { func (h *ChatHandler) doRequest(ctx context.Context, req types.ApiRequest, session *types.ChatSession, apiKey *model.ApiKey) (*http.Response, error) { // if the chat model bind a KEY, use it directly if session.Model.KeyId > 0 { - h.DB.Debug().Where("id", session.Model.KeyId).Find(apiKey) + h.DB.Debug().Where("id", session.Model.KeyId).Where("enabled", true).Find(apiKey) } // use the last unused key if apiKey.Id == 0 { - h.DB.Debug().Where("platform = ?", session.Model.Platform).Where("type = ?", "chat").Where("enabled = ?", true).Order("last_used_at ASC").First(apiKey) + h.DB.Debug().Where("platform", session.Model.Platform).Where("type", "chat").Where("enabled", true).Order("last_used_at ASC").First(apiKey) } if apiKey.Id == 0 { return nil, errors.New("no available key, please import key") } + // ONLY allow apiURL in blank list + if session.Model.Platform == types.OpenAI { + err := h.licenseService.IsValidApiURL(apiKey.ApiURL) + if err != nil { + return nil, err + } + } + var apiURL string switch session.Model.Platform { case types.Azure: diff --git a/api/handler/chatimpl/chat_item_handler.go b/api/handler/chatimpl/chat_item_handler.go index b9337556..3e04bf6e 100644 --- a/api/handler/chatimpl/chat_item_handler.go +++ b/api/handler/chatimpl/chat_item_handler.go @@ -1,11 +1,18 @@ package chatimpl +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core/types" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core/types" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" + "geekai/utils/resp" "github.com/gin-gonic/gin" "gorm.io/gorm" @@ -187,12 +194,20 @@ func (h *ChatHandler) Detail(c *gin.Context) { return } + // 填充角色名称 + var role model.ChatRole + res = h.DB.Where("id", chatItem.RoleId).First(&role) + if res.Error != nil { + resp.ERROR(c, "Role not found") + return + } + var chatItemVo vo.ChatItem err := utils.CopyObject(chatItem, &chatItemVo) if err != nil { resp.ERROR(c, err.Error()) return } - + chatItemVo.RoleName = role.Name resp.SUCCESS(c, chatItemVo) } diff --git a/api/handler/chatimpl/chatglm_handler.go b/api/handler/chatimpl/chatglm_handler.go index 5f391b3f..1094d9ce 100644 --- a/api/handler/chatimpl/chatglm_handler.go +++ b/api/handler/chatimpl/chatglm_handler.go @@ -1,11 +1,18 @@ package chatimpl +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( "bufio" - "chatplus/core/types" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" + "geekai/core/types" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" "context" "encoding/json" "fmt" diff --git a/api/handler/chatimpl/openai_handler.go b/api/handler/chatimpl/openai_handler.go index 2eb32866..8a7a2891 100644 --- a/api/handler/chatimpl/openai_handler.go +++ b/api/handler/chatimpl/openai_handler.go @@ -1,14 +1,21 @@ package chatimpl +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( "bufio" - "chatplus/core/types" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" "context" "encoding/json" "fmt" + "geekai/core/types" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" "html/template" "io" "strings" @@ -68,12 +75,16 @@ func (h *ChatHandler) sendOpenAiMessage( var responseBody = types.ApiResponse{} err = json.Unmarshal([]byte(line[6:]), &responseBody) - if err != nil || len(responseBody.Choices) == 0 { // 数据解析出错 + if err != nil { // 数据解析出错 logger.Error(err, line) utils.ReplyMessage(ws, ErrorMsg) utils.ReplyMessage(ws, ErrImg) break } + if len(responseBody.Choices) == 0 { // Fixed: 兼容 Azure API 第一个输出空行 + continue + } + if responseBody.Choices[0].FinishReason == "stop" && len(contents) == 0 { utils.ReplyMessage(ws, "抱歉😔😔😔,AI助手由于未知原因已经停止输出内容。") break @@ -115,11 +126,8 @@ func (h *ChatHandler) sendOpenAiMessage( break } - // 初始化 role - if responseBody.Choices[0].Delta.Role != "" && message.Role == "" { - message.Role = responseBody.Choices[0].Delta.Role - continue - } else if responseBody.Choices[0].FinishReason != "" { + // output stopped + if responseBody.Choices[0].FinishReason != "" { break // 输出完成或者输出中断了 } else { content := responseBody.Choices[0].Delta.Content diff --git a/api/handler/chatimpl/qwen_handler.go b/api/handler/chatimpl/qwen_handler.go index 340f00de..49e0a5d3 100644 --- a/api/handler/chatimpl/qwen_handler.go +++ b/api/handler/chatimpl/qwen_handler.go @@ -1,11 +1,18 @@ package chatimpl +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( "bufio" - "chatplus/core/types" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" + "geekai/core/types" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" "context" "encoding/json" "fmt" diff --git a/api/handler/chatimpl/xunfei_handler.go b/api/handler/chatimpl/xunfei_handler.go index 36a5b785..ee0c7829 100644 --- a/api/handler/chatimpl/xunfei_handler.go +++ b/api/handler/chatimpl/xunfei_handler.go @@ -1,16 +1,23 @@ package chatimpl +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core/types" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" "context" "crypto/hmac" "crypto/sha256" "encoding/base64" "encoding/json" "fmt" + "geekai/core/types" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" "github.com/gorilla/websocket" "gorm.io/gorm" "html/template" @@ -73,11 +80,11 @@ func (h *ChatHandler) sendXunFeiMessage( var res *gorm.DB // use the bind key if session.Model.KeyId > 0 { - res = h.DB.Where("id", session.Model.KeyId).Find(&apiKey) + res = h.DB.Where("id", session.Model.KeyId).Where("enabled", true).Find(&apiKey) } // use the last unused key if res.Error != nil { - res = h.DB.Where("platform = ?", session.Model.Platform).Where("type = ?", "chat").Where("enabled = ?", true).Order("last_used_at ASC").First(&apiKey) + res = h.DB.Where("platform", session.Model.Platform).Where("type", "chat").Where("enabled", true).Order("last_used_at ASC").First(&apiKey) } if res.Error != nil { utils.ReplyMessage(ws, "抱歉😔😔😔,系统已经没有可用的 API KEY,请联系管理员!") diff --git a/api/handler/config_handler.go b/api/handler/config_handler.go index ee58a94a..0b8fdb03 100644 --- a/api/handler/config_handler.go +++ b/api/handler/config_handler.go @@ -1,10 +1,17 @@ package handler +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/store/model" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/store/model" + "geekai/utils" + "geekai/utils/resp" "github.com/gin-gonic/gin" "gorm.io/gorm" diff --git a/api/handler/dalle_handler.go b/api/handler/dalle_handler.go index 9ccdf710..ede79696 100644 --- a/api/handler/dalle_handler.go +++ b/api/handler/dalle_handler.go @@ -1,14 +1,21 @@ package handler +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - "chatplus/service/dalle" - "chatplus/service/oss" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/core/types" + "geekai/service/dalle" + "geekai/service/oss" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" + "geekai/utils/resp" "net/http" "github.com/gorilla/websocket" @@ -86,7 +93,7 @@ func (h *DallJobHandler) preCheck(c *gin.Context) bool { return false } - if user.Power < h.App.SysConfig.DallPower { + if user.Power < h.App.SysConfig.SdPower { resp.ERROR(c, "当前用户剩余算力不足以完成本次绘画!") return false } diff --git a/api/handler/function_handler.go b/api/handler/function_handler.go index 0941db08..6917efde 100644 --- a/api/handler/function_handler.go +++ b/api/handler/function_handler.go @@ -1,13 +1,20 @@ package handler +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - "chatplus/service/dalle" - "chatplus/service/oss" - "chatplus/store/model" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/core/types" + "geekai/service/dalle" + "geekai/service/oss" + "geekai/store/model" + "geekai/utils" + "geekai/utils/resp" "errors" "fmt" "strings" @@ -181,6 +188,11 @@ func (h *FunctionHandler) Dall3(c *gin.Context) { return } + if user.Power < h.App.SysConfig.DallPower { + resp.ERROR(c, "创建 DALL-E 绘图任务失败,算力不足") + return + } + // create dall task prompt := utils.InterfaceToString(params["prompt"]) job := model.DallJob{ diff --git a/api/handler/invite_handler.go b/api/handler/invite_handler.go index 37bb82d7..3e4fdb53 100644 --- a/api/handler/invite_handler.go +++ b/api/handler/invite_handler.go @@ -1,12 +1,19 @@ package handler +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/core/types" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" + "geekai/utils/resp" "github.com/gin-gonic/gin" "gorm.io/gorm" "strings" diff --git a/api/handler/markmap_handler.go b/api/handler/markmap_handler.go index ddaaa134..248e5802 100644 --- a/api/handler/markmap_handler.go +++ b/api/handler/markmap_handler.go @@ -1,15 +1,22 @@ package handler +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( "bufio" "bytes" - "chatplus/core" - "chatplus/core/types" - "chatplus/store/model" - "chatplus/utils" "encoding/json" "errors" "fmt" + "geekai/core" + "geekai/core/types" + "geekai/store/model" + "geekai/utils" "github.com/gin-gonic/gin" "github.com/gorilla/websocket" "gorm.io/gorm" @@ -199,25 +206,6 @@ func (h *MarkMapHandler) sendMessage(client *types.WsClient, prompt string, mode } } - // 扣减算力 - res = h.DB.Model(&model.User{}).Where("id", userId).UpdateColumn("power", gorm.Expr("power - ?", chatModel.Power)) - if res.Error == nil { - // 记录算力消费日志 - var u model.User - h.DB.Where("id", userId).First(&u) - h.DB.Create(&model.PowerLog{ - UserId: u.Id, - Username: u.Username, - Type: types.PowerConsume, - Amount: chatModel.Power, - Mark: types.PowerSub, - Balance: u.Power, - Model: chatModel.Value, - Remark: fmt.Sprintf("AI绘制思维导图,模型名称:%s, ", chatModel.Value), - CreatedAt: time.Now(), - }) - } - return nil } @@ -225,11 +213,13 @@ func (h *MarkMapHandler) doRequest(req types.ApiRequest, chatModel model.ChatMod // if the chat model bind a KEY, use it directly var res *gorm.DB if chatModel.KeyId > 0 { - res = h.DB.Where("id", chatModel.KeyId).Find(apiKey) + res = h.DB.Where("id", chatModel.KeyId).Where("enabled", true).Find(apiKey) } // use the last unused key if apiKey.Id == 0 { - res = h.DB.Where("platform = ?", types.OpenAI).Where("type = ?", "chat").Where("enabled = ?", true).Order("last_used_at ASC").First(apiKey) + res = h.DB.Where("platform", types.OpenAI). + Where("type", "chat"). + Where("enabled", true).Order("last_used_at ASC").First(apiKey) } if res.Error != nil { return nil, errors.New("no available key, please import key") diff --git a/api/handler/menu_handler.go b/api/handler/menu_handler.go index b922f54c..647ed1e0 100644 --- a/api/handler/menu_handler.go +++ b/api/handler/menu_handler.go @@ -1,11 +1,18 @@ package handler +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" + "geekai/utils/resp" "github.com/gin-gonic/gin" "gorm.io/gorm" ) diff --git a/api/handler/mj_handler.go b/api/handler/mj_handler.go index e0e0f020..2f210801 100644 --- a/api/handler/mj_handler.go +++ b/api/handler/mj_handler.go @@ -1,15 +1,22 @@ package handler +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - "chatplus/service" - "chatplus/service/mj" - "chatplus/service/oss" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/core/types" + "geekai/service" + "geekai/service/mj" + "geekai/service/oss" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" + "geekai/utils/resp" "encoding/base64" "fmt" "net/http" diff --git a/api/handler/order_handler.go b/api/handler/order_handler.go index a1cecc67..a56daa82 100644 --- a/api/handler/order_handler.go +++ b/api/handler/order_handler.go @@ -1,12 +1,19 @@ package handler +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/core/types" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" + "geekai/utils/resp" "github.com/gin-gonic/gin" "gorm.io/gorm" diff --git a/api/handler/payment_handler.go b/api/handler/payment_handler.go index 2b8f5dce..b6162784 100644 --- a/api/handler/payment_handler.go +++ b/api/handler/payment_handler.go @@ -1,13 +1,20 @@ package handler +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - "chatplus/service" - "chatplus/service/payment" - "chatplus/store/model" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/core/types" + "geekai/service" + "geekai/service/payment" + "geekai/store/model" + "geekai/utils" + "geekai/utils/resp" "embed" "encoding/base64" "fmt" diff --git a/api/handler/power_log_handler.go b/api/handler/power_log_handler.go index ba2ec4df..77732217 100644 --- a/api/handler/power_log_handler.go +++ b/api/handler/power_log_handler.go @@ -1,12 +1,19 @@ package handler +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/core/types" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" + "geekai/utils/resp" "github.com/gin-gonic/gin" "gorm.io/gorm" diff --git a/api/handler/product_handler.go b/api/handler/product_handler.go index 3e530896..34959aaf 100644 --- a/api/handler/product_handler.go +++ b/api/handler/product_handler.go @@ -1,11 +1,18 @@ package handler +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" + "geekai/utils/resp" "github.com/gin-gonic/gin" "gorm.io/gorm" ) diff --git a/api/handler/reward_handler.go b/api/handler/reward_handler.go index f568b09b..ec019e97 100644 --- a/api/handler/reward_handler.go +++ b/api/handler/reward_handler.go @@ -1,12 +1,19 @@ package handler +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/core/types" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" + "geekai/utils/resp" "fmt" "github.com/gin-gonic/gin" "gorm.io/gorm" diff --git a/api/handler/sd_handler.go b/api/handler/sd_handler.go index 25f122a0..c4a5c3ef 100644 --- a/api/handler/sd_handler.go +++ b/api/handler/sd_handler.go @@ -1,16 +1,23 @@ package handler +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - "chatplus/service" - "chatplus/service/oss" - "chatplus/service/sd" - "chatplus/store" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/core/types" + "geekai/service" + "geekai/service/oss" + "geekai/service/sd" + "geekai/store" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" + "geekai/utils/resp" "fmt" "net/http" "time" diff --git a/api/handler/sms_handler.go b/api/handler/sms_handler.go index 827faeb3..7740a77e 100644 --- a/api/handler/sms_handler.go +++ b/api/handler/sms_handler.go @@ -1,12 +1,19 @@ package handler +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - "chatplus/service" - "chatplus/service/sms" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/core/types" + "geekai/service" + "geekai/service/sms" + "geekai/utils" + "geekai/utils/resp" "strings" "github.com/gin-gonic/gin" diff --git a/api/handler/test_handler.go b/api/handler/test_handler.go index aad47233..35aba79f 100644 --- a/api/handler/test_handler.go +++ b/api/handler/test_handler.go @@ -1,8 +1,8 @@ package handler import ( - "chatplus/service" - "chatplus/service/payment" + "geekai/service" + "geekai/service/payment" "gorm.io/gorm" ) diff --git a/api/handler/upload_handler.go b/api/handler/upload_handler.go index 8c2e0f8e..af37f972 100644 --- a/api/handler/upload_handler.go +++ b/api/handler/upload_handler.go @@ -1,12 +1,19 @@ package handler +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/service/oss" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/service/oss" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" + "geekai/utils/resp" "github.com/gin-gonic/gin" "gorm.io/gorm" "time" diff --git a/api/handler/user_handler.go b/api/handler/user_handler.go index db4d4066..6068f565 100644 --- a/api/handler/user_handler.go +++ b/api/handler/user_handler.go @@ -1,12 +1,20 @@ package handler +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - "chatplus/store/model" - "chatplus/store/vo" - "chatplus/utils" - "chatplus/utils/resp" + "geekai/core" + "geekai/core/types" + "geekai/service" + "geekai/store/model" + "geekai/store/vo" + "geekai/utils" + "geekai/utils/resp" "fmt" "strings" "time" @@ -21,16 +29,23 @@ import ( type UserHandler struct { BaseHandler - searcher *xdb.Searcher - redis *redis.Client + searcher *xdb.Searcher + redis *redis.Client + licenseService *service.LicenseService } func NewUserHandler( app *core.AppServer, db *gorm.DB, searcher *xdb.Searcher, - client *redis.Client) *UserHandler { - return &UserHandler{BaseHandler: BaseHandler{DB: db, App: app}, searcher: searcher, redis: client} + client *redis.Client, + licenseService *service.LicenseService) *UserHandler { + return &UserHandler{ + BaseHandler: BaseHandler{DB: db, App: app}, + searcher: searcher, + redis: client, + licenseService: licenseService, + } } // Register user register @@ -53,9 +68,17 @@ func (h *UserHandler) Register(c *gin.Context) { return } + // 检测最大注册人数 + var totalUser int64 + h.DB.Model(&model.User{}).Count(&totalUser) + if int(totalUser) >= h.licenseService.GetLicense().UserNum { + resp.ERROR(c, "当前注册用户数已达上限,请请升级 License") + return + } + // 检查验证码 var key string - if data.RegWay == "email" || data.RegWay == "mobile" || data.Code != "" { + if data.RegWay == "email" || data.RegWay == "mobile" { key = CodeStorePrefix + data.Username code, err := h.redis.Get(c, key).Result() if err != nil || code != data.Code { @@ -216,18 +239,10 @@ func (h *UserHandler) Login(c *gin.Context) { // Logout 注 销 func (h *UserHandler) Logout(c *gin.Context) { - sessionId := c.GetHeader(types.ChatTokenHeader) key := h.GetUserKey(c) if _, err := h.redis.Del(c, key).Result(); err != nil { logger.Error("error with delete session: ", err) } - // 删除 websocket 会话列表 - h.App.ChatSession.Delete(sessionId) - // 关闭 socket 连接 - client := h.App.ChatClients.Get(sessionId) - if client != nil { - client.Close() - } resp.SUCCESS(c) } diff --git a/api/logger/logger.go b/api/logger/logger.go index d744708d..cd50840b 100644 --- a/api/logger/logger.go +++ b/api/logger/logger.go @@ -1,5 +1,12 @@ package logger +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( "go.uber.org/zap" "go.uber.org/zap/zapcore" diff --git a/api/main.go b/api/main.go index a1df7ef6..12a3192c 100644 --- a/api/main.go +++ b/api/main.go @@ -1,23 +1,30 @@ package main +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core" - "chatplus/core/types" - "chatplus/handler" - "chatplus/handler/admin" - "chatplus/handler/chatimpl" - logger2 "chatplus/logger" - "chatplus/service" - "chatplus/service/dalle" - "chatplus/service/mj" - "chatplus/service/oss" - "chatplus/service/payment" - "chatplus/service/sd" - "chatplus/service/sms" - "chatplus/service/wx" - "chatplus/store" "context" "embed" + "geekai/core" + "geekai/core/types" + "geekai/handler" + "geekai/handler/admin" + "geekai/handler/chatimpl" + logger2 "geekai/logger" + "geekai/service" + "geekai/service/dalle" + "geekai/service/mj" + "geekai/service/oss" + "geekai/service/payment" + "geekai/service/sd" + "geekai/service/sms" + "geekai/service/wx" + "geekai/store" "io" "log" "os" @@ -164,6 +171,11 @@ func main() { // 邮件服务 fx.Provide(service.NewSmtpService), + // License 服务 + fx.Provide(service.NewLicenseService), + fx.Invoke(func(licenseService *service.LicenseService) { + licenseService.SyncLicense() + }), // 微信机器人服务 fx.Provide(wx.NewWeChatBot), @@ -288,6 +300,8 @@ func main() { group := s.Engine.Group("/api/admin/") group.POST("config/update", h.Update) group.GET("config/get", h.Get) + group.POST("active", h.Active) + group.GET("config/get/license", h.GetLicense) }), fx.Invoke(func(s *core.AppServer, h *admin.ManagerHandler) { group := s.Engine.Group("/api/admin/") diff --git a/api/service/captcha_service.go b/api/service/captcha_service.go index e8cfd39b..864e9395 100644 --- a/api/service/captcha_service.go +++ b/api/service/captcha_service.go @@ -1,9 +1,16 @@ package service +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core/types" "errors" "fmt" + "geekai/core/types" "github.com/imroc/req/v3" "time" ) diff --git a/api/service/dalle/service.go b/api/service/dalle/service.go index f3929e84..c1cb148c 100644 --- a/api/service/dalle/service.go +++ b/api/service/dalle/service.go @@ -1,14 +1,21 @@ package dalle +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core/types" - logger2 "chatplus/logger" - "chatplus/service" - "chatplus/service/oss" - "chatplus/service/sd" - "chatplus/store" - "chatplus/store/model" - "chatplus/utils" + "geekai/core/types" + logger2 "geekai/logger" + "geekai/service" + "geekai/service/oss" + "geekai/service/sd" + "geekai/store" + "geekai/store/model" + "geekai/utils" "errors" "fmt" "github.com/go-redis/redis/v8" @@ -263,7 +270,7 @@ func (s *Service) CheckTaskStatus() { go func() { logger.Info("Running Stable-Diffusion task status checking ...") for { - var jobs []model.SdJob + var jobs []model.DallJob res := s.db.Where("progress < ?", 100).Find(&jobs) if res.Error != nil { time.Sleep(5 * time.Second) @@ -287,7 +294,7 @@ func (s *Service) CheckTaskStatus() { Balance: user.Power + job.Power, Mark: types.PowerAdd, Model: "dall-e-3", - Remark: fmt.Sprintf("任务失败,退回算力。任务ID:%s", job.TaskId), + Remark: fmt.Sprintf("任务失败,退回算力。任务ID:%d", job.Id), CreatedAt: time.Now(), }) } diff --git a/api/service/license_service.go b/api/service/license_service.go new file mode 100644 index 00000000..d31eaaf7 --- /dev/null +++ b/api/service/license_service.go @@ -0,0 +1,195 @@ +package service + +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +import ( + "errors" + "fmt" + "geekai/core" + "geekai/core/types" + "geekai/store" + "strings" + "time" + + "github.com/imroc/req/v3" + "github.com/shirou/gopsutil/host" +) + +type LicenseService struct { + config types.ApiConfig + levelDB *store.LevelDB + license *types.License + urlWhiteList []string + machineId string +} + +func NewLicenseService(server *core.AppServer, levelDB *store.LevelDB) *LicenseService { + var license types.License + var machineId string + _ = levelDB.Get(types.LicenseKey, &license) + info, err := host.Info() + if err == nil { + machineId = info.HostID + } + logger.Infof("License: %+v", license) + return &LicenseService{ + config: server.Config.ApiConfig, + levelDB: levelDB, + license: &license, + machineId: machineId, + } +} + +type License struct { + Name string `json:"name"` + License string `json:"license"` + Mid string `json:"mid"` + ActiveAt int64 `json:"active_at"` + ExpiredAt int64 `json:"expired_at"` + UserNum int `json:"user_num"` +} + +// ActiveLicense 激活 License +func (s *LicenseService) ActiveLicense(license string, machineId string) error { + var res struct { + Code types.BizCode `json:"code"` + Message string `json:"message"` + Data License `json:"data"` + } + apiURL := fmt.Sprintf("%s/%s", s.config.ApiURL, "api/license/active") + response, err := req.C().R(). + SetBody(map[string]string{"license": license, "machine_id": machineId}). + SetSuccessResult(&res).Post(apiURL) + if err != nil { + return fmt.Errorf("发送激活请求失败: %v", err) + } + + if response.IsErrorState() { + return fmt.Errorf("发送激活请求失败:%v", response.Status) + } + + if res.Code != types.Success { + return fmt.Errorf("激活失败:%v", res.Message) + } + + s.license = &types.License{ + Key: license, + MachineId: machineId, + UserNum: res.Data.UserNum, + ExpiredAt: res.Data.ExpiredAt, + IsActive: true, + } + err = s.levelDB.Put(types.LicenseKey, s.license) + if err != nil { + return fmt.Errorf("保存许可证书失败:%v", err) + } + return nil +} + +// SyncLicense 定期同步 License +func (s *LicenseService) SyncLicense() { + go func() { + retryCounter := 0 + for { + license, err := s.fetchLicense() + if err != nil { + retryCounter++ + if retryCounter < 5 { + logger.Error(err) + } + s.license.IsActive = false + } else { + s.license = license + } + + urls, err := s.fetchUrlWhiteList() + if err == nil { + s.urlWhiteList = urls + } + + time.Sleep(time.Second * 10) + } + }() +} + +func (s *LicenseService) fetchLicense() (*types.License, error) { + var res struct { + Code types.BizCode `json:"code"` + Message string `json:"message"` + Data License `json:"data"` + } + apiURL := fmt.Sprintf("%s/%s", s.config.ApiURL, "api/license/check") + response, err := req.C().R(). + SetBody(map[string]string{"license": s.license.Key, "machine_id": s.machineId}). + SetSuccessResult(&res).Post(apiURL) + if err != nil { + return nil, fmt.Errorf("发送激活请求失败: %v", err) + } + if response.IsErrorState() { + return nil, fmt.Errorf("激活失败:%v", response.Status) + } + if res.Code != types.Success { + return nil, fmt.Errorf("激活失败:%v", res.Message) + } + + return &types.License{ + Key: res.Data.License, + MachineId: res.Data.Mid, + UserNum: res.Data.UserNum, + ExpiredAt: res.Data.ExpiredAt, + IsActive: true, + }, nil +} + +func (s *LicenseService) fetchUrlWhiteList() ([]string, error) { + var res struct { + Code types.BizCode `json:"code"` + Message string `json:"message"` + Data []string `json:"data"` + } + apiURL := fmt.Sprintf("%s/%s", s.config.ApiURL, "api/license/urls") + response, err := req.C().R().SetSuccessResult(&res).Get(apiURL) + if err != nil { + return nil, fmt.Errorf("发送请求失败: %v", err) + } + if response.IsErrorState() { + return nil, fmt.Errorf("发送请求失败:%v", response.Status) + } + if res.Code != types.Success { + return nil, fmt.Errorf("获取白名单失败:%v", res.Message) + } + + return res.Data, nil +} + +// GetLicense 获取许可信息 +func (s *LicenseService) GetLicense() *types.License { + return s.license +} + +// IsValidApiURL 判断是否合法的中转 URL +func (s *LicenseService) IsValidApiURL(uri string) error { + // 获得许可授权的直接放行 + if s.license.IsActive { + if s.license.MachineId != s.machineId { + return errors.New("系统使用了盗版的许可证书") + } + + if time.Now().Unix() > s.license.ExpiredAt { + return errors.New("系统许可证书已经过期") + } + return nil + } + + for _, v := range s.urlWhiteList { + if strings.HasPrefix(uri, v) { + return nil + } + } + return fmt.Errorf("当前 API 地址 %s 不在白名单列表当中。", uri) +} diff --git a/api/service/mj/client.go b/api/service/mj/client.go index 2b71b007..504553f0 100644 --- a/api/service/mj/client.go +++ b/api/service/mj/client.go @@ -1,6 +1,13 @@ package mj -import "chatplus/core/types" +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +import "geekai/core/types" type Client interface { Imagine(task types.MjTask) (ImageRes, error) diff --git a/api/service/mj/plus_client.go b/api/service/mj/plus_client.go index 822d4b91..7f85fd61 100644 --- a/api/service/mj/plus_client.go +++ b/api/service/mj/plus_client.go @@ -1,11 +1,18 @@ package mj +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core/types" - "chatplus/utils" "encoding/base64" "errors" "fmt" + "geekai/core/types" + "geekai/utils" "github.com/imroc/req/v3" "io" "time" diff --git a/api/service/mj/pool.go b/api/service/mj/pool.go index bd6eedf2..993d5c32 100644 --- a/api/service/mj/pool.go +++ b/api/service/mj/pool.go @@ -1,13 +1,21 @@ package mj +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core/types" - logger2 "chatplus/logger" - "chatplus/service/oss" - "chatplus/service/sd" - "chatplus/store" - "chatplus/store/model" "fmt" + "geekai/core/types" + logger2 "geekai/logger" + "geekai/service" + "geekai/service/oss" + "geekai/service/sd" + "geekai/store" + "geekai/store/model" "github.com/go-redis/redis/v8" "time" @@ -26,7 +34,7 @@ type ServicePool struct { var logger = logger2.GetLogger() -func NewServicePool(db *gorm.DB, redisCli *redis.Client, manager *oss.UploaderManager, appConfig *types.AppConfig) *ServicePool { +func NewServicePool(db *gorm.DB, redisCli *redis.Client, manager *oss.UploaderManager, appConfig *types.AppConfig, licenseService *service.LicenseService) *ServicePool { services := make([]*Service, 0) taskQueue := store.NewRedisQueue("MidJourney_Task_Queue", redisCli) notifyQueue := store.NewRedisQueue("MidJourney_Notify_Queue", redisCli) @@ -35,7 +43,12 @@ func NewServicePool(db *gorm.DB, redisCli *redis.Client, manager *oss.UploaderMa if config.Enabled == false { continue } - + err := licenseService.IsValidApiURL(config.ApiURL) + if err != nil { + logger.Error(err) + continue + } + cli := NewPlusClient(config) name := fmt.Sprintf("mj-plus-service-%d", k) plusService := NewService(name, taskQueue, notifyQueue, db, cli) diff --git a/api/service/mj/proxy_client.go b/api/service/mj/proxy_client.go index b8df3211..e6a557d4 100644 --- a/api/service/mj/proxy_client.go +++ b/api/service/mj/proxy_client.go @@ -1,11 +1,18 @@ package mj +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core/types" - "chatplus/utils" "encoding/base64" "errors" "fmt" + "geekai/core/types" + "geekai/utils" "github.com/imroc/req/v3" "io" ) diff --git a/api/service/mj/service.go b/api/service/mj/service.go index 0d5f0dea..9a87b5b8 100644 --- a/api/service/mj/service.go +++ b/api/service/mj/service.go @@ -1,13 +1,20 @@ package mj +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core/types" - "chatplus/service" - "chatplus/service/sd" - "chatplus/store" - "chatplus/store/model" - "chatplus/utils" "fmt" + "geekai/core/types" + "geekai/service" + "geekai/service/sd" + "geekai/store" + "geekai/store/model" + "geekai/utils" "strings" "time" diff --git a/api/service/oss/aliyun_oss.go b/api/service/oss/aliyun_oss.go index d713d278..00dcc8d7 100644 --- a/api/service/oss/aliyun_oss.go +++ b/api/service/oss/aliyun_oss.go @@ -1,11 +1,18 @@ package oss +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( "bytes" - "chatplus/core/types" - "chatplus/utils" "encoding/base64" "fmt" + "geekai/core/types" + "geekai/utils" "net/url" "path/filepath" "strings" diff --git a/api/service/oss/localstorage.go b/api/service/oss/localstorage.go index aeff4427..f64ff055 100644 --- a/api/service/oss/localstorage.go +++ b/api/service/oss/localstorage.go @@ -1,10 +1,17 @@ package oss +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core/types" - "chatplus/utils" "encoding/base64" "fmt" + "geekai/core/types" + "geekai/utils" "github.com/gin-gonic/gin" "net/url" "os" diff --git a/api/service/oss/minio_oss.go b/api/service/oss/minio_oss.go index 75a9cfbb..5eaca499 100644 --- a/api/service/oss/minio_oss.go +++ b/api/service/oss/minio_oss.go @@ -1,11 +1,18 @@ package oss +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core/types" - "chatplus/utils" "context" "encoding/base64" "fmt" + "geekai/core/types" + "geekai/utils" "net/url" "path/filepath" "strings" diff --git a/api/service/oss/qiniu_oss.go b/api/service/oss/qiniu_oss.go index 79ea5d1c..703b6d78 100644 --- a/api/service/oss/qiniu_oss.go +++ b/api/service/oss/qiniu_oss.go @@ -1,12 +1,19 @@ package oss +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( "bytes" - "chatplus/core/types" - "chatplus/utils" "context" "encoding/base64" "fmt" + "geekai/core/types" + "geekai/utils" "net/url" "path/filepath" "strings" diff --git a/api/service/oss/uploader.go b/api/service/oss/uploader.go index be6a6f53..435e22d7 100644 --- a/api/service/oss/uploader.go +++ b/api/service/oss/uploader.go @@ -1,5 +1,12 @@ package oss +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import "github.com/gin-gonic/gin" const Local = "LOCAL" diff --git a/api/service/oss/uploader_manager.go b/api/service/oss/uploader_manager.go index 8a6c1359..573891b5 100644 --- a/api/service/oss/uploader_manager.go +++ b/api/service/oss/uploader_manager.go @@ -1,7 +1,14 @@ package oss +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core/types" + "geekai/core/types" "strings" ) diff --git a/api/service/payment/alipay_service.go b/api/service/payment/alipay_service.go index d33d5032..228949d2 100644 --- a/api/service/payment/alipay_service.go +++ b/api/service/payment/alipay_service.go @@ -1,9 +1,16 @@ package payment +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core/types" - logger2 "chatplus/logger" "fmt" + "geekai/core/types" + logger2 "geekai/logger" "github.com/smartwalle/alipay/v3" "log" "net/url" diff --git a/api/service/payment/hupipay_serive.go b/api/service/payment/hupipay_serive.go index 675e0a03..d0d0809a 100644 --- a/api/service/payment/hupipay_serive.go +++ b/api/service/payment/hupipay_serive.go @@ -1,12 +1,19 @@ package payment +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core/types" - "chatplus/utils" "crypto/md5" "encoding/hex" "errors" "fmt" + "geekai/core/types" + "geekai/utils" "io" "net/http" "net/url" diff --git a/api/service/payment/payjs_service.go b/api/service/payment/payjs_service.go index 13774173..1b42406b 100644 --- a/api/service/payment/payjs_service.go +++ b/api/service/payment/payjs_service.go @@ -1,12 +1,19 @@ package payment +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core/types" - "chatplus/utils" "crypto/md5" "encoding/hex" "errors" "fmt" + "geekai/core/types" + "geekai/utils" "io" "net/http" "net/url" diff --git a/api/service/sd/pool.go b/api/service/sd/pool.go index e191eef8..22110f40 100644 --- a/api/service/sd/pool.go +++ b/api/service/sd/pool.go @@ -1,11 +1,18 @@ package sd +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core/types" - "chatplus/service/oss" - "chatplus/store" - "chatplus/store/model" "fmt" + "geekai/core/types" + "geekai/service/oss" + "geekai/store" + "geekai/store/model" "time" "github.com/go-redis/redis/v8" diff --git a/api/service/sd/service.go b/api/service/sd/service.go index 9d6932a2..4f6fb2c7 100644 --- a/api/service/sd/service.go +++ b/api/service/sd/service.go @@ -1,13 +1,20 @@ package sd +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core/types" - "chatplus/service" - "chatplus/service/oss" - "chatplus/store" - "chatplus/store/model" - "chatplus/utils" "fmt" + "geekai/core/types" + "geekai/service" + "geekai/service/oss" + "geekai/store" + "geekai/store/model" + "geekai/utils" "strings" "time" diff --git a/api/service/sd/types.go b/api/service/sd/types.go index eb172bcd..efdb970a 100644 --- a/api/service/sd/types.go +++ b/api/service/sd/types.go @@ -1,6 +1,13 @@ package sd -import logger2 "chatplus/logger" +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +import logger2 "geekai/logger" var logger = logger2.GetLogger() diff --git a/api/service/sms/aliyun.go b/api/service/sms/aliyun.go index 8a876189..d0ea1b97 100644 --- a/api/service/sms/aliyun.go +++ b/api/service/sms/aliyun.go @@ -1,8 +1,15 @@ package sms +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core/types" "fmt" + "geekai/core/types" "github.com/aliyun/alibaba-cloud-sdk-go/services/dysmsapi" ) diff --git a/api/service/sms/bao.go b/api/service/sms/bao.go index 25201f2b..a00398de 100644 --- a/api/service/sms/bao.go +++ b/api/service/sms/bao.go @@ -1,9 +1,16 @@ package sms +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core/types" - "chatplus/utils" "fmt" + "geekai/core/types" + "geekai/utils" "io" "net/http" "net/url" diff --git a/api/service/sms/service.go b/api/service/sms/service.go index 16166aab..14d12ca9 100644 --- a/api/service/sms/service.go +++ b/api/service/sms/service.go @@ -1,5 +1,12 @@ package sms +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + const Ali = "ALI" const Bao = "BAO" diff --git a/api/service/sms/service_manager.go b/api/service/sms/service_manager.go index c360cc0f..0a4fcac8 100644 --- a/api/service/sms/service_manager.go +++ b/api/service/sms/service_manager.go @@ -1,8 +1,15 @@ package sms +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core/types" - logger2 "chatplus/logger" + "geekai/core/types" + logger2 "geekai/logger" "strings" ) diff --git a/api/service/smtp_sms_service.go b/api/service/smtp_sms_service.go index 256de934..e93e9265 100644 --- a/api/service/smtp_sms_service.go +++ b/api/service/smtp_sms_service.go @@ -1,10 +1,17 @@ package service +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( "bytes" - "chatplus/core/types" "crypto/tls" "fmt" + "geekai/core/types" "mime" "net/smtp" "net/textproto" diff --git a/api/service/snowflake.go b/api/service/snowflake.go index a4c19193..d99caa84 100644 --- a/api/service/snowflake.go +++ b/api/service/snowflake.go @@ -1,5 +1,12 @@ package service +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( "fmt" "sync" diff --git a/api/service/wx/bot.go b/api/service/wx/bot.go index cb62f237..47384581 100644 --- a/api/service/wx/bot.go +++ b/api/service/wx/bot.go @@ -1,8 +1,15 @@ package wx +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - logger2 "chatplus/logger" - "chatplus/store/model" + logger2 "geekai/logger" + "geekai/store/model" "github.com/eatmoreapple/openwechat" "github.com/skip2/go-qrcode" "gorm.io/gorm" diff --git a/api/service/wx/tranaction.go b/api/service/wx/tranaction.go index ca1383af..2dfb529e 100644 --- a/api/service/wx/tranaction.go +++ b/api/service/wx/tranaction.go @@ -1,5 +1,12 @@ package wx +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( "encoding/xml" "net/url" diff --git a/api/service/xxl_job_service.go b/api/service/xxl_job_service.go index 69cb1b79..14fec1db 100644 --- a/api/service/xxl_job_service.go +++ b/api/service/xxl_job_service.go @@ -1,12 +1,19 @@ package service +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core/types" - logger2 "chatplus/logger" - "chatplus/store/model" - "chatplus/utils" "context" "fmt" + "geekai/core/types" + logger2 "geekai/logger" + "geekai/store/model" + "geekai/utils" "github.com/xxl-job/xxl-job-executor-go" "gorm.io/gorm" "time" diff --git a/api/store/leveldb.go b/api/store/leveldb.go index 269653e8..5de00425 100644 --- a/api/store/leveldb.go +++ b/api/store/leveldb.go @@ -1,5 +1,12 @@ package store +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( "encoding/json" diff --git a/api/store/model/order.go b/api/store/model/order.go index a9c6c66d..a1c6929f 100644 --- a/api/store/model/order.go +++ b/api/store/model/order.go @@ -1,7 +1,7 @@ package model import ( - "chatplus/core/types" + "geekai/core/types" "gorm.io/gorm" ) diff --git a/api/store/model/power_log.go b/api/store/model/power_log.go index e0d6a527..fd6c3228 100644 --- a/api/store/model/power_log.go +++ b/api/store/model/power_log.go @@ -1,7 +1,7 @@ package model import ( - "chatplus/core/types" + "geekai/core/types" "time" ) diff --git a/api/store/mysql.go b/api/store/mysql.go index 5e8e6550..70aba960 100644 --- a/api/store/mysql.go +++ b/api/store/mysql.go @@ -1,7 +1,14 @@ package store +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core/types" + "geekai/core/types" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" diff --git a/api/store/redis.go b/api/store/redis.go index c72521d2..f2e4814f 100644 --- a/api/store/redis.go +++ b/api/store/redis.go @@ -1,8 +1,15 @@ package store +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core/types" "context" + "geekai/core/types" "github.com/go-redis/redis/v8" ) diff --git a/api/store/redis_queue.go b/api/store/redis_queue.go index 71a730a6..3251eb57 100644 --- a/api/store/redis_queue.go +++ b/api/store/redis_queue.go @@ -1,8 +1,15 @@ package store +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/utils" "context" + "geekai/utils" "github.com/go-redis/redis/v8" ) diff --git a/api/store/vo/chat_item.go b/api/store/vo/chat_item.go index ec43c320..4ac66fcc 100644 --- a/api/store/vo/chat_item.go +++ b/api/store/vo/chat_item.go @@ -2,11 +2,12 @@ package vo type ChatItem struct { BaseVo - UserId uint `json:"user_id"` - Icon string `json:"icon"` - RoleId uint `json:"role_id"` - ChatId string `json:"chat_id"` - ModelId uint `json:"model_id"` - Model string `json:"model"` - Title string `json:"title"` + UserId uint `json:"user_id"` + Icon string `json:"icon"` + RoleId uint `json:"role_id"` + RoleName string `json:"role_name"` + ChatId string `json:"chat_id"` + ModelId uint `json:"model_id"` + Model string `json:"model"` + Title string `json:"title"` } diff --git a/api/store/vo/chat_role.go b/api/store/vo/chat_role.go index e13d5f0c..4bd530f8 100644 --- a/api/store/vo/chat_role.go +++ b/api/store/vo/chat_role.go @@ -1,6 +1,6 @@ package vo -import "chatplus/core/types" +import "geekai/core/types" type ChatRole struct { BaseVo diff --git a/api/store/vo/config.go b/api/store/vo/config.go index 6b07094d..a0e79075 100644 --- a/api/store/vo/config.go +++ b/api/store/vo/config.go @@ -1,6 +1,6 @@ package vo -import "chatplus/core/types" +import "geekai/core/types" type Config struct { Id uint `json:"id"` diff --git a/api/store/vo/order.go b/api/store/vo/order.go index bd7087a7..c076d002 100644 --- a/api/store/vo/order.go +++ b/api/store/vo/order.go @@ -1,7 +1,7 @@ package vo import ( - "chatplus/core/types" + "geekai/core/types" ) type Order struct { diff --git a/api/store/vo/power_log.go b/api/store/vo/power_log.go index f0e598b7..ae19a9d6 100644 --- a/api/store/vo/power_log.go +++ b/api/store/vo/power_log.go @@ -1,6 +1,6 @@ package vo -import "chatplus/core/types" +import "geekai/core/types" type PowerLog struct { Id uint `json:"id"` diff --git a/api/store/vo/sd_job.go b/api/store/vo/sd_job.go index 0fcf95ab..8d521504 100644 --- a/api/store/vo/sd_job.go +++ b/api/store/vo/sd_job.go @@ -1,7 +1,7 @@ package vo import ( - "chatplus/core/types" + "geekai/core/types" "time" ) diff --git a/api/test/test.go b/api/test/test.go index ff31c2f5..46b90764 100644 --- a/api/test/test.go +++ b/api/test/test.go @@ -1,7 +1,7 @@ package main import ( - "chatplus/utils" + "geekai/utils" "fmt" ) diff --git a/api/utils/common.go b/api/utils/common.go index d921a363..142256d8 100644 --- a/api/utils/common.go +++ b/api/utils/common.go @@ -1,5 +1,12 @@ package utils +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( "bytes" "encoding/json" diff --git a/api/utils/crypto.go b/api/utils/crypto.go index 3f885311..30fa07d5 100644 --- a/api/utils/crypto.go +++ b/api/utils/crypto.go @@ -1,5 +1,12 @@ package utils +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( "bytes" "crypto/aes" diff --git a/api/utils/net.go b/api/utils/net.go index 74d05e03..5f02922c 100644 --- a/api/utils/net.go +++ b/api/utils/net.go @@ -1,9 +1,16 @@ package utils +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core/types" - logger2 "chatplus/logger" "encoding/json" + "geekai/core/types" + logger2 "geekai/logger" "io" "net/http" "net/url" diff --git a/api/utils/openai.go b/api/utils/openai.go index 53b61264..4fa3ee0f 100644 --- a/api/utils/openai.go +++ b/api/utils/openai.go @@ -1,9 +1,16 @@ package utils +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core/types" - "chatplus/store/model" "fmt" + "geekai/core/types" + "geekai/store/model" "github.com/imroc/req/v3" "github.com/pkoukk/tiktoken-go" "gorm.io/gorm" diff --git a/api/utils/permission.go b/api/utils/permission.go deleted file mode 100644 index dfbee3de..00000000 --- a/api/utils/permission.go +++ /dev/null @@ -1,36 +0,0 @@ -package utils - -import ( - "github.com/gin-gonic/gin" - "gorm.io/gorm" -) - -// CheckPermission Todo: 放在缓存 -// CheckPermission 检查权限 -func CheckPermission(c *gin.Context, db *gorm.DB) error { - return nil - //u, err := url.Parse(c.Request.RequestURI) - //if err != nil { - // panic(err) - //} - //slug := strings.Replace(u.Path, "/", "_", -1)[1:] - // - //// 用户名 - //userName, _ := c.Get(types.LoginUserID) - // - //var manager model.AdminUser - //db.Table("chatgpt_admin_users").Select("chatgpt_admin_users.id").Where("username = ?", userName).First(&manager) - // - //// 超级管理员不判断 - //if manager.Id == 1 { - // return nil - //} - //var roleIds []int - //var count int64 - //db.Raw("SELECT `chatgpt_admin_user_roles`.role_id FROM `chatgpt_admin_users` LEFT JOIN `chatgpt_admin_user_roles` ON ( `chatgpt_admin_users`.id = `chatgpt_admin_user_roles`.admin_id ) WHERE `chatgpt_admin_users`.id = ?", manager.Id).Find(&roleIds) - //db.Raw("SELECT `chatgpt_admin_permissions`.slug FROM `chatgpt_admin_permissions` LEFT JOIN `chatgpt_admin_role_permissions` ON (`chatgpt_admin_permissions`.id = `chatgpt_admin_role_permissions`.permission_id) WHERE `chatgpt_admin_role_permissions`.role_id IN ? and `chatgpt_admin_permissions`.slug = ? ", roleIds, slug).Count(&count) - //if count > 0 { - // return nil - //} - //return fmt.Errorf("没有权限") -} diff --git a/api/utils/resp/response.go b/api/utils/resp/response.go index 55c301ed..3d211246 100644 --- a/api/utils/resp/response.go +++ b/api/utils/resp/response.go @@ -1,7 +1,14 @@ package resp +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( - "chatplus/core/types" + "geekai/core/types" "github.com/gin-gonic/gin" "net/http" ) diff --git a/api/utils/strings.go b/api/utils/strings.go index 6a9e7655..ff5c28e6 100644 --- a/api/utils/strings.go +++ b/api/utils/strings.go @@ -1,5 +1,12 @@ package utils +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( "encoding/json" "fmt" diff --git a/api/utils/upload.go b/api/utils/upload.go index 695d9183..5c764d8e 100644 --- a/api/utils/upload.go +++ b/api/utils/upload.go @@ -1,5 +1,12 @@ package utils +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +// * Copyright 2023 The Geek-AI Authors. All rights reserved. +// * Use of this source code is governed by a Apache-2.0 license +// * that can be found in the LICENSE file. +// * @Author yangjian102621@163.com +// * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + import ( "fmt" "io" diff --git a/build/dockerfile-api-go b/build/dockerfile-api-go index ef557dbb..a865f430 100644 --- a/build/dockerfile-api-go +++ b/build/dockerfile-api-go @@ -1,12 +1,12 @@ # GO api docker 镜像创建 -FROM alpine:3.18.2 +FROM registry.cn-hangzhou.aliyuncs.com/geekmaster/alpine:3.18.2 MAINTAINER yangjian WORKDIR /var/www/app -COPY ./api/bin/chatgpt-plus-linux /var/www/app +COPY ./api/bin/geekai-linux /var/www/app EXPOSE 5678 # 容器启动时执行的命令 -CMD ["./chatgpt-plus-linux"] +CMD ["./geekai-linux"] diff --git a/build/dockerfile-vue b/build/dockerfile-vue index 086c7331..6f4f1961 100644 --- a/build/dockerfile-vue +++ b/build/dockerfile-vue @@ -1,5 +1,5 @@ # 前端 Vue 项目构建 -FROM nginx:1.20.2 +FROM registry.cn-hangzhou.aliyuncs.com/geekmaster/nginx:1.20.2 MAINTAINER yangjian diff --git a/web/.env.development b/web/.env.development index 8474f044..5aa2e256 100644 --- a/web/.env.development +++ b/web/.env.development @@ -6,4 +6,4 @@ VUE_APP_ADMIN_USER=admin VUE_APP_ADMIN_PASS=admin123 VUE_APP_KEY_PREFIX=ChatPLUS_DEV_ VUE_APP_TITLE="Geek-AI 创作系统" -VUE_APP_VERSION=v4.0.3 +VUE_APP_VERSION=v4.0.5 diff --git a/web/.env.production b/web/.env.production index e1a98fa3..44521618 100644 --- a/web/.env.production +++ b/web/.env.production @@ -2,4 +2,4 @@ VUE_APP_API_HOST= VUE_APP_WS_HOST= VUE_APP_KEY_PREFIX=ChatPLUS_ VUE_APP_TITLE="Geek-AI 创作系统" -VUE_APP_VERSION=v4.0.3 +VUE_APP_VERSION=v4.0.5 diff --git a/web/package-lock.json b/web/package-lock.json index 2ec0276d..4b3bfc65 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -13,6 +13,7 @@ "clipboard": "^2.0.11", "compressorjs": "^1.2.1", "core-js": "^3.8.3", + "echarts": "^5.5.0", "element-plus": "^2.3.0", "good-storage": "^1.1.1", "highlight.js": "^11.7.0", @@ -21,11 +22,15 @@ "markdown-it": "^13.0.1", "markdown-it-latex2img": "^0.0.6", "markdown-it-mathjax": "^2.0.0", + "markmap-common": "^0.16.0", + "markmap-lib": "^0.16.1", + "markmap-view": "^0.16.0", "md-editor-v3": "^2.2.1", "pinia": "^2.1.4", "qrcode": "^1.5.3", "qs": "^6.11.1", "sortablejs": "^1.15.0", + "three": "^0.128.0", "v3-waterfall": "^1.2.1", "vant": "^4.5.0", "vue": "^3.2.13", @@ -1664,12 +1669,11 @@ } }, "node_modules/@babel/runtime": { - "version": "7.17.9", - "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.17.9.tgz", - "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", - "dev": true, + "version": "7.24.4", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.24.4.tgz", + "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", "dependencies": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" @@ -1812,6 +1816,14 @@ "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.1.1.tgz", "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==" }, + "node_modules/@gera2ld/jsx-dom": { + "version": "2.2.2", + "resolved": "https://registry.npmmirror.com/@gera2ld/jsx-dom/-/jsx-dom-2.2.2.tgz", + "integrity": "sha512-EOqf31IATRE6zS1W1EoWmXZhGfLAoO9FIlwTtHduSrBdud4npYBxYAkv8dZ5hudDPwJeeSjn40kbCL4wAzr8dA==", + "dependencies": { + "@babel/runtime": "^7.21.5" + } + }, "node_modules/@hapi/hoek": { "version": "9.2.1", "resolved": "https://registry.npmmirror.com/@hapi/hoek/-/hoek-9.2.1.tgz", @@ -2119,6 +2131,228 @@ "@types/node": "*" } }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmmirror.com/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmmirror.com/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", + "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.9", + "resolved": "https://registry.npmmirror.com/@types/d3-force/-/d3-force-3.0.9.tgz", + "integrity": "sha512-IKtvyFdb4Q0LWna6ymywQsEYjK/94SGhPrMfEr1TIc5OBeziTi+1jcCvttts8e0UWZIxpasjnQk9MNk/3iS+kA==" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmmirror.com/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@types/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==" + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz", + "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.10", + "resolved": "https://registry.npmmirror.com/@types/d3-selection/-/d3-selection-3.0.10.tgz", + "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.6", + "resolved": "https://registry.npmmirror.com/@types/d3-shape/-/d3-shape-3.1.6.tgz", + "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/@types/d3-time/-/d3-time-3.0.3.tgz", + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.8", + "resolved": "https://registry.npmmirror.com/@types/d3-transition/-/d3-transition-3.0.8.tgz", + "integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmmirror.com/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, "node_modules/@types/eslint": { "version": "7.29.0", "resolved": "https://registry.npmmirror.com/@types/eslint/-/eslint-7.29.0.tgz", @@ -2168,6 +2402,11 @@ "@types/range-parser": "*" } }, + "node_modules/@types/geojson": { + "version": "7946.0.14", + "resolved": "https://registry.npmmirror.com/@types/geojson/-/geojson-7946.0.14.tgz", + "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==" + }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmmirror.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -3420,7 +3659,6 @@ "version": "1.0.10", "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -3489,6 +3727,14 @@ "node": ">= 4.5.0" } }, + "node_modules/autolinker": { + "version": "3.16.2", + "resolved": "https://registry.npmmirror.com/autolinker/-/autolinker-3.16.2.tgz", + "integrity": "sha512-JiYl7j2Z19F9NdTmirENSUUIIL/9MytEWtmzhfmsKPCp9E+G35Y0UNCMoM9tFigxT59qSc8Ml2dlZXOCVTYwuA==", + "dependencies": { + "tslib": "^2.3.0" + } + }, "node_modules/autoprefixer": { "version": "10.4.5", "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.5.tgz", @@ -3740,8 +3986,7 @@ "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "node_modules/brace-expansion": { "version": "1.1.11", @@ -3895,6 +4140,154 @@ "node": ">=6" } }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmmirror.com/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + } + }, + "node_modules/cheerio-select/node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "node_modules/cheerio-select/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "node_modules/cheerio-select/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/cheerio-select/node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + } + }, + "node_modules/cheerio-select/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/cheerio/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "node_modules/cheerio/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/cheerio/node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + } + }, + "node_modules/cheerio/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/cheerio/node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/cheerio/node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmmirror.com/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + } + }, + "node_modules/cheerio/node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz", @@ -4179,7 +4572,6 @@ "version": "8.3.0", "resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz", "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, "engines": { "node": ">= 12" } @@ -4615,7 +5007,6 @@ "version": "6.1.0", "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz", "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, "engines": { "node": ">= 6" } @@ -4730,6 +5121,408 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmmirror.com/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmmirror.com/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmmirror.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-dsv/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-flextree": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/d3-flextree/-/d3-flextree-2.1.2.tgz", + "integrity": "sha512-gJiHrx5uTTHq44bjyIb3xpbmmdZcWLYPKeO9EPVOq8EylMFOiH2+9sWqKAiQ4DcFuOZTAxPOQyv0Rnmji/g15A==", + "dependencies": { + "d3-hierarchy": "^1.1.5" + } + }, + "node_modules/d3-flextree/node_modules/d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmmirror.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/dayjs": { "version": "1.11.9", "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.9.tgz", @@ -4936,6 +5729,14 @@ "node": ">= 0.4" } }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -5040,8 +5841,7 @@ "node_modules/domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" }, "node_modules/domhandler": { "version": "4.3.1", @@ -5106,6 +5906,20 @@ "node": ">=6.0.0" } }, + "node_modules/echarts": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.5.0.tgz", + "integrity": "sha512-rNYnNCzqDAPCr4m/fqyUFv7fD9qIsd50S6GDFgO1DxZhncCsNsG7IfUlAlvZe5oSEQxtsjnHiUuppzccry93Xw==", + "dependencies": { + "tslib": "2.3.0", + "zrender": "5.5.0" + } + }, + "node_modules/echarts/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", @@ -6363,9 +7177,9 @@ } }, "node_modules/highlight.js": { - "version": "11.7.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.7.0.tgz", - "integrity": "sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ==", + "version": "11.9.0", + "resolved": "https://registry.npmmirror.com/highlight.js/-/highlight.js-11.9.0.tgz", + "integrity": "sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==", "engines": { "node": ">=12.0.0" } @@ -6631,6 +7445,14 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } + }, "node_modules/ipaddr.js": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz", @@ -6980,6 +7802,17 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/katex": { + "version": "0.16.10", + "resolved": "https://registry.npmmirror.com/katex/-/katex-0.16.10.tgz", + "integrity": "sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA==", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz", @@ -7445,6 +8278,78 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/markmap-common": { + "version": "0.16.0", + "resolved": "https://registry.npmmirror.com/markmap-common/-/markmap-common-0.16.0.tgz", + "integrity": "sha512-q3nlNDMKuWXTm3VwZFY9V5zteL/+iBLZanUK5vS+e26bUbzTSG5VtAzsyJbmgJm1WhwmIIAxbXEnp6JdvtTduA==", + "dependencies": { + "@babel/runtime": "^7.22.6", + "@gera2ld/jsx-dom": "^2.2.2", + "npm2url": "^0.2.4" + } + }, + "node_modules/markmap-html-parser": { + "version": "0.16.1", + "resolved": "https://registry.npmmirror.com/markmap-html-parser/-/markmap-html-parser-0.16.1.tgz", + "integrity": "sha512-/Mgm4g1qMQ8uEOz8h8K+jPspdgjfw29NqmfTLZSt8yG+vW7fWWduPjGRFc5axAZxCzP7PTzZLEuOxAqOwEg8Bg==", + "dependencies": { + "@babel/runtime": "^7.22.6", + "cheerio": "1.0.0-rc.12" + }, + "peerDependencies": { + "markmap-common": "*" + } + }, + "node_modules/markmap-lib": { + "version": "0.16.1", + "resolved": "https://registry.npmmirror.com/markmap-lib/-/markmap-lib-0.16.1.tgz", + "integrity": "sha512-jD8VsB67m677IRehGSwwVJDlC6PS+xzDKsJOwdvjZ+ndfXrHa1lyqfvR6mIwvGGUIciF86YEITSKL9hQTHE4Rw==", + "dependencies": { + "@babel/runtime": "^7.22.6", + "highlight.js": "^11.8.0", + "js-yaml": "^4.1.0", + "katex": "^0.16.8", + "markmap-html-parser": "0.16.1", + "markmap-view": "0.16.0", + "prismjs": "^1.29.0", + "remarkable": "^2.0.1", + "remarkable-katex": "^1.2.1" + }, + "peerDependencies": { + "markmap-common": "*" + } + }, + "node_modules/markmap-lib/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/markmap-lib/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/markmap-view": { + "version": "0.16.0", + "resolved": "https://registry.npmmirror.com/markmap-view/-/markmap-view-0.16.0.tgz", + "integrity": "sha512-JOiSEThs8B4bAP9E6rcCWOz2SsMwCBFaR76wLARRVb04C/qLiLmvrm675kNPq4lRBAwtugHCYvjG0otpSlB4Cw==", + "dependencies": { + "@babel/runtime": "^7.22.6", + "@gera2ld/jsx-dom": "^2.2.2", + "@types/d3": "^7.4.0", + "d3": "^7.8.5", + "d3-flextree": "^2.1.2" + }, + "peerDependencies": { + "markmap-common": "*" + } + }, "node_modules/md-editor-v3": { "version": "2.11.3", "resolved": "https://registry.npmjs.org/md-editor-v3/-/md-editor-v3-2.11.3.tgz", @@ -7892,11 +8797,15 @@ "node": ">=4" } }, + "node_modules/npm2url": { + "version": "0.2.4", + "resolved": "https://registry.npmmirror.com/npm2url/-/npm2url-0.2.4.tgz", + "integrity": "sha512-arzGp/hQz0Ey+ZGhF64XVH7Xqwd+1Q/po5uGiBbzph8ebX6T0uvt3N7c1nBHQNsQVykQgHhqoRTX7JFcHecGuw==" + }, "node_modules/nth-check": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.0.1.tgz", "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", - "dev": true, "dependencies": { "boolbase": "^1.0.0" } @@ -8957,6 +9866,14 @@ "renderkid": "^3.0.0" } }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -9294,10 +10211,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true + "version": "0.14.1", + "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/regenerator-transform": { "version": "0.15.0", @@ -9370,6 +10286,26 @@ "node": ">= 0.10" } }, + "node_modules/remarkable": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/remarkable/-/remarkable-2.0.1.tgz", + "integrity": "sha512-YJyMcOH5lrR+kZdmB0aJJ4+93bEojRZ1HGDn9Eagu6ibg7aVZhc3OWbbShRid+Q5eAfsEqWxpe+g5W5nYNfNiA==", + "dependencies": { + "argparse": "^1.0.10", + "autolinker": "^3.11.0" + }, + "bin": { + "remarkable": "bin/remarkable.js" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/remarkable-katex": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/remarkable-katex/-/remarkable-katex-1.2.1.tgz", + "integrity": "sha512-Y1VquJBZnaVsfsVcKW2hmjT+pDL7mp8l5WAVlvuvViltrdok2m1AIKmJv8SsH+mBY84PoMw67t3kTWw1dIm8+g==" + }, "node_modules/renderkid": { "version": "3.0.0", "resolved": "https://registry.npmmirror.com/renderkid/-/renderkid-3.0.0.tgz", @@ -9478,6 +10414,11 @@ "rimraf": "bin.js" } }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", @@ -9487,6 +10428,11 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -9496,8 +10442,7 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sax": { "version": "1.2.4", @@ -9935,8 +10880,7 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "node_modules/ssri": { "version": "8.0.1", @@ -10350,6 +11294,11 @@ "node": ">= 10.13.0" } }, + "node_modules/three": { + "version": "0.128.0", + "resolved": "https://registry.npmmirror.com/three/-/three-0.128.0.tgz", + "integrity": "sha512-i0ap/E+OaSfzw7bD1TtYnPo3VEplkl70WX5fZqZnfZsE3k3aSFudqrrC9ldFZfYFkn1zwDmBcdGfiIm/hnbyZA==" + }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz", @@ -10409,8 +11358,7 @@ "node_modules/tslib": { "version": "2.4.0", "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/type-check": { "version": "0.4.0", @@ -11514,6 +12462,19 @@ "resolved": "https://registry.npmmirror.com/yallist/-/yallist-2.1.2.tgz", "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", "dev": true + }, + "node_modules/zrender": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.5.0.tgz", + "integrity": "sha512-O3MilSi/9mwoovx77m6ROZM7sXShR/O/JIanvzTwjN3FORfLSr81PsUGd7jlaYOeds9d8tw82oP44+3YucVo+w==", + "dependencies": { + "tslib": "2.3.0" + } + }, + "node_modules/zrender/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" } }, "dependencies": { @@ -12639,12 +13600,11 @@ } }, "@babel/runtime": { - "version": "7.17.9", - "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.17.9.tgz", - "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", - "dev": true, + "version": "7.24.4", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.24.4.tgz", + "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.14.0" } }, "@babel/template": { @@ -12760,6 +13720,14 @@ "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.1.1.tgz", "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==" }, + "@gera2ld/jsx-dom": { + "version": "2.2.2", + "resolved": "https://registry.npmmirror.com/@gera2ld/jsx-dom/-/jsx-dom-2.2.2.tgz", + "integrity": "sha512-EOqf31IATRE6zS1W1EoWmXZhGfLAoO9FIlwTtHduSrBdud4npYBxYAkv8dZ5hudDPwJeeSjn40kbCL4wAzr8dA==", + "requires": { + "@babel/runtime": "^7.21.5" + } + }, "@hapi/hoek": { "version": "9.2.1", "resolved": "https://registry.npmmirror.com/@hapi/hoek/-/hoek-9.2.1.tgz", @@ -13021,6 +13989,228 @@ "@types/node": "*" } }, + "@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmmirror.com/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "requires": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" + }, + "@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==" + }, + "@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" + }, + "@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "requires": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmmirror.com/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==" + }, + "@types/d3-dispatch": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", + "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==" + }, + "@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==" + }, + "@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" + }, + "@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "requires": { + "@types/d3-dsv": "*" + } + }, + "@types/d3-force": { + "version": "3.0.9", + "resolved": "https://registry.npmmirror.com/@types/d3-force/-/d3-force-3.0.9.tgz", + "integrity": "sha512-IKtvyFdb4Q0LWna6ymywQsEYjK/94SGhPrMfEr1TIc5OBeziTi+1jcCvttts8e0UWZIxpasjnQk9MNk/3iS+kA==" + }, + "@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==" + }, + "@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "requires": { + "@types/geojson": "*" + } + }, + "@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmmirror.com/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==" + }, + "@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "requires": { + "@types/d3-color": "*" + } + }, + "@types/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@types/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==" + }, + "@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==" + }, + "@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==" + }, + "@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==" + }, + "@types/d3-scale": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "requires": { + "@types/d3-time": "*" + } + }, + "@types/d3-scale-chromatic": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz", + "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==" + }, + "@types/d3-selection": { + "version": "3.0.10", + "resolved": "https://registry.npmmirror.com/@types/d3-selection/-/d3-selection-3.0.10.tgz", + "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==" + }, + "@types/d3-shape": { + "version": "3.1.6", + "resolved": "https://registry.npmmirror.com/@types/d3-shape/-/d3-shape-3.1.6.tgz", + "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", + "requires": { + "@types/d3-path": "*" + } + }, + "@types/d3-time": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/@types/d3-time/-/d3-time-3.0.3.tgz", + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" + }, + "@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==" + }, + "@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" + }, + "@types/d3-transition": { + "version": "3.0.8", + "resolved": "https://registry.npmmirror.com/@types/d3-transition/-/d3-transition-3.0.8.tgz", + "integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==", + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmmirror.com/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "requires": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, "@types/eslint": { "version": "7.29.0", "resolved": "https://registry.npmmirror.com/@types/eslint/-/eslint-7.29.0.tgz", @@ -13070,6 +14260,11 @@ "@types/range-parser": "*" } }, + "@types/geojson": { + "version": "7946.0.14", + "resolved": "https://registry.npmmirror.com/@types/geojson/-/geojson-7946.0.14.tgz", + "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==" + }, "@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmmirror.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -14124,7 +15319,6 @@ "version": "1.0.10", "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -14178,6 +15372,14 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, + "autolinker": { + "version": "3.16.2", + "resolved": "https://registry.npmmirror.com/autolinker/-/autolinker-3.16.2.tgz", + "integrity": "sha512-JiYl7j2Z19F9NdTmirENSUUIIL/9MytEWtmzhfmsKPCp9E+G35Y0UNCMoM9tFigxT59qSc8Ml2dlZXOCVTYwuA==", + "requires": { + "tslib": "^2.3.0" + } + }, "autoprefixer": { "version": "10.4.5", "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.5.tgz", @@ -14384,8 +15586,7 @@ "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "brace-expansion": { "version": "1.1.11", @@ -14512,6 +15713,143 @@ "integrity": "sha512-Y4kiDb+AM4Ecy58YkuZrrSRJBDQdQ2L+NyS1vHHFtNtUjgutcZfx3yp1dAONI/oPaPmyGfCLx5CxL+zauIMyKQ==", "dev": true }, + "cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmmirror.com/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "requires": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "dependencies": { + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + } + }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + }, + "htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmmirror.com/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "requires": { + "entities": "^4.4.0" + } + }, + "parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "requires": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + } + } + } + }, + "cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "requires": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "dependencies": { + "css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + } + }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + } + } + }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz", @@ -14741,8 +16079,7 @@ "commander": { "version": "8.3.0", "resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" }, "commondir": { "version": "1.0.1", @@ -15103,8 +16440,7 @@ "css-what": { "version": "6.1.0", "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" }, "cssesc": { "version": "3.0.0", @@ -15181,6 +16517,299 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, + "d3": { + "version": "7.9.0", + "resolved": "https://registry.npmmirror.com/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "requires": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + } + }, + "d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmmirror.com/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "requires": { + "internmap": "1 - 2" + } + }, + "d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==" + }, + "d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + } + }, + "d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "requires": { + "d3-path": "1 - 3" + } + }, + "d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==" + }, + "d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "requires": { + "d3-array": "^3.2.0" + } + }, + "d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmmirror.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "requires": { + "delaunator": "5" + } + }, + "d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==" + }, + "d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + } + }, + "d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "requires": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==" + }, + "d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "requires": { + "d3-dsv": "1 - 3" + } + }, + "d3-flextree": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/d3-flextree/-/d3-flextree-2.1.2.tgz", + "integrity": "sha512-gJiHrx5uTTHq44bjyIb3xpbmmdZcWLYPKeO9EPVOq8EylMFOiH2+9sWqKAiQ4DcFuOZTAxPOQyv0Rnmji/g15A==", + "requires": { + "d3-hierarchy": "^1.1.5" + }, + "dependencies": { + "d3-hierarchy": { + "version": "1.1.9", + "resolved": "https://registry.npmmirror.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", + "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" + } + } + }, + "d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + } + }, + "d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==" + }, + "d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "requires": { + "d3-array": "2.5.0 - 3" + } + }, + "d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==" + }, + "d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "requires": { + "d3-color": "1 - 3" + } + }, + "d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==" + }, + "d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==" + }, + "d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==" + }, + "d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==" + }, + "d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "requires": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + } + }, + "d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "requires": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + } + }, + "d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" + }, + "d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "requires": { + "d3-path": "^3.1.0" + } + }, + "d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "requires": { + "d3-array": "2 - 3" + } + }, + "d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "requires": { + "d3-time": "1 - 3" + } + }, + "d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" + }, + "d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "requires": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + } + }, + "d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "requires": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + } + }, "dayjs": { "version": "1.11.9", "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.9.tgz", @@ -15333,6 +16962,14 @@ "object-keys": "^1.1.1" } }, + "delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "requires": { + "robust-predicates": "^3.0.2" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -15422,8 +17059,7 @@ "domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" }, "domhandler": { "version": "4.3.1", @@ -15479,6 +17115,22 @@ "integrity": "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==", "dev": true }, + "echarts": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.5.0.tgz", + "integrity": "sha512-rNYnNCzqDAPCr4m/fqyUFv7fD9qIsd50S6GDFgO1DxZhncCsNsG7IfUlAlvZe5oSEQxtsjnHiUuppzccry93Xw==", + "requires": { + "tslib": "2.3.0", + "zrender": "5.5.0" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", @@ -16482,9 +18134,9 @@ "dev": true }, "highlight.js": { - "version": "11.7.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.7.0.tgz", - "integrity": "sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ==" + "version": "11.9.0", + "resolved": "https://registry.npmmirror.com/highlight.js/-/highlight.js-11.9.0.tgz", + "integrity": "sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==" }, "hosted-git-info": { "version": "2.8.9", @@ -16697,6 +18349,11 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==" + }, "ipaddr.js": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz", @@ -16965,6 +18622,14 @@ "universalify": "^2.0.0" } }, + "katex": { + "version": "0.16.10", + "resolved": "https://registry.npmmirror.com/katex/-/katex-0.16.10.tgz", + "integrity": "sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA==", + "requires": { + "commander": "^8.3.0" + } + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz", @@ -17344,6 +19009,68 @@ "resolved": "https://registry.npmmirror.com/markdown-it-mathjax/-/markdown-it-mathjax-2.0.0.tgz", "integrity": "sha512-Fafv7TnMENccWYTNjMZzV4BzONPxpK9Mknr1iMEK6m7PI5a5UTCOFctPzx7Nhv81fFzYEY8WHDkSu9n43fTV9g==" }, + "markmap-common": { + "version": "0.16.0", + "resolved": "https://registry.npmmirror.com/markmap-common/-/markmap-common-0.16.0.tgz", + "integrity": "sha512-q3nlNDMKuWXTm3VwZFY9V5zteL/+iBLZanUK5vS+e26bUbzTSG5VtAzsyJbmgJm1WhwmIIAxbXEnp6JdvtTduA==", + "requires": { + "@babel/runtime": "^7.22.6", + "@gera2ld/jsx-dom": "^2.2.2", + "npm2url": "^0.2.4" + } + }, + "markmap-html-parser": { + "version": "0.16.1", + "resolved": "https://registry.npmmirror.com/markmap-html-parser/-/markmap-html-parser-0.16.1.tgz", + "integrity": "sha512-/Mgm4g1qMQ8uEOz8h8K+jPspdgjfw29NqmfTLZSt8yG+vW7fWWduPjGRFc5axAZxCzP7PTzZLEuOxAqOwEg8Bg==", + "requires": { + "@babel/runtime": "^7.22.6", + "cheerio": "1.0.0-rc.12" + } + }, + "markmap-lib": { + "version": "0.16.1", + "resolved": "https://registry.npmmirror.com/markmap-lib/-/markmap-lib-0.16.1.tgz", + "integrity": "sha512-jD8VsB67m677IRehGSwwVJDlC6PS+xzDKsJOwdvjZ+ndfXrHa1lyqfvR6mIwvGGUIciF86YEITSKL9hQTHE4Rw==", + "requires": { + "@babel/runtime": "^7.22.6", + "highlight.js": "^11.8.0", + "js-yaml": "^4.1.0", + "katex": "^0.16.8", + "markmap-html-parser": "0.16.1", + "markmap-view": "0.16.0", + "prismjs": "^1.29.0", + "remarkable": "^2.0.1", + "remarkable-katex": "^1.2.1" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + } + } + }, + "markmap-view": { + "version": "0.16.0", + "resolved": "https://registry.npmmirror.com/markmap-view/-/markmap-view-0.16.0.tgz", + "integrity": "sha512-JOiSEThs8B4bAP9E6rcCWOz2SsMwCBFaR76wLARRVb04C/qLiLmvrm675kNPq4lRBAwtugHCYvjG0otpSlB4Cw==", + "requires": { + "@babel/runtime": "^7.22.6", + "@gera2ld/jsx-dom": "^2.2.2", + "@types/d3": "^7.4.0", + "d3": "^7.8.5", + "d3-flextree": "^2.1.2" + } + }, "md-editor-v3": { "version": "2.11.3", "resolved": "https://registry.npmjs.org/md-editor-v3/-/md-editor-v3-2.11.3.tgz", @@ -17697,11 +19424,15 @@ "path-key": "^2.0.0" } }, + "npm2url": { + "version": "0.2.4", + "resolved": "https://registry.npmmirror.com/npm2url/-/npm2url-0.2.4.tgz", + "integrity": "sha512-arzGp/hQz0Ey+ZGhF64XVH7Xqwd+1Q/po5uGiBbzph8ebX6T0uvt3N7c1nBHQNsQVykQgHhqoRTX7JFcHecGuw==" + }, "nth-check": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.0.1.tgz", "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", - "dev": true, "requires": { "boolbase": "^1.0.0" } @@ -18436,6 +20167,11 @@ "renderkid": "^3.0.0" } }, + "prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==" + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -18706,10 +20442,9 @@ } }, "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true + "version": "0.14.1", + "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "regenerator-transform": { "version": "0.15.0", @@ -18769,6 +20504,20 @@ "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", "dev": true }, + "remarkable": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/remarkable/-/remarkable-2.0.1.tgz", + "integrity": "sha512-YJyMcOH5lrR+kZdmB0aJJ4+93bEojRZ1HGDn9Eagu6ibg7aVZhc3OWbbShRid+Q5eAfsEqWxpe+g5W5nYNfNiA==", + "requires": { + "argparse": "^1.0.10", + "autolinker": "^3.11.0" + } + }, + "remarkable-katex": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/remarkable-katex/-/remarkable-katex-1.2.1.tgz", + "integrity": "sha512-Y1VquJBZnaVsfsVcKW2hmjT+pDL7mp8l5WAVlvuvViltrdok2m1AIKmJv8SsH+mBY84PoMw67t3kTWw1dIm8+g==" + }, "renderkid": { "version": "3.0.0", "resolved": "https://registry.npmmirror.com/renderkid/-/renderkid-3.0.0.tgz", @@ -18852,6 +20601,11 @@ "glob": "^7.1.3" } }, + "robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" + }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", @@ -18861,6 +20615,11 @@ "queue-microtask": "^1.2.2" } }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -18870,8 +20629,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sax": { "version": "1.2.4", @@ -19261,8 +21019,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "ssri": { "version": "8.0.1", @@ -19582,6 +21339,11 @@ } } }, + "three": { + "version": "0.128.0", + "resolved": "https://registry.npmmirror.com/three/-/three-0.128.0.tgz", + "integrity": "sha512-i0ap/E+OaSfzw7bD1TtYnPo3VEplkl70WX5fZqZnfZsE3k3aSFudqrrC9ldFZfYFkn1zwDmBcdGfiIm/hnbyZA==" + }, "thunky": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz", @@ -19629,8 +21391,7 @@ "tslib": { "version": "2.4.0", "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "type-check": { "version": "0.4.0", @@ -20503,6 +22264,21 @@ "dev": true } } + }, + "zrender": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.5.0.tgz", + "integrity": "sha512-O3MilSi/9mwoovx77m6ROZM7sXShR/O/JIanvzTwjN3FORfLSr81PsUGd7jlaYOeds9d8tw82oP44+3YucVo+w==", + "requires": { + "tslib": "2.3.0" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } } } } diff --git a/web/package.json b/web/package.json index 35ff6492..913c8d4a 100644 --- a/web/package.json +++ b/web/package.json @@ -26,6 +26,7 @@ "markmap-lib": "^0.16.1", "markmap-view": "^0.16.0", "md-editor-v3": "^2.2.1", + "mitt": "^3.0.1", "pinia": "^2.1.4", "qrcode": "^1.5.3", "qs": "^6.11.1", diff --git a/web/src/App.vue b/web/src/App.vue index f743f393..c57704ea 100644 --- a/web/src/App.vue +++ b/web/src/App.vue @@ -32,7 +32,6 @@ window.ResizeObserver = class ResizeObserver extends _ResizeObserver { diff --git a/web/src/assets/css/color-dark.styl b/web/src/assets/css/color-dark.styl index 4b6854c1..ab18ff52 100644 --- a/web/src/assets/css/color-dark.styl +++ b/web/src/assets/css/color-dark.styl @@ -1,30 +1,95 @@ -.admin-home { - .header { - - } +.dark { + color-scheme: dark; + --el-color-primary: #409eff; + --el-color-primary-light-3: #3375b9; + --el-color-primary-light-5: #2a598a; + --el-color-primary-light-7: #213d5b; + --el-color-primary-light-8: #1d3043; + --el-color-primary-light-9: #18222c; + --el-color-primary-dark-2: #66b1ff; + --el-color-success: #67c23a; + --el-color-success-light-3: #4e8e2f; + --el-color-success-light-5: #3e6b27; + --el-color-success-light-7: #2d481f; + --el-color-success-light-8: #25371c; + --el-color-success-light-9: #1c2518; + --el-color-success-dark-2: #85ce61; + --el-color-warning: #e6a23c; + --el-color-warning-light-3: #a77730; + --el-color-warning-light-5: #7d5b28; + --el-color-warning-light-7: #533f20; + --el-color-warning-light-8: #3e301c; + --el-color-warning-light-9: #292218; + --el-color-warning-dark-2: #ebb563; + --el-color-danger: #f56c6c; + --el-color-danger-light-3: #b25252; + --el-color-danger-light-5: #854040; + --el-color-danger-light-7: #582e2e; + --el-color-danger-light-8: #412626; + --el-color-danger-light-9: #2b1d1d; + --el-color-danger-dark-2: #f78989; + --el-color-error: #f56c6c; + --el-color-error-light-3: #b25252; + --el-color-error-light-5: #854040; + --el-color-error-light-7: #582e2e; + --el-color-error-light-8: #412626; + --el-color-error-light-9: #2b1d1d; + --el-color-error-dark-2: #f78989; + --el-color-info: #909399; + --el-color-info-light-3: #6b6d71; + --el-color-info-light-5: #525457; + --el-color-info-light-7: #393a3c; + --el-color-info-light-8: #2d2d2f; + --el-color-info-light-9: #202121; + --el-color-info-dark-2: #a6a9ad; + --el-box-shadow: 0px 12px 32px 4px rgba(0, 0, 0, 0.36), 0px 8px 20px rgba(0, 0, 0, 0.72); + --el-box-shadow-light: 0px 0px 12px rgba(0, 0, 0, 0.72); + --el-box-shadow-lighter: 0px 0px 6px rgba(0, 0, 0, 0.72); + --el-box-shadow-dark: 0px 16px 48px 16px rgba(0, 0, 0, 0.72), 0px 12px 32px #000000, 0px 8px 16px -8px #000000; + --el-bg-color-page: #0a0a0a; + --el-bg-color: #141414; + --el-bg-color-overlay: #1d1e1f; + --el-text-color-primary: #E5EAF3; + --el-text-color-regular: #CFD3DC; + --el-text-color-secondary: #A3A6AD; + --el-text-color-placeholder: #8D9095; + --el-text-color-disabled: #6C6E72; + --el-border-color-darker: #636466; + --el-border-color-dark: #58585B; + --el-border-color: #4C4D4F; + --el-border-color-light: #414243; + --el-border-color-lighter: #363637; + --el-border-color-extra-light: #2B2B2C; + --el-fill-color-darker: #424243; + --el-fill-color-dark: #39393A; + --el-fill-color: #303030; + --el-fill-color-light: #262727; + --el-fill-color-lighter: #1D1D1D; + --el-fill-color-extra-light: #191919; + --el-fill-color-blank: transparent; + --el-mask-color: rgba(0, 0, 0, 0.8); + --el-mask-color-extra-light: rgba(0, 0, 0, 0.3) + --el-menu-bg-color-dark: #39393A + --el-menu-bg-color-darker: #424243 +} - .login-wrap { - background: #324157; - } +.dark .el-button { + --el-button-disabled-text-color: rgba(255, 255, 255, 0.5) +} - .plugins-tips { - background: #eef1f6; - } +.dark .el-card { + --el-card-bg-color: var(--el-bg-color-overlay) +} - .plugins-tips a { - color: #20a0ff; - } - - .tags-li.active { - border: 1px solid #409EFF; - background-color: #409EFF; - } - - .message-title { - color: #20a0ff; - } - - .collapse-btn:hover { - background: rgb(40, 52, 70); - } +.dark .el-empty { + --el-empty-fill-color-0: var(--el-color-black); + --el-empty-fill-color-1: #4b4b52; + --el-empty-fill-color-2: #36383d; + --el-empty-fill-color-3: #1e1e20; + --el-empty-fill-color-4: #262629; + --el-empty-fill-color-5: #202124; + --el-empty-fill-color-6: #212224; + --el-empty-fill-color-7: #1b1c1f; + --el-empty-fill-color-8: #1c1d1f; + --el-empty-fill-color-9: #18181a } \ No newline at end of file diff --git a/web/src/assets/css/main.styl b/web/src/assets/css/main.styl index d8cb8c08..b275eb11 100644 --- a/web/src/assets/css/main.styl +++ b/web/src/assets/css/main.styl @@ -37,22 +37,28 @@ body { transition: left .3s ease-in-out; background: #f0f0f0; + ::-webkit-scrollbar { + width: 8px; /* 滚动条宽度 */ + } + + ::-webkit-scrollbar-thumb { + background-color: #666666; + border-radius 8px + } + + ::-webkit-scrollbar-thumb:hover { + background-color: #999999; + } + .content { width: auto; - height: 100vh; overflow-y: scroll; box-sizing: border-box; .container { padding: 15px 20px 30px 20px; - background: #fff; - border: 1px solid #ddd; - border-radius: 5px; + background: #ffffff; margin-bottom 80px - - .handle-box { - margin-bottom: 20px; - } } .crumbs { @@ -60,7 +66,7 @@ body { } .el-table th { - background-color: #f5f7fa !important; + background-color: #f5f7fa; } .pagination { @@ -142,6 +148,23 @@ body { display: none !important; } } + + .dark { + background: var(--el-bg-color); + + .container { + background: var(--el-bg-color); + } + + .crumbs { + margin: 10px 0; + } + + .el-table th { + background-color: var(--el-fill-color-darker); + } + + } } .content-collapse { diff --git a/web/src/assets/css/mobile/chat-list.styl b/web/src/assets/css/mobile/chat-list.styl index 5976c1f7..c1cbd386 100644 --- a/web/src/assets/css/mobile/chat-list.styl +++ b/web/src/assets/css/mobile/chat-list.styl @@ -1,5 +1,8 @@ .mobile-chat-list { .content { + padding-top 46px + padding-bottom 60px + .van-list { .van-cell__value { .chat-list-item { @@ -31,19 +34,4 @@ } } -.van-popup { - .picker-option { - display flex - width 100% - padding 0 10px - overflow hidden - height 20px - text-overflow ellipsis - - .van-image { - width 20px; - height 20px; - margin-right 5px - } - } -} \ No newline at end of file +@import "model-select.styl" \ No newline at end of file diff --git a/web/src/assets/css/mobile/chat-session.styl b/web/src/assets/css/mobile/chat-session.styl index a8cb91da..65a73fd3 100644 --- a/web/src/assets/css/mobile/chat-session.styl +++ b/web/src/assets/css/mobile/chat-session.styl @@ -1,16 +1,29 @@ .mobile-chat { - .message-list-box { - //padding-top 50px - padding-bottom 10px - overflow-x auto - background #F5F5F5; + .van-nav-bar { + position static - .van-cell { - background none - font-family: 'Microsoft YaHei', '微软雅黑', Arial, sans-serif; + .setting { + font-size 18px } } + .chat-list-wrapper { + padding 10px 0 10px 0 + background var(--van-background); + overflow hidden + + + .message-list-box { + overflow auto + + .van-cell { + background none + font-family: 'Microsoft YaHei', '微软雅黑', Arial, sans-serif; + } + } + + } + .chat-box-wrapper { .van-sticky { .van-cell-group--inset { @@ -68,8 +81,10 @@ .van-theme-dark { .mobile-chat { - .message-list-box { + .chat-list-wrapper { background #232425; } } -} \ No newline at end of file +} + +@import "model-select.styl" \ No newline at end of file diff --git a/web/src/assets/css/mobile/image-mj.styl b/web/src/assets/css/mobile/image-mj.styl index 76022f0f..8989946b 100644 --- a/web/src/assets/css/mobile/image-mj.styl +++ b/web/src/assets/css/mobile/image-mj.styl @@ -8,7 +8,7 @@ .rate { display: flex; justify-content center - background-color #f5f5f5 + background-color var(--van-background-3) padding 5px 10px margin 5px 0 border-radius 5px @@ -24,14 +24,14 @@ .text { text-align center - color #555555 + color var(--van-text-color) } } .model { display: flex; justify-content center - background-color #f5f5f5 + background-color var(--van-background-3) padding 6px margin 5px 0 border-radius 5px @@ -48,12 +48,12 @@ .text { text-align center - color #555555 + color var(--van-text-color) } } .active { - background-color #e5e5e5 + background-color var(--van-text-color-3) } } } @@ -74,6 +74,11 @@ } + color var(--van-text-color) + .pt-6 { + padding 15px 10px + } + .tip-text { padding 10px line-height 1.5 diff --git a/web/src/assets/css/mobile/image-sd.styl b/web/src/assets/css/mobile/image-sd.styl index d5c1a1b8..d6f07cc3 100644 --- a/web/src/assets/css/mobile/image-sd.styl +++ b/web/src/assets/css/mobile/image-sd.styl @@ -80,8 +80,10 @@ } + color var(--van-text-color) + .pt-6 { - padding 10px + padding 15px 10px } .tip-text { diff --git a/web/src/assets/css/mobile/model-select.styl b/web/src/assets/css/mobile/model-select.styl new file mode 100644 index 00000000..8b3de473 --- /dev/null +++ b/web/src/assets/css/mobile/model-select.styl @@ -0,0 +1,16 @@ +.van-popup { + .picker-option { + display flex + width 100% + padding 0 10px + overflow hidden + height 20px + text-overflow ellipsis + + .van-image { + width 20px; + height 20px; + margin-right 5px + } + } +} \ No newline at end of file diff --git a/web/src/assets/img/ai-bg-02.png b/web/src/assets/img/ai-bg-02.png new file mode 100644 index 00000000..ad0d7edb Binary files /dev/null and b/web/src/assets/img/ai-bg-02.png differ diff --git a/web/src/assets/img/ai-bg.jpg b/web/src/assets/img/ai-bg.jpg new file mode 100644 index 00000000..9e118905 Binary files /dev/null and b/web/src/assets/img/ai-bg.jpg differ diff --git a/web/src/components/ChatPrompt.vue b/web/src/components/ChatPrompt.vue index a6e9d42a..9c8b545b 100644 --- a/web/src/components/ChatPrompt.vue +++ b/web/src/components/ChatPrompt.vue @@ -57,6 +57,7 @@ export default defineComponent({ if (!this.finalTokens) { httpPost("/api/chat/tokens", {text: this.content, model: this.model}).then(res => { this.finalTokens = res.data; + }).catch(() => { }) } } diff --git a/web/src/components/ConfigDialog.vue b/web/src/components/ConfigDialog.vue index c4c8be37..501bc7b5 100644 --- a/web/src/components/ConfigDialog.vue +++ b/web/src/components/ConfigDialog.vue @@ -25,10 +25,8 @@ diff --git a/web/src/components/admin/AdminTags.vue b/web/src/components/admin/AdminTags.vue index 3a8eb7f1..2fb757e4 100644 --- a/web/src/components/admin/AdminTags.vue +++ b/web/src/components/admin/AdminTags.vue @@ -1,5 +1,5 @@