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 @@
-
-
-
- 待办概览
- 逾期 {{ overdue }}
-
-
-
- {{ todayPending }}
- 今日待办
- 共 {{ num(ss.today_total) }} · 完成 {{ num(ss.today_done) }}
-
-
- {{ weekPending }}
- 本周待办
- 共 {{ num(ss.week_total) }} · 完成 {{ num(ss.week_done) }}
-
-
- {{ monthPending }}
- 本月待办
- 共 {{ num(ss.month_total) }} · 完成 {{ num(ss.month_done) }}
-
-
-
-
-
-
-
- 我的报销
-
-
-
- {{ item.label }}
-
- ¥
- {{ money(item.data.paid) }}
+
+
+
+
+
+
+
+
+
+ 公告
- {{ num(item.data.count) }} 单 · 待报 ¥{{ money(item.data.unpaid) }}
-
-
-
-
-
-
-
- 近6个月报销趋势
-
- 已报销
- 未报销
-
-
-
-
-
-
-
+
+ 查看全部
+
- {{ monthLabel(t.month) }}
+
+
+ 暂无公告
+
+
+
+
+
+
+
+ {{ noticeTypeLabel(n.notice_type) }}
+
+ 置顶
+ {{ n.title }}
+
+ {{ noticeTime(n.publish_time) }}
+
+
+
-
-
-
-
- 状态分布
-
-
- {{ s.name }}
-
-
-
- {{ num(s.count) }}单 / ¥{{ money(s.amount) }}
-
-
-
-
-
-
- 报销类型分析
-
-
- {{ e.name }}
-
-
-
- ¥{{ money(e.amount) }}
-
-
-
-
-
-
- 通知公告
-
- 查看全部
-
-
-
-
-
- 暂无公告
-
-
-
-
- {{ noticeTypeLabel(n.notice_type) }}
-
- 置顶
- {{ n.title }}
-
- {{ noticeTime(n.publish_time) }}
-
-
-
-
-
-
- 工作日程提醒
-
- 查看全部
-
-
-
-
-
- 今日暂无日程
-
-
-
-
-
- {{ s.title }}
-
- {{ s.priority === 2 ? '紧急' : '重要' }}
-
+
+
+
+
+
+
+
+ 数据统计
+
+
+
+
+
+
+
+
+
+ 待办
+ 逾期 {{ overdue }}
+
+
+
+
+ {{ todayPending }}
+ 今日
+ 共 {{ num(ss.today_total) }} · 完成 {{ num(ss.today_done) }}
+
+
+ {{ weekPending }}
+ 本周
+ 共 {{ num(ss.week_total) }} · 完成 {{ num(ss.week_done) }}
+
+
+ {{ monthPending }}
+ 本月
+ 共 {{ num(ss.month_total) }} · 完成 {{ num(ss.month_done) }}
+
+
+
+
+
+
+
+
+
+
+ 报销
+
+
+
+
+ ¥
+ {{ money(item.data.paid) }}
+
+ {{ item.label }}
+ {{ num(item.data.count) }} 单 · 待报 ¥{{ money(item.data.unpaid) }}
+
- {{ schedTime(s) }}
-
+
+
+
+
+
+
+
+
+
+
+ 近6个月报销趋势
+
+
+ 已报销
+ 未报销
+
+
+
+
+
+
+
+
+ {{ monthLabel(t.month) }}
+
+
+
+
+
+ 状态分布
+
+ {{ s.name }}
+
+
+
+ {{ num(s.count) }}单 / ¥{{ money(s.amount) }}
+
+
+
+
@@ -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 @@
+
+
+
+ 加载中...
+
+
+
+
+
+ ¥{{ moneyText(detail.total_amount) }}
+
+
+ {{ descText }}
+
+
+ 申请人
+ {{ detail.user_name || '-' }}
+
+
+ 申请日期
+ {{ detail.apply_date }}
+
+
+ 费用笔数
+ {{ items.length }} 笔
+
+
+
+ 创建于 {{ formatTime(detail.create_time) }}
+ 更新于 {{ formatTime(detail.update_time) }}
+
+
+
+
+
+
+ 费用明细
+ ¥{{ moneyText(detail.total_amount) }}
+
+
+ 暂无费用明细
+
+
+
+
+ {{ item.expense_type || '未分类' }}
+ ¥{{ moneyText(item.amount) }}
+
+
+ {{ item.expense_date }}{{ item.quantity > 1 ? ` × ${item.quantity}` : '' }}
+ {{ item.description }}
+
+
+
+
+
+
+ {{ img.name || 'PDF 文件' }}
+ 点击打开
+
+
+
+
+
+
+
+
+
+
+ 审批记录
+
+
+ 暂无审批记录
+
+
+
+
+
+
+ {{ getExpenseActionLabel(record.action) }} · {{ record.approver_name || '-' }}
+
+
+ {{ formatTime(record.create_time) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+ 申请日期 *
+
+
+ {{ form.applyDate }}
+
+
+
+
+
+ 报销说明
+
+
+
+
+
+
+
+ 费用明细
+ 合计 ¥{{ totalText }}
+
+
+
+ 尚未添加费用明细
+
+
+
+
+ {{ item.expenseType || '未分类' }}
+ ¥{{ moneyText(item.amount) }}
+
+
+ {{ item.expenseDate }}
+ 发票 ×{{ item.receipts.length }}
+
+
+
+
+
+
+
+
+
+ 添加费用明细
+
+
+
+
+
+
+
+
+
+ 取消
+ {{ editingIndex >= 0 ? '编辑费用' : '添加费用' }}
+ 确定
+
+
+
+ 费用类型 *
+
+
+ {{ typeNames[typeIndex] || '选择费用类型' }}
+
+
+
+
+
+ 费用日期 *
+
+
+ {{ itemForm.expenseDate }}
+
+
+
+
+
+ 金额 *
+
+
+
+ 数量
+
+
+
+ 说明
+
+
+
+
+ 发票附件
+ 长按可删除
+
+
+
+
+
+
+ {{ img.name || 'PDF 文件' }}
+
+
+
+
+ {{ uploading ? '上传中...' : '上传' }}
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+ 清空
+
+
+
+
+ {{ tab.label }}
+
+
+
+
+
+
+
+ 加载中...
+
+
+
+
+
+
+
+ ¥{{ moneyText(row.total_amount) }}
+
+
+ {{ descText(row) }}
+
+ 申请日期 {{ row.apply_date }}
+
+
+
+
+ {{ list.length ? '没有更多了' : '' }}
+
+
+
+
+
+
+ 新建报销
+
+
+
+
+
+
+
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 @@