From 48f3bd997c9711717cd201d8bf6a1fa44fc16e07 Mon Sep 17 00:00:00 2001 From: lzq <357099073@qq.com> Date: Sat, 10 Oct 2026 14:24:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=B0=8F=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E6=8A=A5=E9=94=80=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../users/components/changePassword.vue | 2 +- go/controllers/app_oa_expense.go | 344 +++ go/controllers/app_oa_schedule.go | 327 ++ go/controllers/backend_oa_schedule.go | 187 +- go/controllers/backend_reimburse.go | 357 ++- go/routers/api/api.go | 25 + go/services/identity_register.go | 2 +- uniapp/api/expense.js | 277 ++ uniapp/api/oaSchedule.js | 178 ++ uniapp/components/sub/SubHome.vue | 134 +- uniapp/components/sub/SubOaDashboard.vue | 598 ++-- uniapp/package-lock.json | 2674 +++++++++++------ uniapp/pages.json | 21 + uniapp/pages/tools/expense/detail.vue | 532 ++++ uniapp/pages/tools/expense/edit.vue | 746 +++++ uniapp/pages/tools/expense/index.vue | 313 ++ uniapp/pages/tools/schedule/detail.vue | 320 +- uniapp/pages/tools/schedule/edit.vue | 259 +- uniapp/pages/tools/schedule/index.vue | 177 +- uniapp/utils/nav.js | 2 + uniapp/utils/subsystem.js | 13 +- 21 files changed, 5738 insertions(+), 1750 deletions(-) create mode 100644 go/controllers/app_oa_expense.go create mode 100644 go/controllers/app_oa_schedule.go create mode 100644 uniapp/api/expense.js create mode 100644 uniapp/api/oaSchedule.js create mode 100644 uniapp/pages/tools/expense/detail.vue create mode 100644 uniapp/pages/tools/expense/edit.vue create mode 100644 uniapp/pages/tools/expense/index.vue diff --git a/backend/src/views/basicSettings/users/components/changePassword.vue b/backend/src/views/basicSettings/users/components/changePassword.vue index 563edb2..a4ee042 100644 --- a/backend/src/views/basicSettings/users/components/changePassword.vue +++ b/backend/src/views/basicSettings/users/components/changePassword.vue @@ -161,7 +161,7 @@ const handleSubmit = async () => { } // 调用接口修改密码 - // 第三个参数 true:userId 是用户管理列表行主键,后端按主键精确匹配 + // 第三个参数 true:userId 是用户管理列表行主键,后端按主键精确匹配 const res = await changePassword(form.value.id, passwordForm.value, true); if (res.code === 200 || res.msg === '修改成功') { diff --git a/go/controllers/app_oa_expense.go b/go/controllers/app_oa_expense.go new file mode 100644 index 0000000..0473d10 --- /dev/null +++ b/go/controllers/app_oa_expense.go @@ -0,0 +1,344 @@ +package controllers + +import ( + "encoding/json" + "io" + "strconv" + "strings" + + "server/services" +) + +// 移动端 OA 报销管理接口,挂在 AppOaController 上。 +// +// 与 Web 管理端 /backend/reimbursements* 共用同一套数据 +// (yz_backend_reimbursements / _items / _expense_types,按 JWT 中 tid + user_id +// 双重隔离,仅本人单据可见可操作)与核心逻辑(reimburse*Core 共享函数)。 +// 小程序「报销管理」页面走这里,不直接调用 /backend/* 接口。 + +// expenseReadPayload 读取并校验新建/编辑报销单请求体;失败时直接输出错误响应。 +func (c *AppOaController) expenseReadPayload() (reimbursementPayload, bool) { + var payload reimbursementPayload + raw, err := io.ReadAll(c.Ctx.Request.Body) + if err != nil || json.Unmarshal(raw, &payload) != nil { + c.oaErr(400, 400, "参数错误") + return payload, false + } + return payload, true +} + +// expenseReadItemPayload 读取并校验费用明细请求体;失败时直接输出错误响应。 +func (c *AppOaController) expenseReadItemPayload() (reimbursementItemPayload, bool) { + var payload reimbursementItemPayload + raw, err := io.ReadAll(c.Ctx.Request.Body) + if err != nil || json.Unmarshal(raw, &payload) != nil { + c.oaErr(400, 400, "参数错误") + return payload, false + } + return payload, true +} + +// ExpenseList GET /api/oa/expense/list +// 移动端报销单列表:参数与返回结构与 /backend/reimbursements 一致 +// (page/pageSize/keyword/status,返回 list/total)。 +func (c *AppOaController) ExpenseList() { + claims, err := c.oaClaims() + if err != nil { + c.oaErr(401, 401, "未登录或无权限") + return + } + + page, _ := c.GetInt("page", 1) + pageSize, _ := c.GetInt("pageSize", 10) + status, statusErr := c.GetInt("status") + + data, code, msg := reimburseListData(claims, page, pageSize, + strings.TrimSpace(c.GetString("keyword")), statusErr == nil, status) + if msg != "" { + c.oaErr(code, code, msg) + return + } + c.oaOk(data) +} + +// ExpenseDetail GET /api/oa/expense/detail/:id +// 报销单详情(主单 + 费用明细 + 发票文件)。 +func (c *AppOaController) ExpenseDetail() { + claims, err := c.oaClaims() + if err != nil { + c.oaErr(401, 401, "未登录或无权限") + return + } + + id := c.oaScheduleIDParam() + if id == 0 { + c.oaErr(400, 400, "无效ID") + return + } + scheme, host := services.PublicRequestBaseURL(&c.Controller) + data, code, msg := reimburseDetailData(claims, id, scheme, host) + if msg != "" { + c.oaErr(code, code, msg) + return + } + c.oaOk(data) +} + +// ExpenseCreate POST /api/oa/expense/create 新建报销单(草稿)。 +func (c *AppOaController) ExpenseCreate() { + claims, err := c.oaClaims() + if err != nil { + c.oaErr(401, 401, "未登录或无权限") + return + } + + payload, ok := c.expenseReadPayload() + if !ok { + return + } + + id, code, msg := reimburseCreateCore(claims, payload) + if msg != "" { + c.oaErr(code, code, msg) + return + } + c.oaOk(map[string]interface{}{"id": id}) +} + +// ExpenseUpdate POST /api/oa/expense/update/:id 编辑报销单(仅草稿)。 +func (c *AppOaController) ExpenseUpdate() { + claims, err := c.oaClaims() + if err != nil { + c.oaErr(401, 401, "未登录或无权限") + return + } + + id := c.oaScheduleIDParam() + if id == 0 { + c.oaErr(400, 400, "无效ID") + return + } + + payload, ok := c.expenseReadPayload() + if !ok { + return + } + + code, msg := reimburseUpdateCore(claims, id, payload) + if msg != "" { + c.oaErr(code, code, msg) + return + } + c.oaOk(map[string]interface{}{"id": id}) +} + +// ExpenseDelete DELETE /api/oa/expense/delete/:id 删除报销单(仅草稿)。 +func (c *AppOaController) ExpenseDelete() { + claims, err := c.oaClaims() + if err != nil { + c.oaErr(401, 401, "未登录或无权限") + return + } + + id := c.oaScheduleIDParam() + if id == 0 { + c.oaErr(400, 400, "无效ID") + return + } + + code, msg := reimburseDeleteCore(claims, id) + if msg != "" { + c.oaErr(code, code, msg) + return + } + c.oaOk(nil) +} + +// ExpenseAddItem POST /api/oa/expense/item/add/:id 新增费用明细(仅草稿)。 +func (c *AppOaController) ExpenseAddItem() { + claims, err := c.oaClaims() + if err != nil { + c.oaErr(401, 401, "未登录或无权限") + return + } + + id := c.oaScheduleIDParam() + if id == 0 { + c.oaErr(400, 400, "无效报销单ID") + return + } + + payload, ok := c.expenseReadItemPayload() + if !ok { + return + } + + scheme, host := services.PublicRequestBaseURL(&c.Controller) + item, code, msg := reimburseAddItemCore(claims, id, payload, scheme, host) + if msg != "" { + c.oaErr(code, code, msg) + return + } + c.oaOk(item) +} + +// ExpenseUpdateItem POST /api/oa/expense/item/update/:id/:item_id 更新费用明细(仅草稿)。 +func (c *AppOaController) ExpenseUpdateItem() { + claims, err := c.oaClaims() + if err != nil { + c.oaErr(401, 401, "未登录或无权限") + return + } + + id := c.oaScheduleIDParam() + itemID := c.expenseItemIDParam() + if id == 0 || itemID == 0 { + c.oaErr(400, 400, "无效ID") + return + } + + payload, ok := c.expenseReadItemPayload() + if !ok { + return + } + + scheme, host := services.PublicRequestBaseURL(&c.Controller) + item, code, msg := reimburseUpdateItemCore(claims, id, itemID, payload, scheme, host) + if msg != "" { + c.oaErr(code, code, msg) + return + } + c.oaOk(item) +} + +// ExpenseDeleteItem DELETE /api/oa/expense/item/delete/:id/:item_id 删除费用明细(仅草稿)。 +func (c *AppOaController) ExpenseDeleteItem() { + claims, err := c.oaClaims() + if err != nil { + c.oaErr(401, 401, "未登录或无权限") + return + } + + id := c.oaScheduleIDParam() + itemID := c.expenseItemIDParam() + if id == 0 || itemID == 0 { + c.oaErr(400, 400, "无效ID") + return + } + + code, msg := reimburseDeleteItemCore(claims, id, itemID) + if msg != "" { + c.oaErr(code, code, msg) + return + } + c.oaOk(nil) +} + +// ExpenseSubmit POST /api/oa/expense/submit/:id 提交审批(仅草稿,需已配置审批流)。 +func (c *AppOaController) ExpenseSubmit() { + claims, err := c.oaClaims() + if err != nil { + c.oaErr(401, 401, "未登录或无权限") + return + } + + id := c.oaScheduleIDParam() + if id == 0 { + c.oaErr(400, 400, "无效ID") + return + } + + code, msg := reimburseSubmitCore(claims, id) + if msg != "" { + c.oaErr(code, code, msg) + return + } + c.oaOk(nil) +} + +// ExpenseStatus POST /api/oa/expense/status/:id 手动确认更改单据状态(body: {status})。 +func (c *AppOaController) ExpenseStatus() { + claims, err := c.oaClaims() + if err != nil { + c.oaErr(401, 401, "未登录或无权限") + return + } + + id := c.oaScheduleIDParam() + if id == 0 { + c.oaErr(400, 400, "无效ID") + return + } + + var payload reimbursementStatusPayload + raw, err := io.ReadAll(c.Ctx.Request.Body) + if len(raw) > 0 && (err != nil || json.Unmarshal(raw, &payload) != nil) { + c.oaErr(400, 400, "参数错误") + return + } + + newStatus, code, msg := reimburseUpdateStatusCore(claims, id, payload.Status) + if msg != "" { + c.oaErr(code, code, msg) + return + } + c.oaOk(map[string]interface{}{"status": newStatus}) +} + +// ExpenseRecords GET /api/oa/expense/records/:id 审批记录时间线。 +func (c *AppOaController) ExpenseRecords() { + claims, err := c.oaClaims() + if err != nil { + c.oaErr(401, 401, "未登录或无权限") + return + } + + id := c.oaScheduleIDParam() + if id == 0 { + c.oaErr(400, 400, "无效ID") + return + } + + rows, code, msg := reimburseRecordsData(claims, id) + if msg != "" { + c.oaErr(code, code, msg) + return + } + c.oaOk(rows) +} + +// ExpenseTypes GET /api/oa/expense/types 费用类型下拉(全局通用 + 本租户专有,仅启用)。 +func (c *AppOaController) ExpenseTypes() { + claims, err := c.oaClaims() + if err != nil { + c.oaErr(401, 401, "未登录或无权限") + return + } + + rows, err := queryReimburseExpenseTypes(claims.TenantId, true) + if err != nil { + c.oaErr(500, 500, "查询费用类型失败") + return + } + list := make([]map[string]interface{}, 0, len(rows)) + for _, row := range rows { + list = append(list, expenseTypeDTO(row, claims.TenantId)) + } + c.oaOk(list) +} + +// ExpenseUploadImage POST /api/oa/expense/upload(multipart,字段名 file) +// 上传报销发票图片,共享 uploadTenantImage,返回 {id,url,name}; +// 随后由费用明细接口把文件 ID 写进 receipt_file_ids。 +func (c *AppOaController) ExpenseUploadImage() { + c.uploadTenantImage() +} + +// expenseItemIDParam 解析 :item_id 路由参数,非法返回 0。 +func (c *AppOaController) expenseItemIDParam() uint64 { + id, err := strconv.ParseUint(c.Ctx.Input.Param(":item_id"), 10, 64) + if err != nil { + return 0 + } + return id +} diff --git a/go/controllers/app_oa_schedule.go b/go/controllers/app_oa_schedule.go new file mode 100644 index 0000000..ac3d854 --- /dev/null +++ b/go/controllers/app_oa_schedule.go @@ -0,0 +1,327 @@ +package controllers + +import ( + "encoding/json" + "io" + "path/filepath" + "strconv" + "strings" + + "server/models" + "server/services" +) + +// 移动端 OA 工作日程(日历待办)接口,挂在 AppOaController 上。 +// +// 与 Web 管理端 /backend/oa/schedule/* 共用同一套数据(yz_backend_oa_schedule, +// 按 JWT 中 tid + user_id 双重隔离)与核心逻辑(oaSchedule*Core / oaScheduleListData), +// 仅鉴权放宽为 app 令牌(oaClaims)。小程序「工作日程」页面走这里, +// 不再复用「日程提醒」(/api/schedule/*,yz_backend_schedule)的接口。 + +// oaScheduleIDParam 解析 :id 路由参数,非法返回 0。 +func (c *AppOaController) oaScheduleIDParam() uint64 { + id, err := strconv.ParseUint(c.Ctx.Input.Param(":id"), 10, 64) + if err != nil { + return 0 + } + return id +} + +// oaScheduleReadPayload 读取并校验新建/编辑请求体;失败时直接输出错误响应。 +func (c *AppOaController) oaScheduleReadPayload() (oaSchedulePayload, bool) { + raw, err := io.ReadAll(c.Ctx.Request.Body) + if err != nil { + c.oaErr(400, 400, "参数错误") + return oaSchedulePayload{}, false + } + payload, msg := parseOaSchedulePayloadBody(raw) + if msg != "" { + c.oaErr(400, 400, msg) + return payload, false + } + return payload, true +} + +// ScheduleList GET /api/oa/schedule/list +// 移动端工作日程列表:参数与返回结构与 /backend/oa/schedule/list 一致 +// (page/pageSize/keyword/status/priority/start_date/end_date/category, +// 返回 list/total/counts)。 +func (c *AppOaController) ScheduleList() { + claims, err := c.oaClaims() + if err != nil { + c.oaErr(401, 401, "未登录或无权限") + return + } + + page, _ := c.GetInt("page", 1) + pageSize, _ := c.GetInt("pageSize", 20) + + data, code, msg := oaScheduleListData(claims.TenantId, claims.UserID, + page, pageSize, + strings.TrimSpace(c.GetString("keyword")), + strings.TrimSpace(c.GetString("status")), + strings.TrimSpace(c.GetString("priority")), + strings.TrimSpace(c.GetString("start_date")), + strings.TrimSpace(c.GetString("end_date")), + strings.TrimSpace(c.GetString("category"))) + if msg != "" { + c.oaErr(code, code, msg) + return + } + c.oaOk(data) +} + +// ScheduleDetail GET /api/oa/schedule/detail/:id +// 日程详情(移动端详情页使用;Web 端直接由列表渲染,无此接口)。 +func (c *AppOaController) ScheduleDetail() { + claims, err := c.oaClaims() + if err != nil { + c.oaErr(401, 401, "未登录或无权限") + return + } + + id := c.oaScheduleIDParam() + if id == 0 { + c.oaErr(400, 400, "无效ID") + return + } + + var item models.OaSchedule + err = models.Orm.QueryTable(new(models.OaSchedule)). + Filter("id", id). + Filter("is_deleted", 0). + Filter("tid", claims.TenantId). + Filter("user_id", claims.UserID). + One(&item) + if err != nil { + c.oaErr(404, 404, "日程不存在") + return + } + + item.ScheduleDate = normalizeOaDate(item.ScheduleDate) + c.oaOk(map[string]interface{}{ + "item": item, + "images": parseOaScheduleImages(item.Images), + }) +} + +// ScheduleCreate POST /api/oa/schedule/create 新建日程(可选绑定提醒)。 +func (c *AppOaController) ScheduleCreate() { + claims, err := c.oaClaims() + if err != nil { + c.oaErr(401, 401, "未登录或无权限") + return + } + + payload, ok := c.oaScheduleReadPayload() + if !ok { + return + } + + item, code, msg := oaScheduleCreateCore(claims, payload) + if msg != "" { + c.oaErr(code, code, msg) + return + } + c.oaOk(item) +} + +// ScheduleUpdate POST /api/oa/schedule/update/:id 编辑日程(含提醒重绑)。 +func (c *AppOaController) ScheduleUpdate() { + claims, err := c.oaClaims() + if err != nil { + c.oaErr(401, 401, "未登录或无权限") + return + } + + id := c.oaScheduleIDParam() + if id == 0 { + c.oaErr(400, 400, "无效ID") + return + } + + payload, ok := c.oaScheduleReadPayload() + if !ok { + return + } + + item, code, msg := oaScheduleUpdateCore(claims, id, payload) + if msg != "" { + c.oaErr(code, code, msg) + return + } + c.oaOk(item) +} + +// ScheduleDelete DELETE /api/oa/schedule/delete/:id 软删除日程。 +func (c *AppOaController) ScheduleDelete() { + claims, err := c.oaClaims() + if err != nil { + c.oaErr(401, 401, "未登录或无权限") + return + } + + id := c.oaScheduleIDParam() + if id == 0 { + c.oaErr(400, 400, "无效ID") + return + } + + code, msg := oaScheduleDeleteCore(claims, id) + if msg != "" { + c.oaErr(code, code, msg) + return + } + c.oaOk(nil) +} + +// ScheduleFinish POST /api/oa/schedule/finish/:id 切换完成状态。 +// 方法名不能叫 Finish——那是 beego Controller 的生命周期钩子。 +func (c *AppOaController) ScheduleFinish() { + claims, err := c.oaClaims() + if err != nil { + c.oaErr(401, 401, "未登录或无权限") + return + } + + id := c.oaScheduleIDParam() + if id == 0 { + c.oaErr(400, 400, "无效ID") + return + } + + newStatus, code, msg := oaScheduleToggleCore(claims, id) + if msg != "" { + c.oaErr(code, code, msg) + return + } + c.oaOk(map[string]interface{}{"status": newStatus}) +} + +// oaUploadMaxBytes OA 模块附件上传单个文件大小上限(10MB)。 +const oaUploadMaxBytes = 10 << 20 + +// uploadTenantImage 移动端 OA 附件上传共享实现(日程资料 / 报销发票等复用): +// multipart 字段名 file,支持图片与 PDF,单个文件 ≤10MB;文件落入租户文件管理 +// (backend/{tid}/{uid}/...,用户个人范围),返回 {id,url,name} 供业务写引用。 +func (c *AppOaController) uploadTenantImage() { + claims, err := c.oaClaims() + if err != nil { + c.oaErr(401, 401, "未登录或无权限") + return + } + + fh, header, err := c.GetFile("file") + if err != nil || fh == nil { + c.oaErr(400, 400, "请选择要上传的文件") + return + } + defer fh.Close() + + switch strings.ToLower(filepath.Ext(header.Filename)) { + case ".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp", ".pdf": + default: + c.oaErr(400, 400, "仅支持 JPG/PNG/GIF/WEBP/BMP 图片或 PDF 文件") + return + } + if header.Size > oaUploadMaxBytes { + c.oaErr(400, 400, "文件大小不能超过10MB") + return + } + + storage, err := services.GetStorageService() + if err != nil { + c.oaErr(500, 500, "存储服务不可用,请稍后重试") + return + } + staged, err := storage.Stage(fh, header) + if err != nil { + c.oaErr(500, 500, "读取上传文件失败") + return + } + committed := false + defer func() { + // 查重命中或出错时清理临时文件 + if !committed && staged != nil { + _ = storage.Discard(staged) + } + }() + + tid := uint64(claims.TenantId) + tuid := uint64(claims.UserID) + ctx := services.UploadContext{Source: services.SourceBackend, Tid: tid, Tuid: tuid} + scope := ctx.Scope() + + // 同用户上传过同一张图(MD5 相同)直接复用文件记录,不重复落盘 + exist, err := services.FindDuplicate(services.SourceBackend, scope, tid, tuid, staged.MD5) + if err != nil { + c.oaErr(500, 500, "查重失败") + return + } + if exist != nil { + committed = true + c.oaOk(map[string]interface{}{"id": exist.ID, "url": exist.Src, "name": exist.Name}) + return + } + + result, err := storage.Commit(staged, ctx) + if err != nil { + c.oaErr(500, 500, "上传失败,请重试") + return + } + committed = true + + fileID, _ := services.CreateFileRecord(services.FileUploadParams{ + Source: services.SourceBackend, + Scope: scope, + Tid: tid, + Tuid: tuid, + Uid: tuid, + Name: header.Filename, + Ext: staged.Ext, + Size: uint64(staged.Size), + Src: result.URL, + ObjectKey: result.Key, + Storage: storage.Type(), + MD5: staged.MD5, + }) + c.oaOk(map[string]interface{}{"id": fileID, "url": result.URL, "name": header.Filename}) +} + +// ScheduleUploadImage POST /api/oa/schedule/upload(multipart,字段名 file) +// 上传日程资料图片,共享 uploadTenantImage;随后由 ScheduleImages 把引用写进日程。 +func (c *AppOaController) ScheduleUploadImage() { + c.uploadTenantImage() +} + +// ScheduleImages POST /api/oa/schedule/images/:id 维护日程资料图片(只存文件引用)。 +// 与 Web 后台 SetImages 共用核心逻辑;已完成日程也允许补充资料。 +func (c *AppOaController) ScheduleImages() { + claims, err := c.oaClaims() + if err != nil { + c.oaErr(401, 401, "未登录或无权限") + return + } + + id := c.oaScheduleIDParam() + if id == 0 { + c.oaErr(400, 400, "无效ID") + return + } + + var payload struct { + Images []oaScheduleImage `json:"images"` + } + raw, _ := io.ReadAll(c.Ctx.Request.Body) + if len(raw) > 0 && json.Unmarshal(raw, &payload) != nil { + c.oaErr(400, 400, "参数错误") + return + } + + images, code, msg := oaScheduleSetImagesCore(claims, id, payload.Images) + if msg != "" { + c.oaErr(code, code, msg) + return + } + c.oaOk(map[string]interface{}{"images": images}) +} diff --git a/go/controllers/backend_oa_schedule.go b/go/controllers/backend_oa_schedule.go index 6b7b844..b9f1499 100644 --- a/go/controllers/backend_oa_schedule.go +++ b/go/controllers/backend_oa_schedule.go @@ -160,6 +160,21 @@ func (c *BackendOaScheduleController) List() { endDate := strings.TrimSpace(c.GetString("end_date")) category := strings.TrimSpace(c.GetString("category")) + data, code, msg := oaScheduleListData(claims.TenantId, claims.UserID, + page, pageSize, keyword, status, priority, startDate, endDate, category) + if msg != "" { + c.oasJsonErr(code, code, msg) + return + } + c.oasOk(data) +} + +// oaScheduleListData 日程列表的共享查询逻辑,Web 后台(/backend/oa/schedule/list) +// 与移动端(/api/oa/schedule/list)共用。 +// 返回 (数据, HTTP 状态码, 错误信息),错误信息为空串表示成功。 +func oaScheduleListData(tid, userID, page, pageSize int, + keyword, status, priority, startDate, endDate, category string) (map[string]interface{}, int, string) { + if page < 1 { page = 1 } @@ -181,7 +196,7 @@ func (c *BackendOaScheduleController) List() { // 分类角标按全量统计(只受关键词/优先级影响),不随日历翻月或区间筛选跳动 countOf := func(f oaScheduleFilter) int64 { - n, _ := oaScheduleQS(claims.TenantId, claims.UserID, f).Count() + n, _ := oaScheduleQS(tid, userID, f).Count() return n } today := time.Now().Format("2006-01-02") @@ -214,16 +229,15 @@ func (c *BackendOaScheduleController) List() { listFilter.Status = 1 } - qs := oaScheduleQS(claims.TenantId, claims.UserID, listFilter) + qs := oaScheduleQS(tid, userID, listFilter) total, _ := qs.Count() var list []models.OaSchedule - _, err = qs.OrderBy("schedule_date", "start_time", "-id"). + _, err := qs.OrderBy("schedule_date", "start_time", "-id"). Limit(pageSize).Offset((page - 1) * pageSize). All(&list) if err != nil && err != orm.ErrNoRows { - c.oasJsonErr(500, 500, "查询失败") - return + return nil, 500, "查询失败" } if list == nil { list = []models.OaSchedule{} @@ -234,11 +248,11 @@ func (c *BackendOaScheduleController) List() { list[i].ScheduleDate = normalizeOaDate(list[i].ScheduleDate) } - c.oasOk(map[string]interface{}{ + return map[string]interface{}{ "list": list, "total": total, "counts": counts, - }) + }, 200, "" } // Holidays GET /backend/oa/holiday @@ -590,25 +604,36 @@ func parseOaScheduleImages(raw string) []oaScheduleImage { // parseOaSchedulePayload 读取并校验新建/编辑日程的请求体;校验失败时直接输出错误响应。 func (c *BackendOaScheduleController) parseOaSchedulePayload() (oaSchedulePayload, bool) { - var payload oaSchedulePayload raw, err := io.ReadAll(c.Ctx.Request.Body) - if err != nil || json.Unmarshal(raw, &payload) != nil { + if err != nil { c.oasJsonErr(400, 400, "参数错误") + return oaSchedulePayload{}, false + } + payload, msg := parseOaSchedulePayloadBody(raw) + if msg != "" { + c.oasJsonErr(400, 400, msg) return payload, false } + return payload, true +} + +// parseOaSchedulePayloadBody 新建/编辑日程请求体的共享校验逻辑, +// Web 后台与移动端共用。返回 (校验后的载荷, 错误信息),错误信息为空串表示成功。 +func parseOaSchedulePayloadBody(raw []byte) (oaSchedulePayload, string) { + var payload oaSchedulePayload + if len(raw) == 0 || json.Unmarshal(raw, &payload) != nil { + return payload, "参数错误" + } payload.Title = strings.TrimSpace(payload.Title) if payload.Title == "" { - c.oasJsonErr(400, 400, "请输入日程标题") - return payload, false + return payload, "请输入日程标题" } if utf8.RuneCountInString(payload.Title) > 80 { - c.oasJsonErr(400, 400, "日程标题不能超过80字") - return payload, false + return payload, "日程标题不能超过80字" } if !isValidOaDate(payload.ScheduleDate) { - c.oasJsonErr(400, 400, "日程日期无效") - return payload, false + return payload, "日程日期无效" } if payload.AllDay != 0 { payload.AllDay = 1 @@ -616,17 +641,14 @@ func (c *BackendOaScheduleController) parseOaSchedulePayload() (oaSchedulePayloa payload.EndTime = "" } else { if !isValidOaTime(payload.StartTime) { - c.oasJsonErr(400, 400, "开始时间无效") - return payload, false + return payload, "开始时间无效" } if payload.EndTime != "" { if !isValidOaTime(payload.EndTime) { - c.oasJsonErr(400, 400, "结束时间无效") - return payload, false + return payload, "结束时间无效" } if payload.EndTime < payload.StartTime { - c.oasJsonErr(400, 400, "结束时间不能早于开始时间") - return payload, false + return payload, "结束时间不能早于开始时间" } } } @@ -649,18 +671,16 @@ func (c *BackendOaScheduleController) parseOaSchedulePayload() (oaSchedulePayloa } payload.RemindChannels = validChannels if len(validChannels) == 0 { - c.oasJsonErr(400, 400, "请至少选择一个提醒渠道") - return payload, false + return payload, "请至少选择一个提醒渠道" } if _, err := time.ParseInLocation("2006-01-02 15:04:05", payload.ReminderTime, time.Local); err != nil { - c.oasJsonErr(400, 400, "提醒时间格式不合法,支持 YYYY-MM-DD HH:mm:ss") - return payload, false + return payload, "提醒时间格式不合法,支持 YYYY-MM-DD HH:mm:ss" } if payload.AdvanceMinutes < 0 { payload.AdvanceMinutes = 0 } } - return payload, true + return payload, "" } // Create POST /backend/oa/schedule/create @@ -676,6 +696,17 @@ func (c *BackendOaScheduleController) Create() { return } + item, code, msg := oaScheduleCreateCore(claims, payload) + if msg != "" { + c.oasJsonErr(code, code, msg) + return + } + c.oasOk(item) +} + +// oaScheduleCreateCore 创建日程(含提醒绑定)的共享逻辑,Web 后台与移动端共用。 +// 返回 (新建日程, HTTP 状态码, 错误信息),错误信息为空串表示成功。 +func oaScheduleCreateCore(claims *jwtutil.Claims, payload oaSchedulePayload) (*models.OaSchedule, int, string) { now := time.Now() item := &models.OaSchedule{ Tid: claims.TenantId, @@ -695,8 +726,7 @@ func (c *BackendOaScheduleController) Create() { UpdateTime: &now, } if _, err := models.Orm.Insert(item); err != nil { - c.oasJsonErr(500, 500, "保存失败") - return + return nil, 500, "保存失败" } // 开启提醒:生成绑定的提醒任务,并把其 ID 回写到日程。 @@ -713,17 +743,15 @@ func (c *BackendOaScheduleController) Create() { if rerr != nil { // 回滚已创建的日程,避免产生孤立日程 _, _ = models.Orm.QueryTable(new(models.OaSchedule)).Filter("id", item.ID).Delete() - c.oasJsonErr(500, 500, rerr.Error()) - return + return nil, 500, rerr.Error() } item.ReminderID = rid if _, err := models.Orm.Update(item, "ReminderID"); err != nil { - c.oasJsonErr(500, 500, "保存失败") - return + return nil, 500, "保存失败" } } - c.oasOk(item) + return item, 200, "" } // Update POST /backend/oa/schedule/update/:id @@ -745,16 +773,26 @@ func (c *BackendOaScheduleController) Update() { return } + item, code, msg := oaScheduleUpdateCore(claims, id, payload) + if msg != "" { + c.oasJsonErr(code, code, msg) + return + } + c.oasOk(item) +} + +// oaScheduleUpdateCore 更新日程(含提醒重绑)的共享逻辑,Web 后台与移动端共用。 +// 返回 (更新后日程, HTTP 状态码, 错误信息),错误信息为空串表示成功。 +func oaScheduleUpdateCore(claims *jwtutil.Claims, id uint64, payload oaSchedulePayload) (*models.OaSchedule, int, string) { var item models.OaSchedule - err = models.Orm.QueryTable(new(models.OaSchedule)). + err := models.Orm.QueryTable(new(models.OaSchedule)). Filter("id", id). Filter("is_deleted", 0). Filter("tid", claims.TenantId). Filter("user_id", claims.UserID). One(&item) if err != nil { - c.oasJsonErr(404, 404, "日程不存在") - return + return nil, 404, "日程不存在" } now := time.Now() @@ -781,8 +819,7 @@ func (c *BackendOaScheduleController) Update() { payload.AdvanceMinutes, ) if rerr != nil { - c.oasJsonErr(500, 500, rerr.Error()) - return + return nil, 500, rerr.Error() } if item.ReminderID > 0 { deleteBoundReminder(item.ReminderID) @@ -796,11 +833,10 @@ func (c *BackendOaScheduleController) Update() { if _, err := models.Orm.Update(&item, "Title", "Content", "ScheduleDate", "StartTime", "EndTime", "AllDay", "Color", "Priority", "ReminderID", "UpdateTime"); err != nil { - c.oasJsonErr(500, 500, "保存失败") - return + return nil, 500, "保存失败" } - c.oasOk(item) + return &item, 200, "" } // SetImages POST /backend/oa/schedule/images/:id @@ -827,33 +863,42 @@ func (c *BackendOaScheduleController) SetImages() { c.oasJsonErr(400, 400, "参数错误") return } - imagesJSON, ok := normalizeOaScheduleImages(payload.Images) - if !ok { - c.oasJsonErr(400, 400, "图片数量过多") + + images, code, msg := oaScheduleSetImagesCore(claims, id, payload.Images) + if msg != "" { + c.oasJsonErr(code, code, msg) return } + c.oasOk(map[string]interface{}{"images": images}) +} + +// oaScheduleSetImagesCore 保存日程相关图片(只存文件引用)的共享逻辑, +// Web 后台与移动端共用。返回 (图片列表, HTTP 状态码, 错误信息),错误信息为空串表示成功。 +func oaScheduleSetImagesCore(claims *jwtutil.Claims, id uint64, images []oaScheduleImage) ([]oaScheduleImage, int, string) { + imagesJSON, ok := normalizeOaScheduleImages(images) + if !ok { + return nil, 400, "图片数量过多" + } var item models.OaSchedule - err = models.Orm.QueryTable(new(models.OaSchedule)). + err := models.Orm.QueryTable(new(models.OaSchedule)). Filter("id", id). Filter("is_deleted", 0). Filter("tid", claims.TenantId). Filter("user_id", claims.UserID). One(&item) if err != nil { - c.oasJsonErr(404, 404, "日程不存在") - return + return nil, 404, "日程不存在" } now := time.Now() item.Images = imagesJSON item.UpdateTime = &now if _, err := models.Orm.Update(&item, "Images", "UpdateTime"); err != nil { - c.oasJsonErr(500, 500, "保存失败") - return + return nil, 500, "保存失败" } - c.oasOk(map[string]interface{}{"images": parseOaScheduleImages(imagesJSON)}) + return parseOaScheduleImages(imagesJSON), 200, "" } // UpdateContent POST /backend/oa/schedule/content/:id 仅更新备注内容。 @@ -918,17 +963,27 @@ func (c *BackendOaScheduleController) Delete() { return } + code, msg := oaScheduleDeleteCore(claims, id) + if msg != "" { + c.oasJsonErr(code, code, msg) + return + } + c.oasOk(nil) +} + +// oaScheduleDeleteCore 软删除日程并清理绑定提醒的共享逻辑,Web 后台与移动端共用。 +// 返回 (HTTP 状态码, 错误信息),错误信息为空串表示成功。 +func oaScheduleDeleteCore(claims *jwtutil.Claims, id uint64) (int, string) { now := time.Now() var item models.OaSchedule - err = models.Orm.QueryTable(new(models.OaSchedule)). + err := models.Orm.QueryTable(new(models.OaSchedule)). Filter("id", id). Filter("is_deleted", 0). Filter("tid", claims.TenantId). Filter("user_id", claims.UserID). One(&item) if err != nil { - c.oasJsonErr(404, 404, "日程不存在或已删除") - return + return 404, "日程不存在或已删除" } // 先删除绑定的提醒任务,避免提醒工具里残留孤立任务 @@ -940,11 +995,10 @@ func (c *BackendOaScheduleController) Delete() { item.DeleteTime = &now item.UpdateTime = &now if _, err := models.Orm.Update(&item, "IsDeleted", "DeleteTime", "UpdateTime"); err != nil { - c.oasJsonErr(500, 500, "删除失败") - return + return 500, "删除失败" } - c.oasOk(nil) + return 200, "" } // FinishSchedule POST /backend/oa/schedule/finish/:id @@ -964,16 +1018,26 @@ func (c *BackendOaScheduleController) FinishSchedule() { return } + newStatus, code, msg := oaScheduleToggleCore(claims, id) + if msg != "" { + c.oasJsonErr(code, code, msg) + return + } + c.oasOk(map[string]interface{}{"status": newStatus}) +} + +// oaScheduleToggleCore 切换日程完成状态的共享逻辑,Web 后台与移动端共用。 +// 返回 (新状态, HTTP 状态码, 错误信息),错误信息为空串表示成功。 +func oaScheduleToggleCore(claims *jwtutil.Claims, id uint64) (int8, int, string) { var item models.OaSchedule - err = models.Orm.QueryTable(new(models.OaSchedule)). + err := models.Orm.QueryTable(new(models.OaSchedule)). Filter("id", id). Filter("is_deleted", 0). Filter("tid", claims.TenantId). Filter("user_id", claims.UserID). One(&item) if err != nil { - c.oasJsonErr(404, 404, "日程不存在") - return + return 0, 404, "日程不存在" } now := time.Now() @@ -990,11 +1054,10 @@ func (c *BackendOaScheduleController) FinishSchedule() { item.UpdateTime = &now if _, err := models.Orm.Update(&item, "Status", "FinishTime", "UpdateTime"); err != nil { - c.oasJsonErr(500, 500, "操作失败") - return + return 0, 500, "操作失败" } - c.oasOk(map[string]interface{}{"status": newStatus}) + return newStatus, 200, "" } // nextOaDate 返回 dateStr 之后的第 days 天,格式仍为 "YYYY-MM-DD"。 diff --git a/go/controllers/backend_reimburse.go b/go/controllers/backend_reimburse.go index e6c3760..4812114 100644 --- a/go/controllers/backend_reimburse.go +++ b/go/controllers/backend_reimburse.go @@ -24,17 +24,17 @@ type BackendReimburseController struct { } type reimbursementItemPayload struct { - ID uint64 `json:"id"` - ExpenseType string `json:"expense_type"` - ExpenseDate string `json:"expense_date"` - Amount float64 `json:"amount"` - Quantity int `json:"quantity"` - UnitPrice float64 `json:"unit_price"` - Description string `json:"description"` - ReceiptFlag int8 `json:"receipt_flag"` - ReceiptFileIDs string `json:"receipt_file_ids"` - ReceiptURLs string `json:"receipt_urls"` - ReceiptAmounts *string `json:"receipt_amounts,omitempty"` + ID uint64 `json:"id"` + ExpenseType string `json:"expense_type"` + ExpenseDate string `json:"expense_date"` + Amount float64 `json:"amount"` + Quantity int `json:"quantity"` + UnitPrice float64 `json:"unit_price"` + Description string `json:"description"` + ReceiptFlag int8 `json:"receipt_flag"` + ReceiptFileIDs string `json:"receipt_file_ids"` + ReceiptURLs string `json:"receipt_urls"` + ReceiptAmounts *string `json:"receipt_amounts,omitempty"` } type reimbursementPayload struct { @@ -88,7 +88,9 @@ func (c *BackendReimburseController) getID() (uint64, bool) { return id, err == nil && id > 0 } -func (c *BackendReimburseController) findOwned(id uint64, claims *jwtutil.Claims) (*models.BackendReimbursement, error) { +// findOwnedReimbursement 按 id + 租户 + 申请人 查询本人报销单(未删除)。 +// 报销单为个人单据:与列表口径一致,按 JWT 中 tid + user_id 双重隔离。 +func findOwnedReimbursement(claims *jwtutil.Claims, id uint64) (*models.BackendReimbursement, error) { row := &models.BackendReimbursement{} err := models.Orm.QueryTable(new(models.BackendReimbursement)). Filter("id", id). @@ -301,7 +303,7 @@ func reimbursementItemDTO(item models.BackendReimbursementItem, scheme, host str "amount": item.Amount, "quantity": item.Quantity, "unit_price": item.UnitPrice, "description": item.Description, "receipt_flag": receiptFlag, "receipt_file_ids": item.ReceiptFileIDs, - "receipt_urls": receiptURLs, "receipt_amounts": item.ReceiptAmounts, + "receipt_urls": receiptURLs, "receipt_amounts": item.ReceiptAmounts, "receipt_files": receiptFiles, } } @@ -310,7 +312,7 @@ func reimbursementDTO(row models.BackendReimbursement, items []models.BackendRei _, userName := services.OperationLogUser(&row.Tid, row.UserID) result := map[string]interface{}{ "id": row.ID, "tid": row.Tid, "uid": row.UID, "user_id": row.UserID, - "user_name": userName, + "user_name": userName, "department_id": row.DepartmentID, "total_amount": row.TotalAmount, "status": row.Status, "apply_date": row.ApplyDate.Format("2006-01-02"), "description": row.Description, "current_approver_id": row.CurrentApproverID, @@ -333,16 +335,26 @@ func (c *BackendReimburseController) List() { } page, _ := c.GetInt("page", 1) pageSize, _ := c.GetInt("pageSize", 10) + keyword := strings.TrimSpace(c.GetString("keyword")) + status, statusErr := c.GetInt("status") + + data, code, msg := reimburseListData(claims, page, pageSize, keyword, statusErr == nil, status) + if msg != "" { + c.reply(code, msg, nil) + return + } + c.reply(200, "success", data) +} + +// reimburseListData 报销单列表共享逻辑:Web 后台与移动端(/api/oa/expense/list)共用。 +// 返回 (数据, HTTP 状态码, 错误信息),错误信息为空串表示成功。 +func reimburseListData(claims *jwtutil.Claims, page, pageSize int, keyword string, hasStatus bool, status int) (map[string]interface{}, int, string) { if page < 1 { page = 1 } if pageSize < 1 || pageSize > 100 { pageSize = 10 } - keyword := strings.TrimSpace(c.GetString("keyword")) - status, statusErr := c.GetInt("status") - hasStatus := statusErr == nil - qs := models.Orm.QueryTable(new(models.BackendReimbursement)). Filter("tid", claims.TenantId).Filter("user_id", claims.UserID).Filter("is_deleted", 0) if keyword != "" { @@ -353,14 +365,12 @@ func (c *BackendReimburseController) List() { } total, err := qs.Count() if err != nil { - c.reply(500, "查询失败", nil) - return + return nil, 500, "查询失败" } var rows []models.BackendReimbursement _, err = qs.OrderBy("-id").Limit(pageSize, (page-1)*pageSize).All(&rows) if err != nil && err != orm.ErrNoRows { - c.reply(500, "查询失败", nil) - return + return nil, 500, "查询失败" } if rows == nil { rows = []models.BackendReimbursement{} @@ -383,7 +393,7 @@ func (c *BackendReimburseController) List() { "update_time": row.UpdateTime, }) } - c.reply(200, "success", map[string]interface{}{"list": list, "total": total}) + return map[string]interface{}{"list": list, "total": total}, 200, "" } // Detail GET /backend/reimbursements/:id @@ -398,21 +408,29 @@ func (c *BackendReimburseController) Detail() { c.reply(400, "无效ID", nil) return } - row, err := c.findOwned(id, claims) - if err != nil { - c.reply(404, "报销单不存在", nil) + scheme, host := services.PublicRequestBaseURL(&c.Controller) + data, code, msg := reimburseDetailData(claims, id, scheme, host) + if msg != "" { + c.reply(code, msg, nil) return } + c.reply(200, "success", data) +} + +// reimburseDetailData 报销单详情共享逻辑(主单 + 明细 + 发票文件)。 +func reimburseDetailData(claims *jwtutil.Claims, id uint64, scheme, host string) (map[string]interface{}, int, string) { + row, err := findOwnedReimbursement(claims, id) + if err != nil { + return nil, 404, "报销单不存在" + } var items []models.BackendReimbursementItem _, err = models.Orm.QueryTable(new(models.BackendReimbursementItem)). Filter("reimbursement_id", id).Filter("tid", claims.TenantId).Filter("is_deleted", 0). OrderBy("id").All(&items) if err != nil && err != orm.ErrNoRows { - c.reply(500, "查询明细失败: "+err.Error(), nil) - return + return nil, 500, "查询明细失败: " + err.Error() } - scheme, host := services.PublicRequestBaseURL(&c.Controller) - c.reply(200, "success", reimbursementDTO(*row, items, scheme, host)) + return reimbursementDTO(*row, items, scheme, host), 200, "" } // Create POST /backend/reimbursements @@ -427,10 +445,19 @@ func (c *BackendReimburseController) Create() { c.reply(400, "参数错误", nil) return } + id, code, msg := reimburseCreateCore(claims, payload) + if msg != "" { + c.reply(code, msg, nil) + return + } + c.reply(200, "success", map[string]interface{}{"id": id}) +} + +// reimburseCreateCore 创建报销单(草稿)共享逻辑。 +func reimburseCreateCore(claims *jwtutil.Claims, payload reimbursementPayload) (uint64, int, string) { applyDate, err := parseReimburseDate(payload.ApplyDate) if err != nil { - c.reply(400, "申请日期格式错误", nil) - return + return 0, 400, "申请日期格式错误" } uid := uint64(claims.UserID) row := &models.BackendReimbursement{ @@ -439,10 +466,9 @@ func (c *BackendReimburseController) Create() { Description: nullableReimburseString(payload.Description), } if err := saveReimbursement(row); err != nil { - c.reply(500, "创建报销单失败", nil) - return + return 0, 500, "创建报销单失败" } - c.reply(200, "success", map[string]interface{}{"id": row.ID}) + return row.ID, 200, "" } // Update POST /backend/reimbursements/:id @@ -457,31 +483,37 @@ func (c *BackendReimburseController) Update() { c.reply(400, "无效ID", nil) return } - row, err := c.findOwned(id, claims) - if err != nil { - c.reply(404, "报销单不存在", nil) - return - } - if row.Status != 0 { - c.reply(400, "只有草稿可以编辑", nil) - return - } payload, err := c.parsePayload() if err != nil { c.reply(400, "参数错误", nil) return } + code, msg := reimburseUpdateCore(claims, id, payload) + if msg != "" { + c.reply(code, msg, nil) + return + } + c.reply(200, "success", map[string]interface{}{"id": id}) +} + +// reimburseUpdateCore 编辑报销单(仅草稿)共享逻辑。 +func reimburseUpdateCore(claims *jwtutil.Claims, id uint64, payload reimbursementPayload) (int, string) { + row, err := findOwnedReimbursement(claims, id) + if err != nil { + return 404, "报销单不存在" + } + if row.Status != 0 { + return 400, "只有草稿可以编辑" + } applyDate, err := parseReimburseDate(payload.ApplyDate) if err != nil { - c.reply(400, "申请日期格式错误", nil) - return + return 400, "申请日期格式错误" } row.ApplyDate, row.Description = applyDate, nullableReimburseString(payload.Description) if err := saveReimbursement(row); err != nil { - c.reply(500, "更新报销单失败", nil) - return + return 500, "更新报销单失败" } - c.reply(200, "success", map[string]interface{}{"id": row.ID}) + return 200, "" } // Delete DELETE /backend/reimbursements/:id @@ -496,25 +528,32 @@ func (c *BackendReimburseController) Delete() { c.reply(400, "无效ID", nil) return } - row, err := c.findOwned(id, claims) - if err != nil { - c.reply(404, "报销单不存在", nil) + code, msg := reimburseDeleteCore(claims, id) + if msg != "" { + c.reply(code, msg, nil) return } + c.reply(200, "success", nil) +} + +// reimburseDeleteCore 删除报销单(仅草稿,连明细一起软删)共享逻辑。 +func reimburseDeleteCore(claims *jwtutil.Claims, id uint64) (int, string) { + row, err := findOwnedReimbursement(claims, id) + if err != nil { + return 404, "报销单不存在" + } if row.Status != 0 { - c.reply(400, "只有草稿可以删除", nil) - return + return 400, "只有草稿可以删除" } now := time.Now() _, err = models.Orm.QueryTable(new(models.BackendReimbursement)).Filter("id", id). Update(orm.Params{"is_deleted": 1, "delete_time": now, "update_time": now}) if err != nil { - c.reply(500, "删除失败", nil) - return + return 500, "删除失败" } _, _ = models.Orm.QueryTable(new(models.BackendReimbursementItem)). Filter("reimbursement_id", id).Update(orm.Params{"is_deleted": 1, "delete_time": now}) - c.reply(200, "success", nil) + return 200, "" } func (c *BackendReimburseController) parseItemPayload() (reimbursementItemPayload, error) { @@ -532,7 +571,8 @@ func (c *BackendReimburseController) getItemID() (uint64, bool) { return id, err == nil && id > 0 } -func (c *BackendReimburseController) findOwnedItem(id, reimbursementID uint64, claims *jwtutil.Claims) (*models.BackendReimbursementItem, error) { +// findOwnedReimbursementItem 查询本人报销单下的费用明细(包级共享,移动端复用)。 +func findOwnedReimbursementItem(claims *jwtutil.Claims, id, reimbursementID uint64) (*models.BackendReimbursementItem, error) { item := &models.BackendReimbursementItem{} err := models.Orm.QueryTable(new(models.BackendReimbursementItem)). Filter("id", id). @@ -558,17 +598,17 @@ func validateReimbursementItem(item reimbursementItemPayload) (time.Time, error) return date, nil } -func (c *BackendReimburseController) ensureDraftReimbursement(id uint64, claims *jwtutil.Claims) (*models.BackendReimbursement, bool) { - row, err := c.findOwned(id, claims) +// ensureDraftReimbursement 校验报销单存在且为草稿(包级共享,移动端复用)。 +// 返回 (报销单, HTTP 状态码, 错误信息),错误信息为空串表示通过。 +func ensureDraftReimbursement(claims *jwtutil.Claims, id uint64) (*models.BackendReimbursement, int, string) { + row, err := findOwnedReimbursement(claims, id) if err != nil { - c.reply(404, "报销单不存在", nil) - return nil, false + return nil, 404, "报销单不存在" } if row.Status != 0 { - c.reply(400, "只有草稿可以维护费用明细", nil) - return nil, false + return nil, 400, "只有草稿可以维护费用明细" } - return row, true + return row, 200, "" } func recalculateReimbursementTotal(id uint64) error { @@ -602,25 +642,38 @@ func (c *BackendReimburseController) AddItem() { c.reply(400, "无效报销单ID", nil) return } - if _, ok := c.ensureDraftReimbursement(reimbursementID, claims); !ok { - return - } payload, err := c.parseItemPayload() if err != nil { c.reply(400, "参数错误", nil) return } + scheme, host := services.PublicRequestBaseURL(&c.Controller) + item, code, msg := reimburseAddItemCore(claims, reimbursementID, payload, scheme, host) + if msg != "" { + c.reply(code, msg, nil) + return + } + c.reply(200, "success", item) +} + +// reimburseAddItemCore 新增费用明细共享逻辑(仅草稿;自动重算报销总额)。 +func reimburseAddItemCore(claims *jwtutil.Claims, reimbursementID uint64, payload reimbursementItemPayload, scheme, host string) (map[string]interface{}, int, string) { + if _, _, msg := ensureDraftReimbursement(claims, reimbursementID); msg != "" { + code := 400 + if msg == "报销单不存在" { + code = 404 + } + return nil, code, msg + } date, err := validateReimbursementItem(payload) if err != nil { - c.reply(400, err.Error(), nil) - return + return nil, 400, err.Error() } uid := uint64(claims.UserID) quantity := payload.Quantity if quantity <= 0 { quantity = 1 } - scheme, host := services.PublicRequestBaseURL(&c.Controller) item := &models.BackendReimbursementItem{ Tid: uint64(claims.TenantId), UID: &uid, ReimbursementID: reimbursementID, ExpenseType: strings.TrimSpace(payload.ExpenseType), ExpenseDate: date, @@ -629,14 +682,12 @@ func (c *BackendReimburseController) AddItem() { } applyReceiptToItem(item, payload, scheme, host) if _, err := models.Orm.Insert(item); err != nil { - c.reply(500, "新增费用明细失败", nil) - return + return nil, 500, "新增费用明细失败" } if err := recalculateReimbursementTotal(reimbursementID); err != nil { - c.reply(500, "更新报销总额失败", nil) - return + return nil, 500, "更新报销总额失败" } - c.reply(200, "success", reimbursementItemDTO(*item, scheme, host)) + return reimbursementItemDTO(*item, scheme, host), 200, "" } // UpdateItem POST /backend/reimbursements/:id/items/:item_id @@ -656,29 +707,41 @@ func (c *BackendReimburseController) UpdateItem() { c.reply(400, "无效费用明细ID", nil) return } - if _, ok := c.ensureDraftReimbursement(reimbursementID, claims); !ok { - return - } - item, err := c.findOwnedItem(itemID, reimbursementID, claims) - if err != nil { - c.reply(404, "费用明细不存在", nil) - return - } payload, err := c.parseItemPayload() if err != nil { c.reply(400, "参数错误", nil) return } + scheme, host := services.PublicRequestBaseURL(&c.Controller) + item, code, msg := reimburseUpdateItemCore(claims, reimbursementID, itemID, payload, scheme, host) + if msg != "" { + c.reply(code, msg, nil) + return + } + c.reply(200, "success", item) +} + +// reimburseUpdateItemCore 更新费用明细共享逻辑(仅草稿;自动重算报销总额)。 +func reimburseUpdateItemCore(claims *jwtutil.Claims, reimbursementID, itemID uint64, payload reimbursementItemPayload, scheme, host string) (map[string]interface{}, int, string) { + if _, _, msg := ensureDraftReimbursement(claims, reimbursementID); msg != "" { + code := 400 + if msg == "报销单不存在" { + code = 404 + } + return nil, code, msg + } + item, err := findOwnedReimbursementItem(claims, itemID, reimbursementID) + if err != nil { + return nil, 404, "费用明细不存在" + } date, err := validateReimbursementItem(payload) if err != nil { - c.reply(400, err.Error(), nil) - return + return nil, 400, err.Error() } quantity := payload.Quantity if quantity <= 0 { quantity = 1 } - scheme, host := services.PublicRequestBaseURL(&c.Controller) item.ExpenseType = strings.TrimSpace(payload.ExpenseType) item.ExpenseDate = date item.Amount = payload.Amount @@ -687,14 +750,12 @@ func (c *BackendReimburseController) UpdateItem() { item.Description = strings.TrimSpace(payload.Description) applyReceiptToItem(item, payload, scheme, host) if _, err := models.Orm.Update(item); err != nil { - c.reply(500, "更新费用明细失败", nil) - return + return nil, 500, "更新费用明细失败" } if err := recalculateReimbursementTotal(reimbursementID); err != nil { - c.reply(500, "更新报销总额失败", nil) - return + return nil, 500, "更新报销总额失败" } - c.reply(200, "success", reimbursementItemDTO(*item, scheme, host)) + return reimbursementItemDTO(*item, scheme, host), 200, "" } // DeleteItem DELETE /backend/reimbursements/:id/items/:item_id @@ -714,26 +775,36 @@ func (c *BackendReimburseController) DeleteItem() { c.reply(400, "无效费用明细ID", nil) return } - if _, ok := c.ensureDraftReimbursement(reimbursementID, claims); !ok { + code, msg := reimburseDeleteItemCore(claims, reimbursementID, itemID) + if msg != "" { + c.reply(code, msg, nil) return } - item, err := c.findOwnedItem(itemID, reimbursementID, claims) + c.reply(200, "success", nil) +} + +// reimburseDeleteItemCore 删除费用明细共享逻辑(仅草稿;自动重算报销总额)。 +func reimburseDeleteItemCore(claims *jwtutil.Claims, reimbursementID, itemID uint64) (int, string) { + if _, _, msg := ensureDraftReimbursement(claims, reimbursementID); msg != "" { + if msg == "报销单不存在" { + return 404, msg + } + return 400, msg + } + item, err := findOwnedReimbursementItem(claims, itemID, reimbursementID) if err != nil { - c.reply(404, "费用明细不存在", nil) - return + return 404, "费用明细不存在" } now := time.Now() _, err = models.Orm.QueryTable(new(models.BackendReimbursementItem)). Filter("id", item.ID).Update(orm.Params{"is_deleted": 1, "delete_time": now, "update_time": now}) if err != nil { - c.reply(500, "删除费用明细失败", nil) - return + return 500, "删除费用明细失败" } if err := recalculateReimbursementTotal(reimbursementID); err != nil { - c.reply(500, "更新报销总额失败", nil) - return + return 500, "更新报销总额失败" } - c.reply(200, "success", nil) + return 200, "" } // Submit POST /backend/reimbursements/:id/submit @@ -748,30 +819,37 @@ func (c *BackendReimburseController) Submit() { c.reply(400, "无效ID", nil) return } - row, err := c.findOwned(id, claims) - if err != nil { - c.reply(404, "报销单不存在", nil) + code, msg := reimburseSubmitCore(claims, id) + if msg != "" { + c.reply(code, msg, nil) return } + c.reply(200, "success", nil) +} + +// reimburseSubmitCore 提交审批共享逻辑:仅草稿可提交,需租户已配置启用审批流, +// 提交后状态置为审批中(1),并写入 action=1 的审批记录。 +func reimburseSubmitCore(claims *jwtutil.Claims, id uint64) (int, string) { + row, err := findOwnedReimbursement(claims, id) + if err != nil { + return 404, "报销单不存在" + } if row.Status != 0 { - c.reply(400, "当前状态不可提交", nil) - return + return 400, "当前状态不可提交" } var flow models.BackendApprovalFlow err = models.Orm.QueryTable(new(models.BackendApprovalFlow)). Filter("tid", claims.TenantId).Filter("is_active", 1).Filter("is_deleted", 0). OrderBy("step_order").One(&flow) if err != nil { - c.reply(400, "尚未配置审批流程", nil) - return + return 400, "尚未配置审批流程" } now := time.Now() _, err = models.Orm.QueryTable(new(models.BackendReimbursement)).Filter("id", id).Update(orm.Params{ "status": 1, "current_step": flow.StepOrder, "current_approver_id": 0, "update_time": now, }) if err != nil { - c.reply(500, "提交失败", nil) - return + return 500, "提交失败" } _, err = models.Orm.Insert(&models.BackendApprovalRecord{ Tid: uint64(claims.TenantId), UID: uint64Ptr(uint64(claims.UserID)), ReimbursementID: id, @@ -779,10 +857,9 @@ func (c *BackendReimburseController) Submit() { Step: flow.StepOrder, PrevStep: 0, }) if err != nil { - c.reply(500, "提交审批记录失败", nil) - return + return 500, "提交审批记录失败" } - c.reply(200, "success", nil) + return 200, "" } type reimbursementStatusPayload struct { @@ -820,28 +897,35 @@ func (c *BackendReimburseController) UpdateStatus() { c.reply(400, "参数错误", nil) return } - if !manualConfirmStatuses[payload.Status] { - c.reply(400, "不支持的状态值", nil) + newStatus, code, msg := reimburseUpdateStatusCore(claims, id, payload.Status) + if msg != "" { + c.reply(code, msg, nil) return } - row, err := c.findOwned(id, claims) + c.reply(200, "success", map[string]interface{}{"status": newStatus}) +} + +// reimburseUpdateStatusCore 手动确认更改单据状态共享逻辑。 +// 返回 (生效状态, HTTP 状态码, 错误信息)。 +func reimburseUpdateStatusCore(claims *jwtutil.Claims, id uint64, status int8) (int8, int, string) { + if !manualConfirmStatuses[status] { + return 0, 400, "不支持的状态值" + } + row, err := findOwnedReimbursement(claims, id) if err != nil { - c.reply(404, "报销单不存在", nil) - return + return 0, 404, "报销单不存在" } - if row.Status == payload.Status { - c.reply(200, "success", map[string]interface{}{"status": row.Status}) - return + if row.Status == status { + return row.Status, 200, "" } now := time.Now() _, err = models.Orm.QueryTable(new(models.BackendReimbursement)).Filter("id", id).Update(orm.Params{ - "status": payload.Status, "update_time": now, + "status": status, "update_time": now, }) if err != nil { - c.reply(500, "更新状态失败", nil) - return + return 0, 500, "更新状态失败" } - c.reply(200, "success", map[string]interface{}{"status": payload.Status}) + return status, 200, "" } // Records GET /backend/reimbursements/:id/records @@ -856,22 +940,30 @@ func (c *BackendReimburseController) Records() { c.reply(400, "无效ID", nil) return } - if _, err := c.findOwned(id, claims); err != nil { - c.reply(404, "报销单不存在", nil) + rows, code, msg := reimburseRecordsData(claims, id) + if msg != "" { + c.reply(code, msg, nil) return } + c.reply(200, "success", rows) +} + +// reimburseRecordsData 审批记录共享逻辑(按 step、id 升序)。 +func reimburseRecordsData(claims *jwtutil.Claims, id uint64) ([]models.BackendApprovalRecord, int, string) { + if _, err := findOwnedReimbursement(claims, id); err != nil { + return nil, 404, "报销单不存在" + } var rows []models.BackendApprovalRecord _, err := models.Orm.QueryTable(new(models.BackendApprovalRecord)). Filter("tid", claims.TenantId).Filter("reimbursement_id", id).Filter("is_deleted", 0). OrderBy("step", "id").All(&rows) if err != nil && err != orm.ErrNoRows { - c.reply(500, "查询审批记录失败", nil) - return + return nil, 500, "查询审批记录失败" } if rows == nil { rows = []models.BackendApprovalRecord{} } - c.reply(200, "success", rows) + return rows, 200, "" } type expenseTypePayload struct { @@ -896,6 +988,11 @@ func expenseTypeDTO(row models.BackendReimbursementExpenseType, tenantID int) ma } func (c *BackendReimburseController) queryExpenseTypes(tenantID int, activeOnly bool) ([]models.BackendReimbursementExpenseType, error) { + return queryReimburseExpenseTypes(tenantID, activeOnly) +} + +// queryReimburseExpenseTypes 费用类型查询共享逻辑:全局通用(tid=0)+ 当前租户专有。 +func queryReimburseExpenseTypes(tenantID int, activeOnly bool) ([]models.BackendReimbursementExpenseType, error) { qs := models.Orm.QueryTable(new(models.BackendReimbursementExpenseType)). SetCond(expenseTypeScopeCond(tenantID)). Filter("is_deleted", 0) diff --git a/go/routers/api/api.go b/go/routers/api/api.go index 852e8ea..f32d57a 100644 --- a/go/routers/api/api.go +++ b/go/routers/api/api.go @@ -96,6 +96,31 @@ func Register() { // OA 工作台仪表盘(移动端首屏顶部聚合:待办/报销统计 + 通知公告 + 今日日程) beego.Router("/api/oa/dashboard", &controllers.AppOaController{}, "get:Dashboard") + // OA 工作日程(日历待办,与 /backend/oa/schedule/* 同一套数据;小程序「工作日程」页面使用) + beego.Router("/api/oa/schedule/list", &controllers.AppOaController{}, "get:ScheduleList") + beego.Router("/api/oa/schedule/detail/:id", &controllers.AppOaController{}, "get:ScheduleDetail") + beego.Router("/api/oa/schedule/create", &controllers.AppOaController{}, "post:ScheduleCreate") + beego.Router("/api/oa/schedule/update/:id", &controllers.AppOaController{}, "post:ScheduleUpdate") + beego.Router("/api/oa/schedule/delete/:id", &controllers.AppOaController{}, "delete:ScheduleDelete") + beego.Router("/api/oa/schedule/finish/:id", &controllers.AppOaController{}, "post:ScheduleFinish") + beego.Router("/api/oa/schedule/upload", &controllers.AppOaController{}, "post:ScheduleUploadImage") + beego.Router("/api/oa/schedule/images/:id", &controllers.AppOaController{}, "post:ScheduleImages") + + // OA 报销管理(与 /backend/reimbursements* 同一套数据;小程序「报销管理」页面使用) + beego.Router("/api/oa/expense/list", &controllers.AppOaController{}, "get:ExpenseList") + beego.Router("/api/oa/expense/types", &controllers.AppOaController{}, "get:ExpenseTypes") + beego.Router("/api/oa/expense/upload", &controllers.AppOaController{}, "post:ExpenseUploadImage") + beego.Router("/api/oa/expense/detail/:id", &controllers.AppOaController{}, "get:ExpenseDetail") + beego.Router("/api/oa/expense/create", &controllers.AppOaController{}, "post:ExpenseCreate") + beego.Router("/api/oa/expense/update/:id", &controllers.AppOaController{}, "post:ExpenseUpdate") + beego.Router("/api/oa/expense/delete/:id", &controllers.AppOaController{}, "delete:ExpenseDelete") + beego.Router("/api/oa/expense/item/add/:id", &controllers.AppOaController{}, "post:ExpenseAddItem") + beego.Router("/api/oa/expense/item/update/:id/:item_id", &controllers.AppOaController{}, "post:ExpenseUpdateItem") + beego.Router("/api/oa/expense/item/delete/:id/:item_id", &controllers.AppOaController{}, "delete:ExpenseDeleteItem") + beego.Router("/api/oa/expense/submit/:id", &controllers.AppOaController{}, "post:ExpenseSubmit") + beego.Router("/api/oa/expense/status/:id", &controllers.AppOaController{}, "post:ExpenseStatus") + beego.Router("/api/oa/expense/records/:id", &controllers.AppOaController{}, "get:ExpenseRecords") + // 通讯录(移动端只读:列表 / 组织树 / 详情) beego.Router("/api/oa/contact/list", &controllers.AppOaController{}, "get:ContactList") beego.Router("/api/oa/contact/org-tree", &controllers.AppOaController{}, "get:ContactOrgTree") diff --git a/go/services/identity_register.go b/go/services/identity_register.go index e7ffddd..aab910c 100644 --- a/go/services/identity_register.go +++ b/go/services/identity_register.go @@ -1,4 +1,4 @@ -package services +package services import ( "crypto/rand" diff --git a/uniapp/api/expense.js b/uniapp/api/expense.js new file mode 100644 index 0000000..b11f197 --- /dev/null +++ b/uniapp/api/expense.js @@ -0,0 +1,277 @@ +import { request } from '@/api/request.js' +import { getBaseURL } from '@/api/config.js' +import { getToken } from '@/utils/auth.js' + +/** + * OA 报销管理接口封装,对应后端 /api/oa/expense/*。 + * 与 Web 后台 /backend/reimbursements* 是同一套数据(yz_backend_reimbursements), + * 状态机:0草稿 → 1审批中 → 2已通过 / 3已驳回 / 4已撤回 → 5已打款。 + */ + +/** 报销单状态常量 */ +export const EXPENSE_STATUS = { + DRAFT: 0, + APPROVING: 1, + APPROVED: 2, + REJECTED: 3, + WITHDRAWN: 4, + PAID: 5 +} + +/** 状态选项(label 与 Web 端一致;type 为 u-tag 颜色) */ +export const EXPENSE_STATUS_OPTIONS = [ + { value: 0, label: '草稿', type: 'info' }, + { value: 1, label: '审批中', type: 'primary' }, + { value: 2, label: '已通过', type: 'success' }, + { value: 3, label: '已驳回', type: 'error' }, + { value: 4, label: '已撤回', type: 'warning' }, + { value: 5, label: '已打款', type: 'success' } +] + +/** 审批记录动作文案(与 Web 端 detail 页 actionLabel 一致) */ +export const EXPENSE_ACTION_LABELS = { + 1: '提交申请', + 2: '审批通过', + 3: '审批驳回', + 4: '转审', + 5: '撤回' +} + +export function getExpenseStatusLabel(status) { + return EXPENSE_STATUS_OPTIONS.find(item => item.value === Number(status))?.label || '未知' +} + +export function getExpenseStatusType(status) { + return EXPENSE_STATUS_OPTIONS.find(item => item.value === Number(status))?.type || 'info' +} + +export function getExpenseActionLabel(action) { + return EXPENSE_ACTION_LABELS[Number(action)] || '审批操作' +} + +/** 金额展示:统一两位小数 */ +export function moneyText(value) { + return Number(value || 0).toFixed(2) +} + +/** + * 报销单列表(支持状态/关键词筛选) + * 返回 { list, total } + */ +export async function fetchExpenses(params = {}) { + const data = await request({ + url: '/api/oa/expense/list', + data: { + page: params.page || 1, + pageSize: params.pageSize || 20, + keyword: params.keyword || '', + status: params.status ?? '' + } + }) + return { list: data.list || [], total: data.total || 0 } +} + +/** + * 报销单详情(含费用明细与发票文件) + */ +export async function getExpense(id) { + const data = await request({ url: `/api/oa/expense/detail/${id}` }) + if (!data) return null + return { + ...data, + items: (data.items || []).map(normalizeExpenseItem) + } +} + +/** + * 新建报销单(草稿),返回新单据 id + */ +export async function createExpense(payload) { + const res = await request({ + url: '/api/oa/expense/create', + method: 'POST', + data: { + apply_date: payload.applyDate, + description: payload.description || '' + } + }) + return res?.id +} + +/** + * 编辑报销单基本信息(仅草稿) + */ +export function updateExpense(id, payload) { + return request({ + url: `/api/oa/expense/update/${id}`, + method: 'POST', + data: { + apply_date: payload.applyDate, + description: payload.description || '' + } + }) +} + +/** + * 删除报销单(仅草稿,软删除) + */ +export async function deleteExpense(id) { + await request({ url: `/api/oa/expense/delete/${id}`, method: 'DELETE' }) + return true +} + +/** + * 新增费用明细(仅草稿) + * item: { expenseType, expenseDate, amount, quantity, unitPrice, description, receipts: [{id,url,name}] } + */ +export async function addExpenseItem(reimbursementId, item) { + return request({ + url: `/api/oa/expense/item/add/${reimbursementId}`, + method: 'POST', + data: buildExpenseItemPayload(item) + }) +} + +/** + * 更新费用明细(仅草稿) + */ +export async function updateExpenseItem(reimbursementId, itemId, item) { + return request({ + url: `/api/oa/expense/item/update/${reimbursementId}/${itemId}`, + method: 'POST', + data: buildExpenseItemPayload(item) + }) +} + +/** + * 删除费用明细(仅草稿) + */ +export async function deleteExpenseItem(reimbursementId, itemId) { + await request({ + url: `/api/oa/expense/item/delete/${reimbursementId}/${itemId}`, + method: 'DELETE' + }) + return true +} + +/** + * 提交审批(仅草稿;需租户已配置启用的审批流程) + */ +export async function submitExpense(id) { + await request({ url: `/api/oa/expense/submit/${id}`, method: 'POST' }) + return true +} + +/** + * 手动确认更改单据状态(与 Web 端「手动确认」能力一致) + */ +export async function updateExpenseStatus(id, status) { + const res = await request({ + url: `/api/oa/expense/status/${id}`, + method: 'POST', + data: { status } + }) + return res?.status +} + +/** + * 审批记录(时间线) + */ +export async function fetchExpenseRecords(id) { + const rows = await request({ url: `/api/oa/expense/records/${id}` }) + return Array.isArray(rows) ? rows : [] +} + +/** + * 费用类型下拉(全局通用 + 本租户专有,仅启用) + */ +export async function fetchExpenseTypes() { + const rows = await request({ url: '/api/oa/expense/types' }) + return (Array.isArray(rows) ? rows : []).map(row => ({ + id: row.id, + name: row.name + })) +} + +/** + * 上传报销发票附件(multipart,图片或 PDF,单个 ≤10MB) + * 文件落入租户文件管理,返回 { id, url, name } 引用信息 + */ +export function uploadExpenseReceipt(filePath) { + return new Promise((resolve, reject) => { + uni.uploadFile({ + url: `${getBaseURL().replace(/\/$/, '')}/api/oa/expense/upload`, + filePath, + name: 'file', + header: { Authorization: `Bearer ${getToken()}` }, + success(res) { + let body = {} + try { + body = JSON.parse(res.data || '{}') + } catch (e) { + // 非 JSON 响应按失败处理 + } + if (res.statusCode >= 200 && res.statusCode < 300 && body.code === 200 && body.data) { + resolve(body.data) + } else { + const msg = body.msg || `上传失败(${res.statusCode})` + uni.showToast({ title: msg, icon: 'none' }) + reject(new Error(msg)) + } + }, + fail(err) { + uni.showToast({ title: '网络异常,上传失败', icon: 'none' }) + reject(err) + } + }) + }) +} + +/** 组装后端要求的费用明细请求体(发票只传文件 ID 列表,发票金额暂不在端上维护) */ +function buildExpenseItemPayload(item) { + const receipts = item.receipts || [] + return { + expense_type: item.expenseType, + expense_date: item.expenseDate, + amount: Number(item.amount) || 0, + quantity: Number(item.quantity) || 1, + unit_price: Number(item.unitPrice) || 0, + description: item.description || '', + receipt_flag: receipts.length > 0 ? 1 : 0, + receipt_file_ids: receipts.map(r => r.id).join(',') + } +} + +/** + * 图片地址兜底:后端可能返回相对路径(如 /uploads/...), + * 小程序 image 组件无法加载相对路径,统一拼上 baseURL。 + */ +export function resolveImageUrl(url) { + const value = String(url || '').trim() + if (!value) return '' + if (/^https?:\/\//i.test(value) || value.startsWith('data:')) return value + return `${getBaseURL().replace(/\/$/, '')}${value.startsWith('/') ? '' : '/'}${value}` +} + +/** + * 发票引用是否为 PDF 文件:PDF 不能用 image 组件渲染(会被 ORB 拦截不显示), + * 需要走 openDocument 打开。 + */ +export function isPdfReceipt(receipt) { + const target = `${receipt?.name || ''} ${receipt?.url || ''}`.toLowerCase() + return target.includes('.pdf') +} + +/** 归一化明细:日期取前 10 位,发票引用统一为 {id,url,name}(后端 receipt_files 元素为 file_id) */ +function normalizeExpenseItem(item) { + const receipts = (Array.isArray(item.receipt_files) ? item.receipt_files : []).map(img => ({ + id: img.file_id, + url: resolveImageUrl(img.url), + name: img.name || '' + })) + return { + ...item, + expense_date: String(item.expense_date || '').slice(0, 10), + receipts + } +} diff --git a/uniapp/api/oaSchedule.js b/uniapp/api/oaSchedule.js new file mode 100644 index 0000000..59c71a7 --- /dev/null +++ b/uniapp/api/oaSchedule.js @@ -0,0 +1,178 @@ +import { request } from '@/api/request.js' +import { getBaseURL } from '@/api/config.js' +import { getToken } from '@/utils/auth.js' + +/** + * OA 工作日程(日历待办)接口封装,对应后端 /api/oa/schedule/*。 + * 数据表 yz_backend_oa_schedule,与「日程提醒」(/api/schedule/*, + * yz_backend_schedule)是两个独立功能,不要混用。 + */ + +/** 优先级选项(与 Web 后台一致:0 普通 / 1 重要 / 2 紧急) */ +export const OA_SCHEDULE_PRIORITY_OPTIONS = [ + { value: 0, label: '普通' }, + { value: 1, label: '重要' }, + { value: 2, label: '紧急' } +] + +/** 归一化单条日程:补齐端上排序/分组用的时间戳与派生字段 */ +export function normalizeOaSchedule(item) { + const date = String(item.schedule_date || '').slice(0, 10) + const startTime = item.start_time || '' + // 拼一个 Date 时间戳便于日历分组与时间排序(全天事件按 00:00) + let timestamp = 0 + if (date) { + const [y, m, d] = date.split('-').map(Number) + const [hh = 0, mm = 0] = startTime ? startTime.split(':').map(Number) : [0, 0] + timestamp = new Date(y, m - 1, d, hh, mm).getTime() + } + return { + ...item, + schedule_date: date, + completed: item.status === 1, + allDay: item.all_day === 1, + timestamp + } +} + +/** + * 获取工作日程列表(支持日期区间 / 分类筛选) + * 返回 { list, total, counts },counts 为各分类数量角标 + */ +export async function fetchOaSchedules(params = {}) { + const data = await request({ + url: '/api/oa/schedule/list', + data: { + page: params.page || 1, + pageSize: params.pageSize || 500, + keyword: params.keyword || '', + status: params.status || '', + priority: params.priority || '', + start_date: params.startDate || '', + end_date: params.endDate || '', + category: params.category || 'all' + } + }) + const list = (data.list || []).map(normalizeOaSchedule) + return { list, total: data.total || 0, counts: data.counts || {} } +} + +/** + * 获取单条日程详情 + */ +export async function getOaSchedule(id) { + const data = await request({ url: `/api/oa/schedule/detail/${id}` }) + if (!data || !data.item) return null + return { ...normalizeOaSchedule(data.item), images: data.images || [] } +} + +/** + * 新建日程 + */ +export async function createOaSchedule(payload) { + return request({ + url: '/api/oa/schedule/create', + method: 'POST', + data: buildOaSchedulePayload(payload) + }) +} + +/** + * 更新日程 + */ +export async function updateOaSchedule(id, payload) { + return request({ + url: `/api/oa/schedule/update/${id}`, + method: 'POST', + data: buildOaSchedulePayload(payload) + }) +} + +/** + * 删除日程(软删除) + */ +export async function deleteOaSchedule(id) { + await request({ url: `/api/oa/schedule/delete/${id}`, method: 'DELETE' }) + return true +} + +/** + * 切换完成状态(待办 <-> 已完成) + */ +export async function toggleOaScheduleComplete(id) { + const res = await request({ url: `/api/oa/schedule/finish/${id}`, method: 'POST' }) + return { status: res?.status ?? 0, completed: res?.status === 1 } +} + +/** + * 上传日程资料图片(multipart,单张 ≤10MB) + * 文件落入租户文件管理,返回 { id, url, name } 引用信息 + */ +export function uploadOaScheduleImage(filePath) { + return new Promise((resolve, reject) => { + uni.uploadFile({ + url: `${getBaseURL().replace(/\/$/, '')}/api/oa/schedule/upload`, + filePath, + name: 'file', + header: { Authorization: `Bearer ${getToken()}` }, + success(res) { + let body = {} + try { + body = JSON.parse(res.data || '{}') + } catch (e) { + // 非 JSON 响应按失败处理 + } + if (res.statusCode >= 200 && res.statusCode < 300 && body.code === 200 && body.data) { + resolve(body.data) + } else { + const msg = body.msg || `上传失败(${res.statusCode})` + uni.showToast({ title: msg, icon: 'none' }) + reject(new Error(msg)) + } + }, + fail(err) { + uni.showToast({ title: '网络异常,上传失败', icon: 'none' }) + reject(err) + } + }) + }) +} + +/** + * 保存日程资料图片引用列表(整体覆盖) + */ +export async function setOaScheduleImages(id, images) { + const res = await request({ + url: `/api/oa/schedule/images/${id}`, + method: 'POST', + data: { + images: (images || []).map(img => ({ + id: Number(img.id) || 0, + url: img.url, + name: img.name || '' + })) + } + }) + return res?.images || [] +} + +/** 组装后端要求的请求体(提醒绑定暂不在小程序端开放) */ +function buildOaSchedulePayload(p) { + return { + title: p.title, + content: p.content || '', + schedule_date: p.scheduleDate, + start_time: p.allDay ? '' : p.startTime || '', + end_time: p.allDay ? '' : p.endTime || '', + all_day: p.allDay ? 1 : 0, + priority: p.priority || 0, + color: p.color || '#409EFF', + reminder_enabled: false + } +} + +export function getOaPriorityLabel(priority) { + return ( + OA_SCHEDULE_PRIORITY_OPTIONS.find(item => item.value === Number(priority))?.label || '普通' + ) +} diff --git a/uniapp/components/sub/SubHome.vue b/uniapp/components/sub/SubHome.vue index ab70146..5af5b4b 100644 --- a/uniapp/components/sub/SubHome.vue +++ b/uniapp/components/sub/SubHome.vue @@ -37,15 +37,19 @@ - + + + - + + {{ leafMenus.length }} @@ -120,44 +124,58 @@ {{ item.publish_time || item.publisher_name || '' }} + + + + + + + + + + + + 常用功能 + + + 全部 + + + + + + + + + + {{ item.title }} + + + + + + + + + 添加 + + - - - - 常用功能 - - 全部 - - - - - - - - - - - {{ item.title }} - - - - - - - - - 添加 - - - - + + @@ -489,8 +507,11 @@ onShow(() => { padding: 28rpx $page-padding-x 0; } -.block + .block { - margin-top: 32rpx; +/* 首页卡片流:统一纵向间距(跨组件 margin 不折叠,故用 flex gap) */ +.home-stack { + display: flex; + flex-direction: column; + gap: 24rpx; } .block-head { @@ -517,7 +538,6 @@ onShow(() => { @include card; display: flex; padding: 30rpx 0; - margin-bottom: 32rpx; } .kpi-item { @@ -634,9 +654,39 @@ onShow(() => { /* ============ 常用功能宫格:一行 4 个 ============ cell 占 25% 宽并自带右侧间隙,容器用负 margin 抵消末列间隙, 避免使用 calc 除法——小程序端 wxss 对复杂 calc 支持不稳。 */ +/* 与 SubOaDashboard 的 dash-card 保持同一视觉语言 */ .quick-card { @include card; - padding: 24rpx 20rpx 8rpx; + padding: 26rpx 24rpx 10rpx; +} + +.quick-head { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 22rpx; +} + +.quick-head-left { + display: flex; + align-items: center; + gap: 12rpx; +} + +.head-icon { + width: 40rpx; + height: 40rpx; + border-radius: 12rpx; + background: #fff7e6; + display: flex; + align-items: center; + justify-content: center; +} + +.quick-title { + font-size: 28rpx; + font-weight: 600; + color: $color-text; } .grid { @@ -656,7 +706,7 @@ onShow(() => { height: 100%; padding: 18rpx 6rpx 16rpx; border-radius: $radius-md; - background: $color-bg-page; + background: transparent; display: flex; flex-direction: column; align-items: center; diff --git a/uniapp/components/sub/SubOaDashboard.vue b/uniapp/components/sub/SubOaDashboard.vue index a964e5a..8b58725 100644 --- a/uniapp/components/sub/SubOaDashboard.vue +++ b/uniapp/components/sub/SubOaDashboard.vue @@ -1,157 +1,150 @@ @@ -160,7 +153,9 @@ import { computed } from 'vue' import FaIcon from '@/components/FaIcon.vue' const props = defineProps({ - data: { type: Object, default: () => ({}) } + data: { type: Object, default: () => ({}) }, + // top:公告 + 数据统计;bottom:报销趋势 + 状态分布(中间由首页插入「常用功能」) + part: { type: String, default: 'top' } }) const emit = defineEmits(['view-notices', 'view-schedules']) @@ -205,19 +200,8 @@ const statusList = computed(() => { .map((x) => ({ ...x, pct: Math.round((num(x.count) / total) * 100) + '%' })) }) -// ---------- 报销类型分析 ---------- -const expenseTypes = computed(() => rb.value.expense_types || []) -const expenseTypesTop = computed(() => expenseTypes.value.slice(0, 6)) -const expMax = computed(() => { - let m = 1 - expenseTypes.value.forEach((e) => { m = Math.max(m, num(e.amount)) }) - return m -}) -const typePct = (a) => Math.round((num(a) / expMax.value) * 100) + '%' - -// ---------- 公告 / 日程 ---------- +// ---------- 公告 ---------- const notices = computed(() => props.data?.notices || []) -const todaySchedules = computed(() => props.data?.today_schedules || []) const noticeTypeLabel = (type) => ({ 1: '公告', 2: '活动' }[type] || '通知') @@ -234,12 +218,6 @@ function noticeTime(ts) { return `${d.getFullYear()}-${d.getMonth() + 1}-${d.getDate()}` } -function schedTime(s) { - if (s.all_day === 1) return '全天' - if (s.end_time) return `${s.start_time || ''} - ${s.end_time}` - return s.start_time || '时间待定' -} - const money = (value) => Number(value || 0).toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) @@ -251,7 +229,6 @@ const money = (value) => display: flex; flex-direction: column; gap: 24rpx; - margin-bottom: 32rpx; } .dash-card { @@ -266,6 +243,30 @@ const money = (value) => margin-bottom: 22rpx; } +.dash-head-left { + display: flex; + align-items: center; + gap: 12rpx; +} + +.head-icon { + width: 40rpx; + height: 40rpx; + border-radius: 12rpx; + display: flex; + align-items: center; + justify-content: center; + + &.hi-notice, + &.hi-stat { + background: $color-primary-bg; + } + + &.hi-trend { + background: #f3f0ff; + } +} + .dash-title { font-size: 28rpx; font-weight: 600; @@ -304,90 +305,95 @@ const money = (value) => color: $color-text-muted; } -/* ============ 待办概览 ============ */ -.todo-row { +/* ============ 数据统计:待办 / 报销 双磁贴 ============ */ +.stat-tile { + padding: 20rpx 20rpx 8rpx; + border-radius: $radius-md; + background: $color-bg-page; + + & + & { + margin-top: 18rpx; + } + + &:active { + opacity: 0.85; + } +} + +.stat-tile-head { + display: flex; + align-items: center; + gap: 10rpx; + margin-bottom: 8rpx; +} + +.tile-icon { + width: 36rpx; + height: 36rpx; + border-radius: 10rpx; + display: flex; + align-items: center; + justify-content: center; + + &.ti-todo { + background: $color-primary-bg; + } + + &.ti-money { + background: #ecfdf5; + } +} + +.tile-name { + flex: 1; + font-size: 24rpx; + font-weight: 600; + color: $color-text-secondary; +} + +.stat-row { display: flex; } -.todo-cell { +.stat-cell { flex: 1; display: flex; flex-direction: column; align-items: center; - gap: 6rpx; - position: relative; - - & + &::before { - content: ''; - position: absolute; - left: 0; - top: 8rpx; - bottom: 8rpx; - width: 1rpx; - background: $color-divider; - } + gap: 4rpx; + padding-bottom: 12rpx; } -.todo-value { - font-size: 44rpx; - font-weight: 600; - line-height: 1.1; - color: $color-primary; -} - -.todo-label { - font-size: 24rpx; - color: $color-text; -} - -.todo-sub { - font-size: 20rpx; - color: $color-text-muted; -} - -/* ============ 报销统计 ============ */ -.money-row { - display: flex; - gap: 16rpx; -} - -.money-cell { - flex: 1; - padding: 20rpx 16rpx; - border-radius: $radius-md; - background: $color-bg-page; - display: flex; - flex-direction: column; - gap: 8rpx; -} - -.money-label { - font-size: 22rpx; - color: $color-text-muted; -} - -.money-amount { +.stat-amount { display: flex; align-items: baseline; +} - .currency { - font-size: 22rpx; - color: $color-text; - margin-right: 4rpx; - } +.stat-currency { + font-size: 20rpx; + color: $color-text; + margin-right: 2rpx; +} - .number { - font-size: 34rpx; - font-weight: 600; - color: $color-text; +.stat-value { + font-size: 34rpx; + font-weight: 600; + line-height: 1.15; + color: $color-text; + + &.primary { + color: $color-primary; } } -.money-meta { - font-size: 20rpx; +.stat-label { + font-size: 22rpx; + color: $color-text-secondary; +} + +.stat-sub { + font-size: 18rpx; color: $color-text-muted; - overflow: hidden; - text-overflow: ellipsis; white-space: nowrap; } @@ -464,9 +470,22 @@ const money = (value) => color: $color-text-muted; } -/* ============ 分布 / 类型 进度条 ============ */ -.dist-row, -.type-row { +/* ============ 状态分布 ============ */ +.status-block { + margin-top: 26rpx; + padding-top: 22rpx; + border-top: 1rpx solid $color-divider; +} + +.status-title { + display: block; + margin-bottom: 16rpx; + font-size: 24rpx; + font-weight: 600; + color: $color-text-secondary; +} + +.dist-row { display: flex; align-items: center; gap: 14rpx; @@ -482,18 +501,7 @@ const money = (value) => font-size: 22rpx; } -.type-name { - width: 140rpx; - flex-shrink: 0; - font-size: 22rpx; - color: $color-text-secondary; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.dist-bar-wrap, -.type-bar-wrap { +.dist-bar-wrap { flex: 1; height: 14rpx; background: $color-divider; @@ -501,35 +509,29 @@ const money = (value) => overflow: hidden; } -.dist-bar, -.type-bar { +.dist-bar { height: 100%; border-radius: $radius-full; transition: width 0.3s ease; } -.type-bar { - background: linear-gradient(90deg, $color-primary, $color-primary-light); -} - -.dist-count, -.type-amount { +.dist-count { flex-shrink: 0; font-size: 20rpx; color: $color-text-muted; white-space: nowrap; } -/* ============ 公告 ============ */ -.notice-item { +/* ============ 公告(单行垂直轮播) ============ */ +.notice-swiper { + height: 68rpx; +} + +.notice-line { display: flex; align-items: center; gap: 12rpx; - padding: 18rpx 0; - - & + & { - border-top: 1rpx solid $color-divider; - } + height: 68rpx; &:active { opacity: 0.6; @@ -579,78 +581,4 @@ const money = (value) => font-size: 20rpx; color: $color-text-muted; } - -/* ============ 日程 ============ */ -.sched-item { - display: flex; - align-items: flex-start; - gap: 14rpx; - padding: 18rpx 0; - - & + & { - border-top: 1rpx solid $color-divider; - } - - &.done { - opacity: 0.6; - } -} - -.sched-dot { - width: 14rpx; - height: 14rpx; - margin-top: 12rpx; - border-radius: 50%; - flex-shrink: 0; -} - -.sched-main { - flex: 1; - min-width: 0; -} - -.sched-title-row { - display: flex; - align-items: center; - gap: 10rpx; -} - -.sched-title { - flex: 1; - min-width: 0; - font-size: 26rpx; - color: $color-text; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - - &.done { - text-decoration: line-through; - color: $color-text-muted; - } -} - -.sched-priority { - flex-shrink: 0; - font-size: 18rpx; - padding: 2rpx 10rpx; - border-radius: $radius-sm; - - &.p-important { - background: #fffbeb; - color: $color-warning; - } - - &.p-urgent { - background: #fef3f2; - color: $color-danger; - } -} - -.sched-time { - display: block; - margin-top: 6rpx; - font-size: 22rpx; - color: $color-text-muted; -} diff --git a/uniapp/package-lock.json b/uniapp/package-lock.json index 1eb289c..6f19a2d 100644 --- a/uniapp/package-lock.json +++ b/uniapp/package-lock.json @@ -112,15 +112,6 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { "version": "7.29.8", "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.29.8.tgz", @@ -138,9 +129,9 @@ } }, "node_modules/@babel/generator/node_modules/@babel/parser": { - "version": "7.29.8", - "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.8.tgz", - "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "version": "7.29.9", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.9.tgz", + "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==", "license": "MIT", "dependencies": { "@babel/types": "^7.29.8" @@ -208,15 +199,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.29.7", "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", @@ -239,25 +221,15 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz", - "integrity": "sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==", + "version": "7.29.10", + "resolved": "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.10.tgz", + "integrity": "sha512-/YY9soQuWa8TURtHXHT+GbklpbAA+dZErxFGHIr6qgDg96xuGWrTAs1+MfjgVJPF0YLQsOVsOYs8lhgsPbOinQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.29.7", - "regexpu-core": "^6.3.1", + "regexpu-core": "^6.5.3", "semver": "^6.3.1" }, "engines": { @@ -267,16 +239,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-define-polyfill-provider": { "version": "0.6.8", "resolved": "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", @@ -313,14 +275,14 @@ } }, "node_modules/@babel/helper-define-polyfill-provider/node_modules/resolve": { - "version": "1.22.12", - "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.12.tgz", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "version": "1.22.13", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.13.tgz", + "integrity": "sha512-Dj/cW9zBV2aRj6XzCxuGIs3ESZKv02jixne3q6jFZYZ3/Tg09gHHviSMDL4kObh9pqSahdRHEnDoaP2gn8YLhA==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", + "is-core-module": "^2.17.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -572,13 +534,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.29.7.tgz", - "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "version": "7.29.10", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.29.10.tgz", + "integrity": "sha512-EMCx3AGZ3WfAl6ht7AyQoPm2Lh+BGYEMdc4Q6Hf7uSCDOZFuLq44qNwL+iaim8VlyYhRAo4X43+weadK8ZB4Yg==", "license": "MIT", "dependencies": { "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7" + "@babel/types": "^7.29.8" }, "engines": { "node": ">=6.9.0" @@ -1816,9 +1778,9 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", - "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==", + "version": "7.29.9", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.9.tgz", + "integrity": "sha512-FFwIwzU+7SCOuxxV4YtJql6T9981ZVTm+FHO5GhVsRqCTdy0WwrEZh3l42ARpXruJUDGOptdduHW6Zr7pNPLNg==", "dev": true, "license": "MIT", "dependencies": { @@ -1988,16 +1950,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/preset-modules": { "version": "0.1.6-no-external-plugins", "resolved": "https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", @@ -2014,18 +1966,18 @@ } }, "node_modules/@babel/runtime": { - "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.29.7.tgz", - "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", + "version": "7.29.10", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.29.10.tgz", + "integrity": "sha512-NpugTzbKgGrNe45Ui32cN8vCFFMxVtP/9rtfwv0nP5FRDAjvYBxJcLVpYA9mr1jxP6cnIT7x9LUzuDTbWYYNRA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.29.7", - "resolved": "https://registry.npmmirror.com/@babel/runtime-corejs3/-/runtime-corejs3-7.29.7.tgz", - "integrity": "sha512-ppj9ouYku+RX0ljtgZd+KMO5mkM2bCqg8H2PYAFWnLsHEIKIdRojqbJ2i3eVHrisuxy7nOFCmngTDdWtUCdXUQ==", + "version": "7.29.10", + "resolved": "https://registry.npmmirror.com/@babel/runtime-corejs3/-/runtime-corejs3-7.29.10.tgz", + "integrity": "sha512-R4FKrg4Vy0hB7PfAxf9LOorEPd5/36SCIXPXAvjlQaQmPvtrjwoDXV15jsSm2ecsqBW1Iewwb7mEnG83xIEApg==", "license": "MIT", "dependencies": { "core-js-pure": "^3.48.0" @@ -2063,9 +2015,9 @@ } }, "node_modules/@babel/template/node_modules/@babel/parser": { - "version": "7.29.8", - "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.8.tgz", - "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "version": "7.29.9", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.9.tgz", + "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==", "license": "MIT", "dependencies": { "@babel/types": "^7.29.8" @@ -2090,16 +2042,22 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/template/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, "node_modules/@babel/traverse": { - "version": "7.29.8", - "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.29.8.tgz", - "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "version": "7.29.10", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.29.10.tgz", + "integrity": "sha512-B3lYAs2nkKskbgQ1nfy8Ma9ao9Q1rntTAQHrzzyDuj+TSO+X3le6PfWwqDvodsb+OumE10eMFfuMCTQSQ5iuIQ==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.8", "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.8", + "@babel/parser": "^7.29.9", "@babel/template": "^7.29.7", "@babel/types": "^7.29.8", "debug": "^4.3.1" @@ -2123,9 +2081,9 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/parser": { - "version": "7.29.8", - "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.8.tgz", - "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "version": "7.29.9", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.9.tgz", + "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==", "license": "MIT", "dependencies": { "@babel/types": "^7.29.8" @@ -2150,6 +2108,12 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, "node_modules/@babel/types": { "version": "7.25.6", "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.25.6.tgz", @@ -2258,18 +2222,6 @@ "unimport": "4.1.1" } }, - "node_modules/@dcloudio/uni-app-uts/node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "license": "MIT" - }, - "node_modules/@dcloudio/uni-app-uts/node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "license": "ISC" - }, "node_modules/@dcloudio/uni-app-vite": { "version": "3.0.0-5020420260813002", "resolved": "https://registry.npmmirror.com/@dcloudio/uni-app-vite/-/uni-app-vite-3.0.0-5020420260813002.tgz", @@ -2289,12 +2241,6 @@ "picocolors": "1.1.0" } }, - "node_modules/@dcloudio/uni-app-vite/node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "license": "ISC" - }, "node_modules/@dcloudio/uni-app-vue": { "version": "3.0.0-5020420260813002", "resolved": "https://registry.npmmirror.com/@dcloudio/uni-app-vue/-/uni-app-vue-3.0.0-5020420260813002.tgz", @@ -2388,22 +2334,10 @@ "node": "^14.18.0 || >=16.0.0" } }, - "node_modules/@dcloudio/uni-cli-shared/node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "license": "MIT" - }, - "node_modules/@dcloudio/uni-cli-shared/node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "license": "ISC" - }, "node_modules/@dcloudio/uni-cli-shared/node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "version": "4.0.7", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "license": "MIT", "engines": { "node": ">=12" @@ -2787,6 +2721,12 @@ "tinycolor2": "1.6.0" } }, + "node_modules/@dcloudio/uni-nvue-styler/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, "node_modules/@dcloudio/uni-nvue-styler/node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz", @@ -2911,24 +2851,10 @@ "vite": "5.2.8" } }, - "node_modules/@dcloudio/vite-plugin-uni/node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@dcloudio/vite-plugin-uni/node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "dev": true, - "license": "ISC" - }, "node_modules/@dcloudio/vite-plugin-uni/node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "version": "4.0.7", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, "license": "MIT", "engines": { @@ -3350,9 +3276,9 @@ } }, "node_modules/@fortawesome/fontawesome-free": { - "version": "7.3.0", - "resolved": "https://registry.npmmirror.com/@fortawesome/fontawesome-free/-/fontawesome-free-7.3.0.tgz", - "integrity": "sha512-Yw4Qa43P6e4Xwh0TwEUkHQNRJInWaqIBo73VJmns3j2AIlZPAvUcR4yGIxCPqPRCgyJ5KIVIalF/I1GxhZ/Kgw==", + "version": "7.3.1", + "resolved": "https://registry.npmmirror.com/@fortawesome/fontawesome-free/-/fontawesome-free-7.3.1.tgz", + "integrity": "sha512-wmglKKPDIkgV3aWlZzWECCPoGIkYCulzBwxG9+w7rc5BGapZ6cPMpoPOT8k36J0Ni7PPX6c/rsoMWfS4d1MUMg==", "license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)", "engines": { "node": ">=6" @@ -3530,6 +3456,39 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/@jest/console/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/console/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@jest/console/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/console/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", @@ -3593,17 +3552,6 @@ } } }, - "node_modules/@jest/core/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@jest/core/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -3639,16 +3587,35 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/core/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/@jest/core/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "ansi-regex": "^5.0.1" + "color-name": "~1.1.4" }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/core/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@jest/core/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -3800,6 +3767,39 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/@jest/reporters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@jest/reporters/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/reporters/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", @@ -3927,6 +3927,28 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/@jest/transform/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/transform/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/@jest/transform/node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -3935,6 +3957,17 @@ "license": "MIT", "peer": true }, + "node_modules/@jest/transform/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/transform/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", @@ -4002,6 +4035,39 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/@jest/types/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/types/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@jest/types/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/types/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", @@ -4545,9 +4611,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { @@ -4601,6 +4667,312 @@ "node": ">= 8" } }, + "node_modules/@parcel/watcher": { + "version": "2.6.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.6.0.tgz", + "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.6.0", + "@parcel/watcher-darwin-arm64": "2.6.0", + "@parcel/watcher-darwin-x64": "2.6.0", + "@parcel/watcher-freebsd-x64": "2.6.0", + "@parcel/watcher-linux-arm-glibc": "2.6.0", + "@parcel/watcher-linux-arm-musl": "2.6.0", + "@parcel/watcher-linux-arm64-glibc": "2.6.0", + "@parcel/watcher-linux-arm64-musl": "2.6.0", + "@parcel/watcher-linux-x64-glibc": "2.6.0", + "@parcel/watcher-linux-x64-musl": "2.6.0", + "@parcel/watcher-win32-arm64": "2.6.0", + "@parcel/watcher-win32-x64": "2.6.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz", + "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz", + "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz", + "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz", + "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz", + "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz", + "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==", + "cpu": [ + "arm" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz", + "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz", + "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz", + "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz", + "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz", + "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz", + "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@rollup/pluginutils": { "version": "5.1.0", "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", @@ -4708,6 +5080,9 @@ "cpu": [ "arm64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4721,6 +5096,9 @@ "cpu": [ "arm64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -4734,6 +5112,9 @@ "cpu": [ "ppc64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4747,6 +5128,9 @@ "cpu": [ "riscv64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4760,6 +5144,9 @@ "cpu": [ "s390x" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4773,6 +5160,9 @@ "cpu": [ "x64" ], + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -4786,6 +5176,9 @@ "cpu": [ "x64" ], + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -4983,14 +5376,14 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "26.1.1", - "resolved": "https://registry.npmmirror.com/@types/node/-/node-26.1.1.tgz", - "integrity": "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==", + "version": "26.6.5", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-26.6.5.tgz", + "integrity": "sha512-uMzsv9stDdofIZBx4UGh4Z9ZgXnGC9seRDscilBcTHAeOFk67MZg/k9bWVfO+bk4qZmG+l52hRnLwUiH2LnJTg==", "devOptional": true, "license": "MIT", "peer": true, "dependencies": { - "undici-types": "~8.3.0" + "undici-types": "~8.9.0" } }, "node_modules/@types/prettier": { @@ -5147,9 +5540,9 @@ } }, "node_modules/@vue/babel-plugin-jsx/node_modules/@vue/shared": { - "version": "3.5.41", - "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.41.tgz", - "integrity": "sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==", + "version": "3.5.43", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.43.tgz", + "integrity": "sha512-uksS7YGMR5NZyr4JNq0Rp+QyLns0ueaz20KwzIPW9R0LH1Vnt4E+XUM29PNseEbf1www2gOuhuDi5AKOIXag9Q==", "dev": true, "license": "MIT" }, @@ -5189,9 +5582,9 @@ } }, "node_modules/@vue/babel-plugin-resolve-type/node_modules/@babel/parser": { - "version": "7.29.8", - "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.8.tgz", - "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "version": "7.29.9", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.9.tgz", + "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==", "dev": true, "license": "MIT", "dependencies": { @@ -5219,63 +5612,63 @@ } }, "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-core": { - "version": "3.5.41", - "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.41.tgz", - "integrity": "sha512-q0Xtv/F9w2YO/7htQhtiL+Ev2WCJbe5N2hc+XfgyKkEKqWpSxknmT8QOuGdEKNdjPq0c3F7rNpFkTo3Kfrm7pg==", + "version": "3.5.43", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.43.tgz", + "integrity": "sha512-zdiLhnbe1QQqgDT8xZMpNmyqZ3qlI+/Q/FHQco57Kwl/b05HhCzN6eVGN9QU9rbga4CrS0H5SYY8VGHZCt/1Hg==", "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.29.8", - "@vue/shared": "3.5.41", + "@vue/shared": "3.5.43", "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-dom": { - "version": "3.5.41", - "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.41.tgz", - "integrity": "sha512-oKacVfNglLvGjnS6BXOlGL7EyG2h8X03pqXCjzotRZUaXGjbrTJUnVAQjrCqUnS+lyu31nwQjZY/d817GmCnfw==", + "version": "3.5.43", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.43.tgz", + "integrity": "sha512-PEZoAk3NQmsn/ejMzSOCyTYqwGqczrWm70PuhBKjjv1+TCoQAaO/zOqNwjV+honlNstT5ILxtc+8r8UUfj+iEQ==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.41", - "@vue/shared": "3.5.41" + "@vue/compiler-core": "3.5.43", + "@vue/shared": "3.5.43" } }, "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-sfc": { - "version": "3.5.41", - "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.41.tgz", - "integrity": "sha512-XJhip7R2wy6vX3knCxdZN4KracFaZUef58s1KYewqluedHIJaPIVfXoYT7MF1F8nCvv6k8bWWxDC8opMkg1VTQ==", + "version": "3.5.43", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.43.tgz", + "integrity": "sha512-FCbrG3XNCRl+js3huuKx4IVHBLTvMkJhVepjbxSPu1gn4yWLaYtGNQdjJGZaMytXB6qb76qQDDmDSLy/vkmleQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.29.8", - "@vue/compiler-core": "3.5.41", - "@vue/compiler-dom": "3.5.41", - "@vue/compiler-ssr": "3.5.41", - "@vue/shared": "3.5.41", + "@vue/compiler-core": "3.5.43", + "@vue/compiler-dom": "3.5.43", + "@vue/compiler-ssr": "3.5.43", + "@vue/shared": "3.5.43", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", - "postcss": "^8.5.19", + "postcss": "^8.5.28", "source-map-js": "^1.2.1" } }, "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/compiler-ssr": { - "version": "3.5.41", - "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.41.tgz", - "integrity": "sha512-U3v5OejKEGqOI0Wy0+Sz7hGuIFZHA4LSXzrNM3IMIeDyJEBBfTpX26n3SDgToRpP2bLc9FfI2j/kSgcJ8Emq5A==", + "version": "3.5.43", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.43.tgz", + "integrity": "sha512-GF62orf7KiJX9RqrHNGrYBudsQGD0OhJ5nDs90O8UiDuS40+YMYomiXu6w6EuvtXuRDc3MSNis3EaaSKAVSWpg==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.41", - "@vue/shared": "3.5.41" + "@vue/compiler-dom": "3.5.43", + "@vue/shared": "3.5.43" } }, "node_modules/@vue/babel-plugin-resolve-type/node_modules/@vue/shared": { - "version": "3.5.41", - "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.41.tgz", - "integrity": "sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==", + "version": "3.5.43", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.43.tgz", + "integrity": "sha512-uksS7YGMR5NZyr4JNq0Rp+QyLns0ueaz20KwzIPW9R0LH1Vnt4E+XUM29PNseEbf1www2gOuhuDi5AKOIXag9Q==", "dev": true, "license": "MIT" }, @@ -5289,6 +5682,13 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/@vue/babel-plugin-resolve-type/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, "node_modules/@vue/compiler-core": { "version": "3.4.21", "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.4.21.tgz", @@ -5367,37 +5767,37 @@ "license": "MIT" }, "node_modules/@vue/reactivity": { - "version": "3.5.41", - "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.41.tgz", - "integrity": "sha512-rznsqKM0np0x18EjzF8x88MpEhdNsffbvFbckLL5+oUKz1BxAImEmO7J1ArRYSyo6aQaVoBDp7jEkT91OOxydA==", + "version": "3.5.43", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.43.tgz", + "integrity": "sha512-G/c9GyOZNI2jVaaS6OX1EF1SSFSv7H0ERqNTl4+DTFMlZmB5eVAB53aLQNam/7NL2NPtaDD7RdVrzf8uJzMuOA==", "dev": true, "license": "MIT", "dependencies": { - "@vue/shared": "3.5.41" + "@vue/shared": "3.5.43" } }, "node_modules/@vue/reactivity/node_modules/@vue/shared": { - "version": "3.5.41", - "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.41.tgz", - "integrity": "sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==", + "version": "3.5.43", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.43.tgz", + "integrity": "sha512-uksS7YGMR5NZyr4JNq0Rp+QyLns0ueaz20KwzIPW9R0LH1Vnt4E+XUM29PNseEbf1www2gOuhuDi5AKOIXag9Q==", "dev": true, "license": "MIT" }, "node_modules/@vue/runtime-core": { - "version": "3.5.41", - "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.41.tgz", - "integrity": "sha512-Vcry58hiAKwGen9Z1jUZE0feFsNArPCMOImYI8el48A9Idf6DuQYD0U05zZIF2Iad1hGhPSvcbBbAOhNr55fhg==", + "version": "3.5.43", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.43.tgz", + "integrity": "sha512-hU6U6VnVhBGQDpvlnnDlIB8ZGJBiOcgk2lh/0InltHiz3D8oSkluvuvY+do1G2H3+udeKFsmaBlgVYP7gXQzEw==", "dev": true, "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.41", - "@vue/shared": "3.5.41" + "@vue/reactivity": "3.5.43", + "@vue/shared": "3.5.43" } }, "node_modules/@vue/runtime-core/node_modules/@vue/shared": { - "version": "3.5.41", - "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.41.tgz", - "integrity": "sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==", + "version": "3.5.43", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.43.tgz", + "integrity": "sha512-uksS7YGMR5NZyr4JNq0Rp+QyLns0ueaz20KwzIPW9R0LH1Vnt4E+XUM29PNseEbf1www2gOuhuDi5AKOIXag9Q==", "dev": true, "license": "MIT" }, @@ -5666,9 +6066,9 @@ } }, "node_modules/acorn": { - "version": "8.17.0", - "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.17.0.tgz", - "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "version": "8.19.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.19.0.tgz", + "integrity": "sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -5703,20 +6103,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "acorn": "^8.14.0" - } - }, "node_modules/acorn-walk": { "version": "7.2.0", "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-7.2.0.tgz", @@ -5779,9 +6165,9 @@ } }, "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, "license": "MIT", "peer": true, @@ -5851,29 +6237,26 @@ } }, "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">=8" } }, "node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "color-convert": "^1.9.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": ">=4" } }, "node_modules/any-base": { @@ -6017,6 +6400,39 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/babel-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/babel-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/babel-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/babel-jest/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", @@ -6081,16 +6497,6 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.14.2", "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", @@ -6202,9 +6608,9 @@ } }, "node_modules/baseline-browser-mapping": { - "version": "2.11.14", - "resolved": "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.11.14.tgz", - "integrity": "sha512-JyJ954WzuIR8/FFzX0o5krdSTrBAkcCSRfWSleRsIHSWV+cZe2FI1PKggVkFke1hBldRs+LRxUczzE9iPmgZww==", + "version": "2.11.28", + "resolved": "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.11.28.tgz", + "integrity": "sha512-br0LOmjJqr6Rt4AEkadbcNf67Zpo7EPwKsWbjnRrJIa1QYFHQBqM4C7F2WTbV8ahTEcg1Eo+Y0aWjjORInYFyA==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.cjs" @@ -6300,9 +6706,9 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "version": "1.1.21", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, "license": "MIT", "peer": true, @@ -6332,9 +6738,9 @@ "peer": true }, "node_modules/browserslist": { - "version": "4.28.8", - "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.28.8.tgz", - "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "version": "4.29.3", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.29.3.tgz", + "integrity": "sha512-1R4kiYKXGViqEN0CnoDrXc1StD9niAwu+j2dukWzrD4bJgsD4lDmEp0CRbc6E/vYJIfTHwPmwyaKtVSudICdPA==", "funding": [ { "type": "opencollective", @@ -6351,11 +6757,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.11.12", - "caniuse-lite": "^1.0.30001809", - "electron-to-chromium": "^1.5.402", - "node-releases": "^2.0.53", - "update-browserslist-db": "^1.3.0" + "baseline-browser-mapping": "^2.11.26", + "caniuse-lite": "^1.0.30001813", + "electron-to-chromium": "^1.5.439", + "node-releases": "^2.0.57", + "update-browserslist-db": "^1.3.3" }, "bin": { "browserslist": "cli.js" @@ -6384,11 +6790,11 @@ } }, "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/bser/-/bser-2.1.2.tgz", + "integrity": "sha512-V2o8YS2EhrKMO9AumnkK0ynynfFlsajpYupwq7S46H5mhcanwxDkNTw3K67wPIcKTH1ffkA4vhMOtAc7gRmPZw==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "peer": true, "dependencies": { "node-int64": "^0.4.0" @@ -6435,9 +6841,9 @@ "license": "MIT" }, "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/bundle-name/-/bundle-name-4.1.1.tgz", + "integrity": "sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==", "dev": true, "license": "MIT", "dependencies": { @@ -6524,9 +6930,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001809", - "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", - "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==", + "version": "1.0.30001815", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001815.tgz", + "integrity": "sha512-uDybUEyfgbyJJ93J1vikTylBX31AkdVYeVPeffMQpf8XN7hSfr0oZOn4VFOIMNvtU5+rHvC5Udg2TgtJKHm23Q==", "funding": [ { "type": "opencollective", @@ -6566,54 +6972,6 @@ "node": ">=4" } }, - "node_modules/chalk/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/chalk/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/chalk/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/char-regex/-/char-regex-1.0.2.tgz", @@ -6697,18 +7055,16 @@ } }, "node_modules/cliui": { - "version": "9.0.1", - "resolved": "https://registry.npmmirror.com/cliui/-/cliui-9.0.1.tgz", - "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "version": "7.0.4", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=20" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, "node_modules/co": { @@ -6732,26 +7088,19 @@ "peer": true }, "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "license": "MIT", - "peer": true, "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "color-name": "1.1.3" } }, "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT", - "peer": true + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -7020,9 +7369,9 @@ } }, "node_modules/dayjs": { - "version": "1.11.21", - "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.21.tgz", - "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==", + "version": "1.11.23", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.23.tgz", + "integrity": "sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==", "license": "MIT" }, "node_modules/debug": { @@ -7070,9 +7419,9 @@ } }, "node_modules/default-browser": { - "version": "5.5.0", - "resolved": "https://registry.npmmirror.com/default-browser/-/default-browser-5.5.0.tgz", - "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "version": "5.5.1", + "resolved": "https://registry.npmmirror.com/default-browser/-/default-browser-5.5.1.tgz", + "integrity": "sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==", "dev": true, "license": "MIT", "dependencies": { @@ -7163,6 +7512,16 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmmirror.com/detect-newline/-/detect-newline-3.1.0.tgz", @@ -7239,9 +7598,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.407", - "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.407.tgz", - "integrity": "sha512-4R8XgQOdfxexCd/u63lRm6wCHjECwI45MV9wxAs2ggtfWe2hwlo1ql97jKsju2IcJ+jFSTwBssyYoiWhh7mauQ==", + "version": "1.5.452", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.452.tgz", + "integrity": "sha512-cVvk1YBSj6571VmV6hdJTqj94Y79xSu8cj6Y9t6ae4Y4431z8/7EJFvu3rVp90xhfuv9BpPKUmaLfTo4+FOGBg==", "license": "ISC" }, "node_modules/emittery": { @@ -7259,11 +7618,12 @@ } }, "node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/emojis-list": { "version": "3.0.0", @@ -7286,9 +7646,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.24.2", - "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.24.2.tgz", - "integrity": "sha512-rpsZEGT1jFuve6QlpyRp9ckQ+kN61hvF9BzCPyMdaKTm8UJce96KBn3sorXOFXlzjPrs3Vc4T1NsSroZ3PxlFw==", + "version": "5.26.0", + "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.26.0.tgz", + "integrity": "sha512-9vhedylFonb2YGogzUKX6+Ja72gOJbN1QHAqdrvqLwhdl/QWbKopzoUC9EbQNVsAns/bx/4uyqalrQAoy1IByw==", "dev": true, "license": "MIT", "peer": true, @@ -7344,12 +7704,10 @@ } }, "node_modules/es-module-lexer": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-2.3.1.tgz", - "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", - "dev": true, - "license": "MIT", - "peer": true + "version": "1.5.4", + "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.2", @@ -7467,32 +7825,6 @@ "source-map": "~0.6.1" } }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz", @@ -7508,21 +7840,7 @@ "node": ">=4" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", @@ -7533,17 +7851,6 @@ "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", @@ -7698,9 +8005,9 @@ "license": "MIT" }, "node_modules/exsolve": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/exsolve/-/exsolve-1.1.1.tgz", - "integrity": "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==", + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/exsolve/-/exsolve-1.1.3.tgz", + "integrity": "sha512-kuzL9zherLQoqDeQaS55AiiIg1kb4KYXaSusTtgZTPlvKP2gGCI82LNmBNh5RjDVUXIcmgx+/Mx7vPwRzBbhJA==", "license": "MIT" }, "node_modules/fast-deep-equal": { @@ -7734,9 +8041,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.1.3", - "resolved": "https://registry.npmmirror.com/fast-uri/-/fast-uri-3.1.3.tgz", - "integrity": "sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==", + "version": "3.1.8", + "resolved": "https://registry.npmmirror.com/fast-uri/-/fast-uri-3.1.8.tgz", + "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==", "dev": true, "funding": [ { @@ -7752,23 +8059,23 @@ "peer": true }, "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "version": "1.20.3", + "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.20.3.tgz", + "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/fb-watchman/-/fb-watchman-2.0.4.tgz", + "integrity": "sha512-tGQtaoYisPDriJBN0mT5yZSyNETnJGA1gTYxaVRAE5KUO3LI9kPUc9WIu8JXcxaIci+faIKlzXqXyPgrmubtBQ==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "peer": true, "dependencies": { - "bser": "2.1.1" + "bser": "2.1.2" } }, "node_modules/file-type": { @@ -7854,9 +8161,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "version": "1.16.1", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.16.1.tgz", + "integrity": "sha512-FNvFGzoMLWmE6Yj9spb/zjd7yiNCHiAW9/Tg9CXrQ8wuu32HtlJOwWO11OJafl5FfY3DxTdQ0vj42zU1kvv5jg==", "funding": [ { "type": "individual", @@ -7978,15 +8285,6 @@ "loader-utils": "^3.2.0" } }, - "node_modules/generic-names/node_modules/loader-utils": { - "version": "3.3.1", - "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-3.3.1.tgz", - "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", - "license": "MIT", - "engines": { - "node": ">= 12.13.0" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -8007,9 +8305,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.6.0", - "resolved": "https://registry.npmmirror.com/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", - "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/get-east-asian-width/-/get-east-asian-width-1.7.0.tgz", + "integrity": "sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==", "dev": true, "license": "MIT", "engines": { @@ -8156,14 +8454,12 @@ "license": "ISC" }, "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "license": "MIT", - "peer": true, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/has-symbols": { @@ -8346,9 +8642,9 @@ "license": "BSD-3-Clause" }, "node_modules/immutable": { - "version": "4.3.9", - "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.3.9.tgz", - "integrity": "sha512-ObHy4YN7ycwZOUCLI1/6svfyAFu7vL8RhAvVu/bh/RZW9EPlOyDaQ9jDQWCtdqzaXUjgXZCW1migtHE7YI7UGQ==", + "version": "5.1.9", + "resolved": "https://registry.npmmirror.com/immutable/-/immutable-5.1.9.tgz", + "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", "devOptional": true, "license": "MIT" }, @@ -8447,12 +8743,12 @@ } }, "node_modules/is-core-module": { - "version": "2.16.2", - "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.16.2.tgz", - "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "version": "2.17.0", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.17.0.tgz", + "integrity": "sha512-J/vG0zBCbIKOQFfufSwyXdMrsohyJIUNkrnmo6WZGzoM7tr/lsbfW5b2BvisL6zsyMzK9UxV9L6c7AoFbyXHOA==", "license": "MIT", "dependencies": { - "hasown": "^2.0.3" + "hasown": "^2.0.4" }, "engines": { "node": ">= 0.4" @@ -8660,17 +8956,6 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/istanbul-lib-report": { "version": "3.0.1", "resolved": "https://registry.npmmirror.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", @@ -8687,6 +8972,17 @@ "node": ">=10" } }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/istanbul-lib-report/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", @@ -8842,6 +9138,39 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/jest-circus/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-circus/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/jest-circus/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-circus/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", @@ -8892,17 +9221,6 @@ } } }, - "node_modules/jest-cli/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/jest-cli/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -8938,53 +9256,35 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-cli/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/jest-cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "ISC", + "license": "MIT", "peer": true, "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/jest-cli/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "node_modules/jest-cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT", "peer": true }, - "node_modules/jest-cli/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/jest-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "peer": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { "node": ">=8" } @@ -9003,56 +9303,6 @@ "node": ">=8" } }, - "node_modules/jest-cli/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/yargs": { - "version": "16.2.2", - "resolved": "https://registry.npmmirror.com/yargs/-/yargs-16.2.2.tgz", - "integrity": "sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-cli/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "license": "ISC", - "peer": true, - "engines": { - "node": ">=10" - } - }, "node_modules/jest-config": { "version": "27.5.1", "resolved": "https://registry.npmmirror.com/jest-config/-/jest-config-27.5.1.tgz", @@ -9133,6 +9383,39 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/jest-config/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-config/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/jest-config/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-config/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", @@ -9199,6 +9482,39 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/jest-diff/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-diff/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/jest-diff/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-diff/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", @@ -9280,6 +9596,39 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/jest-each/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-each/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/jest-each/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-each/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", @@ -9437,6 +9786,39 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/jest-jasmine2/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/jest-jasmine2/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-jasmine2/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", @@ -9518,6 +9900,39 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/jest-matcher-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/jest-matcher-utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-matcher-utils/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", @@ -9589,6 +10004,39 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/jest-message-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-message-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/jest-message-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-message-util/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", @@ -9722,6 +10170,39 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/jest-resolve/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-resolve/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/jest-resolve/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-resolve/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", @@ -9805,6 +10286,39 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/jest-runner/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runner/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/jest-runner/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-runner/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", @@ -9889,6 +10403,39 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/jest-runtime/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runtime/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/jest-runtime/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-runtime/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", @@ -9988,6 +10535,53 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/jest-snapshot/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/jest-snapshot/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "peer": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jest-snapshot/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", @@ -10056,6 +10650,39 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/jest-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/jest-util/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-util/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", @@ -10138,6 +10765,39 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/jest-validate/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-validate/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/jest-validate/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-validate/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", @@ -10207,6 +10867,39 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/jest-watcher/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-watcher/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/jest-watcher/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-watcher/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", @@ -10237,6 +10930,34 @@ "node": ">= 10.13.0" } }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/jimp": { "version": "0.10.3", "resolved": "https://registry.npmmirror.com/jimp/-/jimp-0.10.3.tgz", @@ -10270,9 +10991,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "3.15.1", - "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.15.1.tgz", - "integrity": "sha512-S99WuO3HlhO3XN41EtYUNl9zzXjoJx7QvmipxsJVxtCBT0YHEFy+iOJhjSvrmV12nYhWpZaM8lPHkJm0yUMbag==", + "version": "3.15.2", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.15.2.tgz", + "integrity": "sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==", "dev": true, "license": "MIT", "peer": true, @@ -10521,34 +11242,13 @@ "node": ">= 8" } }, - "node_modules/loader-runner": { - "version": "4.3.2", - "resolved": "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.2.tgz", - "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, "engines": { - "node": ">=8.9.0" + "node": ">= 12.13.0" } }, "node_modules/local-pkg": { @@ -10569,19 +11269,19 @@ } }, "node_modules/local-pkg/node_modules/confbox": { - "version": "0.2.4", - "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.4.tgz", - "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.3.1.tgz", + "integrity": "sha512-cKUSoKa8YxFZZSmraVi7onONx3amu77ngK3kGpsYHDH7drPwCRkQE1RYMPlLRrMtnciRj274XNRxcHxnKmDSnA==", "license": "MIT" }, "node_modules/local-pkg/node_modules/pkg-types": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.3.1.tgz", - "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.3.3.tgz", + "integrity": "sha512-j/lCFdcppV0JxWpCEITdbDltBxPP6cHT+yNJ6Go2OgoSA9518X847X9z0p6LtA4Nc16+eQzCZjRrWanTGvHJ5w==", "license": "MIT", "dependencies": { - "confbox": "^0.2.4", - "exsolve": "^1.0.8", + "confbox": "^0.3.1", + "exsolve": "^1.1.1", "pathe": "^2.0.3" } }, @@ -10664,6 +11364,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "peer": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmmirror.com/makeerror/-/makeerror-1.0.12.tgz", @@ -10776,12 +11490,11 @@ } }, "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -10799,16 +11512,6 @@ "node": ">= 0.6" } }, - "node_modules/mime-types/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -10852,17 +11555,17 @@ } }, "node_modules/minimizer-webpack-plugin": { - "version": "5.6.1", - "resolved": "https://registry.npmmirror.com/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.6.1.tgz", - "integrity": "sha512-DoeAZz8Q1C1znwsUzej1fdoi4jCf7/+Em27ouLqfK/+3m8G+D7yDhUwrc3CNhjSzGUN1kn7Iv4sWmjflQHenpw==", + "version": "5.13.0", + "resolved": "https://registry.npmmirror.com/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.13.0.tgz", + "integrity": "sha512-OO1NF2zHj6sf4CNv2AsUWYcS8WEwkVKQDXxxKzlOxx1Xl+WlqYtVC+oNlGNwGkLAOnpj277BSHypWwRtd9w4JQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", + "@jridgewell/trace-mapping": "^0.3.31", "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "terser": "^5.31.1" + "schema-utils": "^4.3.3", + "terser": "^5.51.0" }, "engines": { "node": ">= 10.13.0" @@ -10878,6 +11581,9 @@ "@minify-html/node": { "optional": true }, + "@napi-rs/image": { + "optional": true + }, "@swc/core": { "optional": true }, @@ -10902,12 +11608,21 @@ "html-minifier-terser": { "optional": true }, + "imagemin": { + "optional": true + }, "lightningcss": { "optional": true }, "postcss": { "optional": true }, + "sharp": { + "optional": true + }, + "svgo": { + "optional": true + }, "uglify-js": { "optional": true } @@ -10954,16 +11669,16 @@ "peer": true }, "node_modules/minimizer-webpack-plugin/node_modules/schema-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.5.0.tgz", + "integrity": "sha512-zJlMCZ0cAR5p/Y4oVpRoqioDMJcGxaXRrQ/4rP4WyR84vc5z/DolXdbvXeDpTwbtocDFr2rhPqHPErDCUtz2kA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", + "@types/json-schema": "^7.0.15", + "ajv": "^8.20.0", + "ajv-formats": "^3.0.1", "ajv-keywords": "^5.1.0" }, "engines": { @@ -11011,9 +11726,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.18", - "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.18.tgz", - "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "version": "3.3.20", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.20.tgz", + "integrity": "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==", "funding": [ { "type": "github", @@ -11053,6 +11768,13 @@ "dev": true, "license": "MIT" }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT", + "optional": true + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmmirror.com/node-int64/-/node-int64-0.4.0.tgz", @@ -11062,9 +11784,9 @@ "peer": true }, "node_modules/node-releases": { - "version": "2.0.53", - "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.53.tgz", - "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", + "version": "2.0.58", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.58.tgz", + "integrity": "sha512-BdiKAgbfRlvfMq/XzO/AF9NPmaA8a+YpLAyAFTVFBj3gARrAIfWvNq7Q7NE4se3KgFu0KkrvQMxTS0XVnsGzHg==", "license": "MIT", "engines": { "node": ">=18" @@ -11102,9 +11824,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.24", - "resolved": "https://registry.npmmirror.com/nwsapi/-/nwsapi-2.2.24.tgz", - "integrity": "sha512-7YRhZ3jS45LwmSCT4b2sVFHt/WuovaktDU07QrtOBY2PXskss5a9jfmR9jptyumwXST+rFjrmppMY1KT/yn35A==", + "version": "2.2.28", + "resolved": "https://registry.npmmirror.com/nwsapi/-/nwsapi-2.2.28.tgz", + "integrity": "sha512-IlVB7OS7qrOsVYlpnFIkETjMwT9jwvmocJmmM+GZU/PAB3uGi9Ezd7vcWhWBUnSc0ya4ppmQITOyP1ez9gg8cg==", "dev": true, "license": "MIT", "peer": true @@ -11169,18 +11891,18 @@ } }, "node_modules/open": { - "version": "11.0.0", - "resolved": "https://registry.npmmirror.com/open/-/open-11.0.0.tgz", - "integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==", + "version": "11.0.4", + "resolved": "https://registry.npmmirror.com/open/-/open-11.0.4.tgz", + "integrity": "sha512-++Zlftm0kVLPmzC06t6epuWmcRMDbI4z5P3NNX979WA/k23+NtSOynEGzsVfZwguKw2mi5umVgnBlJQMwRz4Pg==", "dev": true, "license": "MIT", "dependencies": { - "default-browser": "^5.4.0", + "default-browser": "^5.5.1", "define-lazy-prop": "^3.0.0", "is-in-ssh": "^1.0.0", "is-inside-container": "^1.0.0", - "powershell-utils": "^0.1.0", - "wsl-utils": "^0.3.0" + "powershell-utils": "^0.2.1", + "wsl-utils": "^1.0.0" }, "engines": { "node": ">=20" @@ -11398,9 +12120,9 @@ "license": "MIT" }, "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", "license": "ISC" }, "node_modules/picomatch": { @@ -11415,15 +12137,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/pirates": { "version": "4.0.7", "resolved": "https://registry.npmmirror.com/pirates/-/pirates-4.0.7.tgz", @@ -11482,9 +12195,9 @@ } }, "node_modules/postcss": { - "version": "8.5.26", - "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.26.tgz", - "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "version": "8.5.29", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.29.tgz", + "integrity": "sha512-49cGhUbXj8Qenv0iTMxA1cFBzxXoctpC9Ujd77t1WcbJIr6nF/eI7g/8MgxrYldFRuAXvja7xQRwavoW7kgrxQ==", "funding": [ { "type": "opencollective", @@ -11501,9 +12214,9 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.17", + "nanoid": "^3.3.19", "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "source-map-js": "^1.2.2" }, "engines": { "node": "^10 || ^12 || >=14" @@ -11604,9 +12317,9 @@ } }, "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { - "version": "7.1.5", - "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz", - "integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==", + "version": "7.1.6", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz", + "integrity": "sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -11632,9 +12345,9 @@ } }, "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { - "version": "7.1.5", - "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz", - "integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==", + "version": "7.1.6", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz", + "integrity": "sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -11678,10 +12391,25 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "license": "MIT" }, + "node_modules/postcss/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/postcss/node_modules/source-map-js": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.2.tgz", + "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/powershell-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmmirror.com/powershell-utils/-/powershell-utils-0.1.0.tgz", - "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/powershell-utils/-/powershell-utils-0.2.1.tgz", + "integrity": "sha512-C+y9x90UElAddDZmV4qOx9W53B61PO7cIqWz2dQsWlwswuq4mr8NEwytdGKboYbQlGZ3awrkTeNvcZiZNHnQ8A==", "dev": true, "license": "MIT", "engines": { @@ -11707,17 +12435,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/pretty-format/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz", @@ -11757,9 +12474,9 @@ } }, "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "version": "2.0.8", + "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.8.tgz", + "integrity": "sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11768,6 +12485,10 @@ }, "engines": { "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/psl": { @@ -11903,13 +12624,10 @@ "peer": true }, "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.2.tgz", + "integrity": "sha512-/peqiBB/n07gQGLsWaHho3WfvUyRscw0gYTsEFMhrIe/nWLkYaf5SbKYjGYqtRV3aPwykJgF2VEMo1ac4bnsGA==", + "license": "MIT" }, "node_modules/readdirp": { "version": "3.6.0", @@ -11924,16 +12642,16 @@ } }, "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/regenerate/-/regenerate-1.5.0.tgz", + "integrity": "sha512-1s+CxXjJ71i7LNVy8nYwg47XV4y6lAnOEhsMtSKq3WpmPfhl9LuKlTqKIn/3yUpE8lBz+W+TT88Bxyhnr0U4yw==", "dev": true, "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.2.2", - "resolved": "https://registry.npmmirror.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", - "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "version": "10.3.0", + "resolved": "https://registry.npmmirror.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.3.0.tgz", + "integrity": "sha512-9ns8odR8e9q3otKeHj3DE80jZYKg6zVeZKE+zQmRKXFoVUcuiTGeO6iusDhPRoIQQPVPRvH+SfBhrTud4eczuw==", "dev": true, "license": "MIT", "dependencies": { @@ -11951,14 +12669,14 @@ "license": "MIT" }, "node_modules/regexpu-core": { - "version": "6.4.0", - "resolved": "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-6.4.0.tgz", - "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "version": "6.5.3", + "resolved": "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-6.5.3.tgz", + "integrity": "sha512-E8VgUoSK+LMQrLboDxavm76MTBGrQhx9RiNuomRmYnZ10Uw12HrI8fkxOOncktb2hBpzIZ9SV/347euQHG5z+g==", "dev": true, "license": "MIT", "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.2", + "regenerate": "^1.5.0", + "regenerate-unicode-properties": "^10.3.0", "regjsgen": "^0.8.0", "regjsparser": "^0.13.0", "unicode-match-property-ecmascript": "^2.0.0", @@ -11976,9 +12694,9 @@ "license": "MIT" }, "node_modules/regjsparser": { - "version": "0.13.2", - "resolved": "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.13.2.tgz", - "integrity": "sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==", + "version": "0.13.4", + "resolved": "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.13.4.tgz", + "integrity": "sha512-EWV80YgFaVgFrjGCAsV7oybp4GOxbls5RzBg8OB0nKEVXsBJR1JlV8Di1JhCROg3MzTfe1RI8yitIm1eOs68iA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -12135,16 +12853,16 @@ } }, "node_modules/rollup-plugin-visualizer": { - "version": "7.0.1", - "resolved": "https://registry.npmmirror.com/rollup-plugin-visualizer/-/rollup-plugin-visualizer-7.0.1.tgz", - "integrity": "sha512-UJUT4+1Ho4OcWmPYU3sYXgUqI8B8Ayfe06MX7y0qCJ1K8aGoKtR/NDd/2nZqM7ADkrzny+I99Ul7GgyoiVNAgg==", + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/rollup-plugin-visualizer/-/rollup-plugin-visualizer-7.1.1.tgz", + "integrity": "sha512-ThaGiHTU8XW02OkK80TrTHATraJmM9OAduU4otal+7gyXLpYEtmGBLfx5kW+EHvvLwn03YGW2NnwKUIqsYlJAA==", "dev": true, "license": "MIT", "dependencies": { "open": "^11.0.0", - "picomatch": "^4.0.2", - "source-map": "^0.7.4", - "yargs": "^18.0.0" + "picomatch": "^4.0.5", + "source-map": "^0.8.0", + "yargs": "^18.1.0" }, "bin": { "rollup-plugin-visualizer": "dist/bin/cli.js" @@ -12165,10 +12883,76 @@ } } }, + "node_modules/rollup-plugin-visualizer/node_modules/ansi-regex": { + "version": "6.4.0", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.4.0.tgz", + "integrity": "sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, "node_modules/rollup-plugin-visualizer/node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "version": "4.0.7", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, "license": "MIT", "engines": { @@ -12179,15 +12963,112 @@ } }, "node_modules/rollup-plugin-visualizer/node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "version": "0.8.0", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.8.0.tgz", + "integrity": "sha512-d8EqvL+k/SOXCreS/SUzg2ciyHqBBLcN/yuRjFsbvVhHTE2pgei7oAhmPM7kWFbkX6OSMQfUq4KbkF3au9lhYQ==", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">= 12" } }, + "node_modules/rollup-plugin-visualizer/node_modules/string-width": { + "version": "8.3.0", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-8.3.0.tgz", + "integrity": "sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/yargs": { + "version": "18.2.0", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-18.2.0.tgz", + "integrity": "sha512-9OpKOLeaoNFecEp7P6iYbzze/5CqWoH7N3SMs/6y1XF4nMvFMspEGZzJ6uFi9MmQwXhyzqYoSEKO3tvA3Z/o2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^8.2.1", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, "node_modules/rollup/node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz", @@ -12265,27 +13146,30 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.63.2", - "resolved": "https://registry.npmmirror.com/sass/-/sass-1.63.2.tgz", - "integrity": "sha512-u56TU0AIFqMtauKl/OJ1AeFsXqRHkgO7nCWmHaDwfxDo9GUMSqBA4NEh6GMuh1CYVM7zuROYtZrHzPc2ixK+ww==", + "version": "1.105.1", + "resolved": "https://registry.npmmirror.com/sass/-/sass-1.105.1.tgz", + "integrity": "sha512-1CnAWPyrrnVQzXGB/DUep1vYCKCm1CIBr+YxjjiW6wk9qtzemnGP4qicH56T2F9S4Hjtv/Ne3jDz8JqfdDU4oA==", "devOptional": true, "license": "MIT", "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", + "chokidar": "^5.0.0", + "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { "sass": "sass.js" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.19.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, "node_modules/sass-loader": { - "version": "10.4.1", - "resolved": "https://registry.npmmirror.com/sass-loader/-/sass-loader-10.4.1.tgz", - "integrity": "sha512-aX/iJZTTpNUNx/OSYzo2KsjIUQHqvWsAhhUijFjAPdZTEhstjZI9zTNvkTTwsx+uNUJqUwOw5gacxQMx4hJxGQ==", + "version": "10.5.2", + "resolved": "https://registry.npmmirror.com/sass-loader/-/sass-loader-10.5.2.tgz", + "integrity": "sha512-vMUoSNOUKJILHpcNCCyD23X34gve1TS7Rjd9uXHeKqhvBG39x6XbswFDtpbTElj6XdMFezoWhkh5vtKudf2cgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12304,7 +13188,7 @@ }, "peerDependencies": { "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "webpack": "^4.36.0 || ^5.0.0" }, @@ -12320,6 +13204,64 @@ } } }, + "node_modules/sass-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/sass-loader/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sass/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-5.1.1.tgz", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/sax": { "version": "1.6.1", "resolved": "https://registry.npmmirror.com/sax/-/sax-1.6.1.tgz", @@ -12375,16 +13317,12 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" } }, "node_modules/send": { @@ -12758,18 +13696,23 @@ "node": ">=10" } }, - "node_modules/string-length/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { "node": ">=8" } }, - "node_modules/string-length/node_modules/strip-ansi": { + "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", @@ -12783,40 +13726,6 @@ "node": ">=8" } }, - "node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-4.0.0.tgz", @@ -12871,20 +13780,15 @@ "license": "MIT" }, "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "license": "MIT", - "peer": true, "dependencies": { - "has-flag": "^4.0.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">=4" } }, "node_modules/supports-hyperlinks": { @@ -12902,6 +13806,17 @@ "node": ">=8" } }, + "node_modules/supports-hyperlinks/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-hyperlinks/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", @@ -12975,9 +13890,9 @@ } }, "node_modules/terser": { - "version": "5.49.0", - "resolved": "https://registry.npmmirror.com/terser/-/terser-5.49.0.tgz", - "integrity": "sha512-SNiDnXyHSrxVcIOtVbULzcTmniUiwcV7Nwdyj1twVubeTmbjoa8p69KKDpfkdoOavuM4/GRm1+ykI8qqnavHoA==", + "version": "5.51.2", + "resolved": "https://registry.npmmirror.com/terser/-/terser-5.51.2.tgz", + "integrity": "sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q==", "devOptional": true, "license": "BSD-2-Clause", "dependencies": { @@ -13173,9 +14088,9 @@ "license": "MIT" }, "node_modules/undici-types": { - "version": "8.3.0", - "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-8.3.0.tgz", - "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", + "version": "8.9.0", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-8.9.0.tgz", + "integrity": "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==", "devOptional": true, "license": "MIT", "peer": true @@ -13280,9 +14195,9 @@ } }, "node_modules/unimport/node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "version": "4.0.7", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "license": "MIT", "engines": { "node": ">=12" @@ -13342,9 +14257,9 @@ } }, "node_modules/unplugin-utils/node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "version": "4.0.7", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "license": "MIT", "engines": { "node": ">=12" @@ -13354,9 +14269,9 @@ } }, "node_modules/unplugin/node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "version": "4.0.7", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "license": "MIT", "engines": { "node": ">=12" @@ -13372,9 +14287,9 @@ "license": "MIT" }, "node_modules/update-browserslist-db": { - "version": "1.3.1", - "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz", - "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==", + "version": "1.3.4", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.3.4.tgz", + "integrity": "sha512-t8wonIOdQyOjtPd2VktlBu6QjTVTks6v8bSi7kd0r2Vll8TK1JYDZtRRdbmCHOAMphkZgrzK+L+vXK4pyZ8t4A==", "funding": [ { "type": "opencollective", @@ -13401,6 +14316,12 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/update-browserslist-db/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", @@ -13449,9 +14370,9 @@ } }, "node_modules/uview-plus": { - "version": "3.8.55", - "resolved": "https://registry.npmmirror.com/uview-plus/-/uview-plus-3.8.55.tgz", - "integrity": "sha512-OcjitgqLWZzMZuq93YSfpvOzyFvOuhGC6Lh4cljX28bNmDImoe14IhOpW8tcLcjLilbEOZJBYxbvpZpGAdiQxQ==", + "version": "3.8.130", + "resolved": "https://registry.npmmirror.com/uview-plus/-/uview-plus-3.8.130.tgz", + "integrity": "sha512-Dczrzb4eSfddE1UEQxZnIHWuNDt6svEhNlsObg9x47IBcz1MAAELn1RKWJmc46F9CU3B3UkeUu+LN9w6+VGoOw==", "engines": { "HBuilderX": "^3.1.0", "uni-app": "^4.66", @@ -13721,9 +14642,9 @@ } }, "node_modules/webpack": { - "version": "5.108.4", - "resolved": "https://registry.npmmirror.com/webpack/-/webpack-5.108.4.tgz", - "integrity": "sha512-yur8LyJoeiWh47dErD+Ok7vlbmDsJ3UbbRPAoxbGJ54WpE2y5yVo5G/inUzujnYgw3tPmBRdn+G7PoxXaYC33w==", + "version": "5.111.1", + "resolved": "https://registry.npmmirror.com/webpack/-/webpack-5.111.1.tgz", + "integrity": "sha512-cNypaz0RP+S4cvQVi1M/3bRUkvNP0xZpL0TjFx+c6jg64VbxD+2weWDgY9UnjRI6dhZgtaj8DU76GGFcJ79xPQ==", "dev": true, "license": "MIT", "peer": true, @@ -13733,23 +14654,18 @@ "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.16.0", - "acorn-import-phases": "^1.0.3", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.22.2", + "enhanced-resolve": "^5.25.0", "es-module-lexer": "^2.1.0", - "eslint-scope": "5.1.1", "events": "^3.2.0", "graceful-fs": "^4.2.11", - "loader-runner": "^4.3.2", "mime-db": "^1.54.0", - "minimizer-webpack-plugin": "^5.6.1", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.3", + "minimizer-webpack-plugin": "^5.7.0", + "schema-utils": "^4.5.0", "tapable": "^2.3.0", "watchpack": "^2.5.2", - "webpack-sources": "^3.5.0" + "webpack-sources": "^3.5.1" }, "bin": { "webpack": "bin/webpack.js" @@ -13768,9 +14684,9 @@ } }, "node_modules/webpack-sources": { - "version": "3.5.1", - "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.5.1.tgz", - "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==", + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.6.0.tgz", + "integrity": "sha512-EIMmPVvNI0CYXyRPp34F2Qk7W37/BZVZIofS6LAUnrNjCVahS+hO4mxwFJDjQjODTGZDtVzLYoN2+1dYkhk9qA==", "dev": true, "license": "MIT", "peer": true, @@ -13816,6 +14732,14 @@ "ajv": "^8.8.2" } }, + "node_modules/webpack/node_modules/es-module-lexer": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-2.3.2.tgz", + "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/webpack/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -13824,17 +14748,28 @@ "license": "MIT", "peer": true }, + "node_modules/webpack/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/webpack/node_modules/schema-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.5.0.tgz", + "integrity": "sha512-zJlMCZ0cAR5p/Y4oVpRoqioDMJcGxaXRrQ/4rP4WyR84vc5z/DolXdbvXeDpTwbtocDFr2rhPqHPErDCUtz2kA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", + "@types/json-schema": "^7.0.15", + "ajv": "^8.20.0", + "ajv-formats": "^3.0.1", "ajv-keywords": "^5.1.0" }, "engines": { @@ -13897,23 +14832,63 @@ } }, "node_modules/wrap-ansi": { - "version": "9.0.2", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=18" + "node": ">=10" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", @@ -13958,14 +14933,14 @@ } }, "node_modules/wsl-utils": { - "version": "0.3.1", - "resolved": "https://registry.npmmirror.com/wsl-utils/-/wsl-utils-0.3.1.tgz", - "integrity": "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==", + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/wsl-utils/-/wsl-utils-1.0.1.tgz", + "integrity": "sha512-c16PKLIRxBYpR3jSWsdS7SFp0COm5SOQdiFjY818dYFHJbMGuLBszpF07LBWmOS1uzrHa9VGdynsEgoeKy0oOQ==", "dev": true, "license": "MIT", "dependencies": { "is-wsl": "^3.1.0", - "powershell-utils": "^0.1.0" + "powershell-utils": "^0.2.0" }, "engines": { "node": ">=20" @@ -14083,31 +15058,34 @@ } }, "node_modules/yargs": { - "version": "18.0.0", - "resolved": "https://registry.npmmirror.com/yargs/-/yargs-18.0.0.tgz", - "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "version": "16.2.2", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-16.2.2.tgz", + "integrity": "sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "cliui": "^9.0.1", + "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", - "string-width": "^7.2.0", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", "y18n": "^5.0.5", - "yargs-parser": "^22.0.0" + "yargs-parser": "^20.2.2" }, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" + "node": ">=10" } }, "node_modules/yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "version": "20.2.9", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, "license": "ISC", + "peer": true, "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" + "node": ">=10" } } } diff --git a/uniapp/pages.json b/uniapp/pages.json index 2ca1672..08c51a9 100644 --- a/uniapp/pages.json +++ b/uniapp/pages.json @@ -337,6 +337,27 @@ "navigationBarTitleText": "新建日程", "navigationBarBackgroundColor": "#F8FAFC" } + }, + { + "path": "pages/tools/expense/index", + "style": { + "navigationBarTitleText": "报销管理", + "navigationBarBackgroundColor": "#F8FAFC" + } + }, + { + "path": "pages/tools/expense/edit", + "style": { + "navigationBarTitleText": "新建报销单", + "navigationBarBackgroundColor": "#F8FAFC" + } + }, + { + "path": "pages/tools/expense/detail", + "style": { + "navigationBarTitleText": "报销详情", + "navigationBarBackgroundColor": "#F8FAFC" + } } ], "globalStyle": { diff --git a/uniapp/pages/tools/expense/detail.vue b/uniapp/pages/tools/expense/detail.vue new file mode 100644 index 0000000..783629f --- /dev/null +++ b/uniapp/pages/tools/expense/detail.vue @@ -0,0 +1,532 @@ + + + + + diff --git a/uniapp/pages/tools/expense/edit.vue b/uniapp/pages/tools/expense/edit.vue new file mode 100644 index 0000000..cf83814 --- /dev/null +++ b/uniapp/pages/tools/expense/edit.vue @@ -0,0 +1,746 @@ + + + + + diff --git a/uniapp/pages/tools/expense/index.vue b/uniapp/pages/tools/expense/index.vue new file mode 100644 index 0000000..2ed2852 --- /dev/null +++ b/uniapp/pages/tools/expense/index.vue @@ -0,0 +1,313 @@ + + + + + diff --git a/uniapp/pages/tools/schedule/detail.vue b/uniapp/pages/tools/schedule/detail.vue index deb24fd..6dcc2c0 100644 --- a/uniapp/pages/tools/schedule/detail.vue +++ b/uniapp/pages/tools/schedule/detail.vue @@ -5,46 +5,70 @@ @@ -54,17 +78,19 @@ - - - - - - + @@ -73,21 +99,46 @@ import { ref, computed } from 'vue' import { onLoad, onShow } from '@dcloudio/uni-app' import { - getSchedule, - deleteSchedule, - toggleScheduleComplete, - getRemindChannelLabel, - getRemindMinutesLabel -} from '@/api/schedule.js' -import { formatDate } from '@/utils/date.js' + getOaSchedule, + deleteOaSchedule, + toggleOaScheduleComplete, + uploadOaScheduleImage, + setOaScheduleImages, + getOaPriorityLabel +} from '@/api/oaSchedule.js' +import { dayLabel, formatDate } from '@/utils/date.js' const scheduleId = ref('') const item = ref(null) const loading = ref(false) +const uploading = ref(false) -const remindText = computed(() => { +const priorityLabel = computed(() => { if (!item.value) return '' - return getRemindMinutesLabel(item.value.remindMinutes) + return getOaPriorityLabel(item.value.priority) +}) + +/** 标题即内容:标题作为正文主文本展示 */ +const headText = computed(() => { + if (!item.value) return '' + return (item.value.title || '').trim() || '无标题' +}) + +/** content 与标题相同(或为空)时不重复展示,仅在有额外内容时补充显示 */ +const extraContent = computed(() => { + if (!item.value) return '' + const c = (item.value.content || '').trim() + if (!c || c === (item.value.title || '').trim()) return '' + return c +}) + +const timeRangeText = computed(() => { + if (!item.value) return '' + if (item.value.allDay) return '全天' + const start = item.value.start_time || '' + const end = item.value.end_time || '' + if (!start) return '未设置' + return end ? `${start} - ${end}` : start }) onLoad((query) => { @@ -101,10 +152,16 @@ onShow(() => { if (scheduleId.value) loadDetail() }) +/** 后端时间字段可能为 "YYYY-MM-DD HH:mm:ss" 格式,iOS 需转 T 分隔 */ +function formatTime(value) { + if (!value) return '' + return formatDate(new Date(String(value).replace(' ', 'T')), true) +} + async function loadDetail() { loading.value = true try { - const data = await getSchedule(scheduleId.value) + const data = await getOaSchedule(scheduleId.value) if (!data) { uni.showToast({ title: '日程不存在', icon: 'none' }) setTimeout(() => uni.navigateBack(), 800) @@ -118,6 +175,64 @@ async function loadDetail() { } } +function previewImage(index) { + const urls = (item.value?.images || []).map(img => img.url).filter(Boolean) + if (!urls.length) return + uni.previewImage({ urls, current: urls[index] || urls[0] }) +} + +/** 上传资料图片:选图 → 逐张上传 → 引用写回日程 */ +function onUploadMaterial() { + if (uploading.value) return + uni.chooseImage({ + count: 9, + success: async (res) => { + const paths = res.tempFilePaths || [] + if (!paths.length) return + uploading.value = true + try { + const uploaded = [] + for (const p of paths) { + uploaded.push(await uploadOaScheduleImage(p)) + } + const saved = await setOaScheduleImages( + scheduleId.value, + [...(item.value.images || []), ...uploaded] + ) + item.value.images = saved + uni.showToast({ title: '上传成功', icon: 'success' }) + } catch (e) { + // 上传/请求封装已提示错误 + } finally { + uploading.value = false + } + } + }) +} + +/** 长按删除资料图片(仅移除引用,不动文件管理里的文件) */ +function onRemoveImage(index) { + const img = item.value?.images?.[index] + if (!img || uploading.value) return + uni.showModal({ + title: '删除资料', + content: `确定删除「${img.name || '该图片'}」吗?`, + success: async (res) => { + if (!res.confirm) return + try { + const saved = await setOaScheduleImages( + scheduleId.value, + item.value.images.filter((_, i) => i !== index) + ) + item.value.images = saved + uni.showToast({ title: '已删除', icon: 'none' }) + } catch (e) { + // request 封装已提示错误 + } + } + }) +} + function openEdit() { uni.navigateTo({ url: `/pages/tools/schedule/edit?id=${scheduleId.value}` }) } @@ -126,31 +241,30 @@ async function onToggleComplete() { if (!item.value) return const wasCompleted = item.value.completed try { - await toggleScheduleComplete(item.value.id) - // toggle 接口只返回 is_finished,需重新拉取完整详情 - await loadDetail() + const res = await toggleOaScheduleComplete(item.value.id) + item.value = { ...item.value, completed: res.completed, status: res.status } uni.showToast({ - title: wasCompleted ? '已标为待办' : '已标记完成', + title: wasCompleted ? '已反审核' : '已标记完成', icon: 'none' }) } catch (e) { - uni.showToast({ title: '操作失败', icon: 'none' }) + // request 封装已弹出服务端错误提示 } } function onDelete() { - const summary = (item.value?.content || '').split('\n')[0] || '该日程' + const summary = item.value?.title || '该日程' uni.showModal({ title: '删除日程', content: `确定删除「${summary}」吗?`, success: async (res) => { if (!res.confirm) return try { - await deleteSchedule(scheduleId.value) + await deleteOaSchedule(scheduleId.value) uni.showToast({ title: '已删除', icon: 'success' }) setTimeout(() => uni.navigateBack(), 400) } catch (e) { - uni.showToast({ title: '删除失败', icon: 'none' }) + // request 封装已弹出服务端错误提示 } } }) @@ -173,27 +287,45 @@ function onDelete() { padding: 32rpx 28rpx; } -.content-block { +.head-block { padding-bottom: 24rpx; - margin-bottom: 8rpx; +} - .info-label { - display: block; - margin-bottom: 12rpx; +.head-row { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 16rpx; +} + +.head-text { + flex: 1; + min-width: 0; + font-size: 30rpx; + color: $color-text; + line-height: 1.6; + white-space: pre-wrap; + word-wrap: break-word; + word-break: break-all; + + &.done { + color: $color-text-muted; + text-decoration: line-through; } } -.content-header { +.head-tags { display: flex; align-items: center; - justify-content: space-between; - margin-bottom: 12rpx; + gap: 10rpx; + flex-shrink: 0; } -.content-text { +.head-extra { display: block; - font-size: 30rpx; - color: $color-text; + margin-top: 12rpx; + font-size: 28rpx; + color: $color-text-secondary; line-height: 1.7; white-space: pre-wrap; word-wrap: break-word; @@ -209,10 +341,6 @@ function onDelete() { border-top: 1rpx solid $color-divider; } -.channel-row { - align-items: flex-start; -} - .info-label { font-size: 26rpx; color: $color-text-muted; @@ -223,18 +351,54 @@ function onDelete() { font-size: 28rpx; color: $color-text; text-align: right; - - &.muted { - color: $color-text-muted; - } } -.channel-tags { +.image-block { + padding: 20rpx 0; + border-top: 1rpx solid $color-divider; +} + +.image-head { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 12rpx; +} + +.image-hint { + font-size: 22rpx; + color: $color-text-muted; +} + +.image-grid { display: flex; flex-wrap: wrap; - justify-content: flex-end; - gap: 10rpx; - flex: 1; + gap: 12rpx; +} + +.image-item { + width: 160rpx; + height: 160rpx; + border-radius: $radius-md; + background: $color-bg-page; +} + +.image-add { + width: 160rpx; + height: 160rpx; + border: 1rpx dashed $color-border; + border-radius: $radius-md; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 6rpx; + font-size: 22rpx; + color: $color-text-muted; + + &:active { + opacity: 0.7; + } } .meta-row { diff --git a/uniapp/pages/tools/schedule/edit.vue b/uniapp/pages/tools/schedule/edit.vue index a982b42..30630b9 100644 --- a/uniapp/pages/tools/schedule/edit.vue +++ b/uniapp/pages/tools/schedule/edit.vue @@ -7,20 +7,18 @@ - 日程内容 * - 标题 * + - 发生日期 * + 日期 * {{ form.date || '选择日期' }} @@ -29,65 +27,60 @@ - - 发生时间 * - + + + 全天 + 开启后无需填写起止时间 + + + + + + 开始时间 * + - {{ form.time || '选择时间' }} + {{ form.startTime || '选择开始时间' }} - - 提醒渠道 - 可多选,接入接口后按渠道下发提醒 - - - + + 结束时间 + + + {{ form.endTime || '选填,不填则只记开始时间' }} + + + - 提前提醒时间 - + 优先级 + - {{ remindLabels[remindIndex] }} - + {{ priorityLabels[priorityIndex] }} + - 重复提醒间隔(分钟) - 内容 + - 0表示不重复,仅发送一次 - - - - 最多提醒次数 - - 最多发送的提醒次数 @@ -109,40 +102,36 @@ import { ref, reactive, computed } from 'vue' import { onLoad } from '@dcloudio/uni-app' import { - getSchedule, - createSchedule, - updateSchedule, - REMIND_CHANNEL_OPTIONS, - REMIND_MINUTES_OPTIONS -} from '@/api/schedule.js' -import { formatDate, pad } from '@/utils/date.js' + getOaSchedule, + createOaSchedule, + updateOaSchedule, + OA_SCHEDULE_PRIORITY_OPTIONS +} from '@/api/oaSchedule.js' +import { formatDate } from '@/utils/date.js' const scheduleId = ref('') const saving = ref(false) const isCompleted = ref(false) -const channelOptions = REMIND_CHANNEL_OPTIONS -const remindOptions = REMIND_MINUTES_OPTIONS -const remindLabels = remindOptions.map(item => item.label) +const priorityOptions = OA_SCHEDULE_PRIORITY_OPTIONS +const priorityLabels = priorityOptions.map(item => item.label) const form = reactive({ + title: '', content: '', date: '', - time: '', - remindChannels: ['app'], - remindMinutes: 0, - repeatIntervalMinutes: 0, - maxSendCount: 1 + allDay: true, + startTime: '09:00', + endTime: '', + priority: 0 }) -const remindIndex = computed(() => { - const index = remindOptions.findIndex(item => item.value === form.remindMinutes) - return index >= 0 ? index : 3 +const priorityIndex = computed(() => { + const index = priorityOptions.findIndex(item => item.value === Number(form.priority)) + return index >= 0 ? index : 0 }) onLoad(async (query) => { - const now = new Date() - form.date = formatDate(now) - form.time = `${pad(now.getHours())}:${pad(now.getMinutes())}` + form.date = formatDate(new Date()) if (query?.id) { scheduleId.value = query.id @@ -155,105 +144,86 @@ onLoad(async (query) => { async function loadSchedule(id) { try { - const item = await getSchedule(id) + const item = await getOaSchedule(id) if (!item) { uni.showToast({ title: '日程不存在', icon: 'none' }) setTimeout(() => uni.navigateBack(), 800) return } - const d = new Date(item.datetime) + form.title = item.title || '' form.content = item.content || '' - form.date = formatDate(d) - form.time = `${pad(d.getHours())}:${pad(d.getMinutes())}` - form.remindChannels = [...(item.remindChannels || [])] - form.remindMinutes = item.remindMinutes ?? 0 - form.repeatIntervalMinutes = item.repeatIntervalMinutes ?? 0 - form.maxSendCount = item.maxSendCount ?? 1 + form.date = item.schedule_date || formatDate(new Date()) + form.allDay = !!item.allDay + form.startTime = item.start_time || '09:00' + form.endTime = item.end_time || '' + form.priority = Number(item.priority) || 0 isCompleted.value = !!item.completed } catch (e) { uni.showToast({ title: '加载失败', icon: 'none' }) } } -/** 渠道是否已选中 */ -function isChannelActive(value) { - return form.remindChannels.includes(value) -} - -function onChannelTap(name) { - if (isCompleted.value) return - const index = form.remindChannels.indexOf(name) - if (index >= 0) { - form.remindChannels.splice(index, 1) - } else { - form.remindChannels.push(name) - } -} - function onDateChange(e) { form.date = e.detail.value } -function onTimeChange(e) { - form.time = e.detail.value +function onStartTimeChange(e) { + form.startTime = e.detail.value } -function onRemindChange(e) { +function onEndTimeChange(e) { + form.endTime = e.detail.value +} + +function onPriorityChange(e) { const index = Number(e.detail.value) - form.remindMinutes = remindOptions[index].value -} - -function buildDatetime() { - const [year, month, day] = form.date.split('-').map(Number) - const [hour, minute] = form.time.split(':').map(Number) - return new Date(year, month - 1, day, hour, minute).getTime() + form.priority = priorityOptions[index].value } async function onSave() { if (saving.value) return - if (!form.content.trim()) { - uni.showToast({ title: '请输入日程内容', icon: 'none' }) + if (!form.title.trim()) { + uni.showToast({ title: '请输入日程标题', icon: 'none' }) return } - if (!form.date || !form.time) { - uni.showToast({ title: '请选择发生时间', icon: 'none' }) + if (!form.date) { + uni.showToast({ title: '请选择日期', icon: 'none' }) return } - - const datetime = buildDatetime() - if (datetime < Date.now() - 60000 && !scheduleId.value) { - uni.showModal({ - title: '时间提示', - content: '发生时间已过去,仍要保存吗?', - success: async (res) => { - if (res.confirm) await saveData(datetime) - } - }) - return + if (!form.allDay) { + if (!form.startTime) { + uni.showToast({ title: '请选择开始时间', icon: 'none' }) + return + } + if (form.endTime && form.endTime <= form.startTime) { + uni.showToast({ title: '结束时间需晚于开始时间', icon: 'none' }) + return + } } - await saveData(datetime) + await saveData() } -async function saveData(datetime) { +async function saveData() { saving.value = true const payload = { + title: form.title.trim(), content: form.content, - datetime, - remindChannels: [...form.remindChannels], - remindMinutes: form.remindMinutes, - repeatIntervalMinutes: form.repeatIntervalMinutes, - maxSendCount: form.maxSendCount + scheduleDate: form.date, + allDay: form.allDay, + startTime: form.startTime, + endTime: form.endTime, + priority: form.priority } try { if (scheduleId.value) { - await updateSchedule(scheduleId.value, payload) + await updateOaSchedule(scheduleId.value, payload) } else { - await createSchedule(payload) + await createOaSchedule(payload) } uni.showToast({ title: '保存成功', icon: 'success' }) setTimeout(() => uni.navigateBack(), 400) } catch (e) { - uni.showToast({ title: '保存失败', icon: 'none' }) + // request 封装已弹出服务端错误提示 } finally { saving.value = false } @@ -308,17 +278,28 @@ async function saveData(datetime) { margin-bottom: 12rpx; } -.field-hint { - display: block; - font-size: 22rpx; - color: $color-text-muted; - margin-bottom: 16rpx; -} - .required { color: #f56c6c; } +.switch-field { + display: flex; + align-items: center; + justify-content: space-between; + + .switch-info { + flex: 1; + } + + .field-label { + margin-bottom: 4rpx; + } + + .form-tip { + margin-top: 0; + } +} + .picker-value { display: flex; align-items: center; @@ -331,12 +312,6 @@ async function saveData(datetime) { color: $color-text; } -.channel-grid { - display: flex; - flex-wrap: wrap; - gap: 16rpx; -} - .form-tip { display: block; font-size: 22rpx; diff --git a/uniapp/pages/tools/schedule/index.vue b/uniapp/pages/tools/schedule/index.vue index 693a880..27aca6c 100644 --- a/uniapp/pages/tools/schedule/index.vue +++ b/uniapp/pages/tools/schedule/index.vue @@ -91,42 +91,31 @@ > - {{ dayLabel(item.datetime) }} - {{ timeText(item.datetime) }} - - - - - {{ item.content || item.title }} - - {{ item.completed ? '已完成' : '待办' }} + {{ dayLabel(item.timestamp) }} + {{ timeRangeText(item) }} + + + + + {{ item.title }} + + {{ item.completed ? '已完成' : '待办' }} + + + + {{ item.priority === 2 ? '紧急' : '重要' }} + + 已设提醒 - - - {{ getRemindMinutesLabel(item.remindMinutes) }} - · 每 {{ item.repeatIntervalMinutes }} 分钟 - - - - - {{ item.completed ? '标为待办' : '标记完成' }} - - - - 编辑 - - - - 删除 - - - - - + @@ -139,12 +128,7 @@