diff --git a/.gitignore b/.gitignore index fbd390a..7ca469a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,165 +1,72 @@ -# ---> Go -# If you prefer the allow list template instead of the deny list, see community template: -# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore -# -# Binaries for programs and plugins +# Go binaries and test/build artifacts *.exe *.exe~ *.dll *.so *.dylib - -# Test binary, built with `go test -c` *.test - -# Output of the go coverage tool, specifically when used with LiteIDE *.out - -# Dependency directories (remove the comment below to include it) -# vendor/ - -# Go workspace file go.work go.work.sum -# env file -.env - -# ---> Node -# Logs -logs +# Node dependencies, logs, caches, and build output +node_modules/ +jspm_packages/ +web_modules/ +logs/ *.log npm-debug.log* yarn-debug.log* yarn-error.log* lerna-debug.log* .pnpm-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage +coverage/ *.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration +.nyc_output/ +.grunt/ +bower_components/ .lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ - -# TypeScript cache +build/Release/ *.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache +.npm/ .eslintcache - -# Optional stylelint cache .stylelintcache - -# Microbundle cache .rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history +.rpt2_cache_cjs/ +.rpt2_cache_es/ +.rpt2_cache_umd/ .node_repl_history - -# Output of 'npm pack' *.tgz - -# Yarn Integrity file .yarn-integrity +.cache/ +.parcel-cache/ +.next/ +out/ +.nuxt/ +dist/ +.temp/ +**/.vitepress/dist/ +**/.vitepress/cache/ +.docusaurus/ +.serverless/ +.fusebox/ +.dynamodb/ +.tern-port +.vscode-test/ +.yarn/cache/ +.yarn/unplugged/ +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* -# dotenv environment variable files +# Local environment files .env .env.development.local .env.test.local .env.production.local .env.local -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Next.js build output -.next -out - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# vuepress v2.x temp and cache directory -.temp -.cache - -# vitepress build output -**/.vitepress/dist - -# vitepress cache directory -**/.vitepress/cache - -# Docusaurus cache and generated files -.docusaurus - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* - +# Local OS and editor metadata +.DS_Store +.idea/ +.vscode/ diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..d843143 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,960 @@ +# HotGo 项目开发规范 + +**生成或修改任何代码前,必须完整阅读本文档。** +本规范是项目唯一事实来源,所有新增代码必须严格对齐现有模块风格,不得自创新的代码模式。 + +--- + +## 技术栈 + +| 层 | 技术 | +|----|----------------------------------------------------------------| +| 后端语言 | Go,module 名 `hotgo` | +| 后端框架 | GoFrame v2(gdb、ghttp、gcron、gerror、gctx、gerror、gjson、gvar) | +| 前端框架 | Vue 3 + Vite + TypeScript | +| UI 组件库 | **Naive UI**(优先使用,未经允许不得引入其他 UI 库) | +| 状态管理 | Pinia | +| HTTP 客户端 | 项目封装 `@/utils/http/axios`(`http.request`),禁止直接使用 axios | + +--- + +## 后端目录结构 + +``` +server/ +├── addons/ # 插件模块(每个插件独立微架构,见"插件开发"章节) +│ ├── modules/ # 隐式注册文件(每个插件一个 .go,仅含 import) +│ └── / # 插件目录,与主模块结构镜像 +├── api/admin// # 主模块 HTTP 契约:Req/Res + g.Meta 路由声明 +├── internal/ +│ ├── consts/ # 全局常量与字典选项(枚举在此定义并注册) +│ ├── global/ # 全局公用变量(谨慎添加,尽量少用) +│ ├── controller/admin/sys/ # 薄控制器,只做参数透传,不含业务逻辑 +│ ├── crons/ # 主模块定时任务注册与处理 +│ ├── queues/ # 主模块消息队列消费者注册与处理 +│ ├── logic/sys/ # 业务实现(sSysXxx),init() 注册到 service +│ ├── library/ # 内部基础库(addons、dict、hgorm、cache、queue、cron 等) +│ ├── service/ # 接口声明(ISysXxx)+ 注册函数 +│ ├── dao/ # 对外 DAO;internal/dao/internal/ 为 CLI 生成,禁止手改 +│ ├── model/ +│ │ ├── entity/ # 表结构体(CLI 生成,禁止手改) +│ │ ├── do/ # ORM 写入结构(CLI 生成,禁止手改) +│ │ └── input/sysin/ # 业务入参、出参、过滤结构 +│ └── router/ +│ ├── admin.go # 主路由,末尾调用 genrouter.Register() +│ └── genrouter/ # 每个生成模块一个文件,init() 追加到 LoginRequiredRouter +├── resource/ +│ ├── generate/default/curd/ # 主模块 CRUD 代码生成模板(参考,禁止直接修改) +│ └── generate/default/addon/ # 插件脚手架代码生成模板(参考,禁止直接修改) +└── utility/ # 通用工具:convert、excel、validate 等 +``` + +--- + +## 后端分层约定 + +### 分层职责(禁止跨层调用) + +``` +api(HTTP契约) → controller(参数透传) → service(接口) → logic(业务实现) → dao(数据访问) +``` + +- **controller 层**:不写任何业务逻辑,只转调 service +- **logic 层**:不出现 HTTP 相关代码,所有校验通过 `Filter()` 或 `g.Validator()` 完成 +- **dao 层**:`internal/dao/internal/` 由 CLI 自动生成,禁止手改 + +--- + +### 1. API 层 `api/admin//.go` + +- 每个接口一对 `XxxReq` / `XxxRes`,`g.Meta` 声明路由 +- GET 接口用 `method:"get"`,写操作用 `method:"post"` +- 请求体嵌入 `sysin.XxxInp`,响应体嵌入对应 Model 或空 `struct{}` + +```go +type ListReq struct { + g.Meta `path:"/xxxModule/list" method:"get" tags:"XXX模块" summary:"获取XXX列表"` + sysin.XxxListInp +} +type ListRes struct { + form.PageRes + List []*sysin.XxxListModel `json:"list" dc:"数据列表"` +} +``` + +### 2. Controller 层 `internal/controller/admin/sys/.go` + +- 变量:`var XxxModule = cXxxModule{}`,类型:`type cXxxModule struct{}` +- 只做参数转发和结果组装,禁止直接操作 dao 或写业务逻辑 + +```go +func (c *cXxxModule) List(ctx context.Context, req *xxxmodule.ListReq) (res *xxxmodule.ListRes, err error) { + list, totalCount, err := service.SysXxxModule().List(ctx, &req.XxxListInp) + if err != nil { + return + } + if list == nil { + list = []*sysin.XxxListModel{} + } + res = new(xxxmodule.ListRes) + res.List = list + res.PageRes.Pack(req, totalCount) + return +} +``` + +### 3. Service 层 `internal/service/sys.go` + +- 在已有文件中**追加**接口声明和注册函数,禁止新建文件 +- 声明 `ISysXxxModule` 接口,提供 `SysXxxModule()` 获取函数和 `RegisterSysXxxModule()` 注册函数 + +### 4. Logic 层 `internal/logic/sys/.go` + +- 结构体:`type sSysXxxModule struct{}` +- `init()` 里调用 `service.RegisterSysXxxModule(NewSysXxxModule())` +- `Model()` 方法:`return handler.Model(dao.XxxTable.Ctx(ctx), option...)` +- 列名引用必须用 `dao.XxxTable.Columns().FieldName`,禁止硬编码字符串字段名 +- `Edit` 方法以 `in.Id > 0` 区分更新/新增,更新用 `XxxUpdateFields`,新增用 `XxxInsertFields` +- 字段校验在 `sysin` 的 `Filter(ctx)` 方法完成,logic 层不重复校验 + +### 5. Model 层 `internal/model/input/sysin/.go` + +| 类型 | 用途 | +|------|------| +| `XxxUpdateFields` | 更新时字段白名单 | +| `XxxInsertFields` | 新增时字段白名单 | +| `XxxEditInp` | 嵌入 `entity.XxxTable`,含 `Filter()` 校验方法 | +| `XxxListInp` | 列表查询入参,嵌入 `form.PageInp` | +| `XxxListModel` | 列表返回字段 | +| `XxxViewInp` / `XxxViewModel` | 详情入参/出参 | +| `XxxDeleteInp` | 删除入参(通常含 `Ids []int64`) | +| `XxxStatusInp`、`XxxMaxSortInp` 等 | 其他操作 | + +### 6. 路由注册 `internal/router/genrouter/.go` + +```go +package genrouter + +import "hotgo/internal/controller/admin/sys" + +func init() { + LoginRequiredRouter = append(LoginRequiredRouter, sys.XxxModule) // XXX模块 +} +``` + +新建此文件即可,`genrouter/init.go` 通过 `init()` 链自动加载,无需修改 `admin.go`。 + +--- + +## 字典与枚举规范 + +**字典由后端统一维护**,前端通过固定接口拉取,禁止在前端硬编码枚举值。 + +### 后端:定义与注册(`internal/consts/` 下对应文件) + +```go +// 1. 定义常量 +const ( + XxxStatusEnabled = 1 // 启用 + XxxStatusDisable = 2 // 禁用 +) + +// 2. 定义选项(选择合适的样式函数) +var XxxStatusOptions = []*model.Option{ + dict.GenSuccessOption(XxxStatusEnabled, "启用"), + dict.GenWarningOption(XxxStatusDisable, "禁用"), +} + +// 3. 在 init() 中注册(同文件) +func init() { + dict.RegisterEnums("XxxStatusOptions", "XXX状态选项", XxxStatusOptions) +} +``` + +**样式函数选择规则:** + +| 函数 | 适用场景 | +|------|---------| +| `dict.GenSuccessOption` | 正常、启用、成功 | +| `dict.GenWarningOption` | 待处理、禁用、警告 | +| `dict.GenErrorOption` | 失败、封禁、危险 | +| `dict.GenInfoOption` | 信息类、中性状态 | +| `dict.GenPrimaryOption` | 主要操作、强调 | +| `dict.GenDefaultOption` | 默认、无特殊含义 | +| `dict.GenHashOption` | 不确定数量的动态枚举 | + +### 后端:Logic 层中使用字典 + +```go +// 获取标签文本 +label := dict.GetOptionLabel(consts.XxxStatusOptions, in.Status) + +// 校验是否为合法值 +if !dict.HasOptionKey(consts.XxxStatusOptions, in.Status) { + return gerror.New("状态值不合法") +} +``` + +### 前端:加载与使用字典 + +**加载**(在 `model.ts` 的 `loadOptions()` 中): + +```ts +export function loadOptions() { + dict.loadOptions(['XxxStatusOptions', 'sys_normal_disable']); +} +``` + +**在 `model.ts` 的 columns 中渲染字典标签:** + +```ts +import { useDictStore } from '@/store/modules/dict'; +const dict = useDictStore(); + +// columns 中 +{ + title: '状态', + key: 'status', + render(row) { + return dict.getLabel('XxxStatusOptions', row.status); + } +} +``` + +**在搜索表单 schemas 中使用字典下拉:** + +```ts +{ + field: 'status', + component: 'NSelect', + label: '状态', + componentProps: { + options: computed(() => dict.getOptions('XxxStatusOptions')), + placeholder: '请选择状态', + }, +} +``` + +--- + +## 插件(Addon)开发规范 + +> 定位:独立、临时性、工具类型的功能推荐插件化开发,例如小游戏、广告管理、文章管理、小程序、微商城等。插件之间完全隔离,方便多项目复用。 + +### 插件目录结构 + +每个插件拥有完整的独立微架构,与主模块结构镜像,但 **包路径前缀为 `hotgo/addons//`**: + +``` +server/addons// +├── main.go # 插件入口:定义 module 结构体,实现 Module 接口,init() 注册 +├── global/ +│ ├── global.go # 插件级全局变量 +│ └── init.go # Init(ctx, skeleton),GetSkeleton() 方法 +├── api/ +│ ├── admin/ # 后台接口契约(同主模块 api 写法) +│ ├── api/ # 前台 API 接口契约 +│ └── home/ # 首页接口契约(如有) +├── controller/ +│ ├── admin/sys/ # 后台薄控制器 +│ ├── api/ # 前台控制器 +│ └── home/ # 首页控制器(如有) +├── logic/ +│ ├── logic.go # 匿名导入各 logic 子包触发 init() +│ └── sys/ # 业务实现(同主模块 logic 写法) +├── service/ # 插件内接口声明与注册(独立,不与主模块 service 混用) +├── model/ +│ └── input/sysin/ # 插件内入参/出参(调用主模块服务时继承主模块 input 结构) +├── router/ +│ ├── admin.go # 注册后台路由,使用 addons.RouterPrefix() 获取路由前缀 +│ ├── api.go # 注册前台路由 +│ ├── home.go # 注册首页路由(如有) +│ ├── websocket.go # 注册 WebSocket 路由(如有) +│ └── genrouter/ +│ ├── init.go # 插件版 genrouter:Register() 使用插件前缀 +│ └── *.go # 每个生成模块一个文件,追加到插件 LoginRequiredRouter +├── consts/ # 插件内常量与字典(同主模块 consts 写法) +├── crons/ # 插件定时任务(可选) +├── queues/ # 插件消息队列消费者(可选) +└── resource/ # 插件静态资源与模板(可选) +``` + +**对应前端目录:** + +``` +web/src/ +├── api/addons// # 插件前端 API 封装 +└── views/addons// # 插件前端页面 +``` + +### 插件入口 `main.go` + +```go +package + +import ( + "context" + "github.com/gogf/gf/v2/net/ghttp" + _ "hotgo/addons//crons" + "hotgo/addons//global" + _ "hotgo/addons//logic" + _ "hotgo/addons//queues" + "hotgo/addons//router" + "hotgo/internal/library/addons" + "hotgo/internal/service" + "sync" +) + +type module struct { + skeleton *addons.Skeleton + ctx context.Context + sync.Mutex +} + +func init() { newModule() } + +func newModule() { + m := &module{ + skeleton: &addons.Skeleton{ + Label: "插件显示名", + Name: "", // 与目录名一致 + Group: 1, + Brief: "简介", + Description: "详细描述", + Author: "作者", + Version: "v1.0.0", + }, + ctx: gctx.New(), + } + addons.RegisterModule(m) +} + +func (m *module) Start(option *addons.Option) (err error) { + global.Init(m.ctx, m.skeleton) + option.Server.Group("/", func(group *ghttp.RouterGroup) { + group.Middleware(service.Middleware().Addon) + router.Admin(m.ctx, group) + router.Api(m.ctx, group) + }) + return +} +// 其余方法:Stop、Ctx、GetSkeleton、Install、Upgrade、UnInstall(默认留空) +``` + +### 插件路由前缀规则 + +``` +后台:/admin//接口路径 → 对应 controller/admin/sys/ +前台:/api//接口路径 → 对应 controller/api/ +首页:/home//接口路径 → 对应 controller/home/ +WebSocket:/socket//接口路径 +``` + +路由前缀通过 `addons.RouterPrefix(ctx, consts.AppAdmin, global.GetSkeleton().Name)` 自动生成,**禁止在路由文件里硬编码路径前缀**。 + +### 插件 genrouter 与主模块的区别 + +插件 `genrouter/init.go` 的 `Register()` 函数需要传入 `ctx` 和 `group`,并使用插件路由前缀: + +```go +// 插件 genrouter/init.go +func Register(ctx context.Context, group *ghttp.RouterGroup) { + prefix := addons.RouterPrefix(ctx, consts.AppAdmin, global.GetSkeleton().Name) + group.Group(prefix, func(group *ghttp.RouterGroup) { + group.Middleware(service.Middleware().AdminAuth) + if len(LoginRequiredRouter) > 0 { + group.Bind(LoginRequiredRouter...) + } + }) +} + +// 插件 genrouter/.go +func init() { + LoginRequiredRouter = append(LoginRequiredRouter, sys.XxxModule) +} +``` + +参考实现:`server/addons/hgexample/router/genrouter/` + +### 插件调用主模块服务 + +**在插件 input 层继承主模块 input 结构,解耦参数依赖**,避免 import cycle: + +```go +// 插件 model/input/sysin/config.go +package sysin + +import "hotgo/internal/model/input/sysin" + +type UpdateConfigInp struct { + sysin.UpdateAddonsConfigInp +} +``` + +```go +// 插件 logic 中调用主模块服务 +import isc "hotgo/internal/service" + +func (s *sSysConfig) UpdateConfigByGroup(ctx context.Context, in sysin.UpdateConfigInp) error { + in.UpdateAddonsConfigInp.AddonName = global.GetSkeleton().Name + return isc.SysAddonsConfig().UpdateConfigByGroup(ctx, in.UpdateAddonsConfigInp) +} +``` + +### 插件获取自身信息 + +```go +// 插件内部 +global.GetSkeleton() + +// 任意位置判断当前请求是否为插件请求 +contexts.IsAddonRequest(ctx) +contexts.GetAddonName(ctx) +``` + +### 插件隐式注册 + +在 `server/addons/modules/` 下新建 `.go`,内容仅含一行匿名导入: + +```go +package modules + +import _ "hotgo/addons/" +``` + +### 新增插件检查清单 + +**后端:** +- [ ] `addons//main.go` — 插件入口,实现 Module 接口 +- [ ] `addons//global/` — global.go + init.go +- [ ] `addons/modules/.go` — 隐式注册 +- [ ] `addons//service/` — 插件内接口声明(独立包) +- [ ] `addons//logic/logic.go` — 匿名导入触发 init() +- [ ] `addons//logic/sys/.go` — 业务实现 +- [ ] `addons//model/input/sysin/.go` — 入参/出参 +- [ ] `addons//api/admin//.go` — API 契约 +- [ ] `addons//controller/admin/sys/.go` — 薄控制器 +- [ ] `addons//router/admin.go` — 路由注册 +- [ ] `addons//router/genrouter/init.go` — 插件 genrouter +- [ ] `addons//router/genrouter/.go` — 模块路由追加 + +**前端:** +- [ ] `web/src/api/addons//index.ts` — API 封装 +- [ ] `web/src/views/addons//model.ts` — State、schemas、columns +- [ ] `web/src/views/addons//index.vue` — 列表页 +- [ ] `web/src/views/addons//edit.vue` — 编辑页 + +参考实现:`server/addons/hgexample/`(完整插件示例)、`server/resource/generate/default/addon/`(生成模板) + +--- + +## 标准 CRUD 接口清单 + +| 接口 | method | 说明 | +|------|--------|------| +| `/xxx/list` | GET | 分页列表 | +| `/xxx/view` | GET | 详情 | +| `/xxx/edit` | POST | 新增/编辑(id>0 为编辑) | +| `/xxx/delete` | POST | 删除(支持批量,传 ids) | +| `/xxx/status` | POST | 启用/禁用状态切换 | +| `/xxx/switch` | POST | 开关字段切换 | +| `/xxx/maxSort` | GET | 获取最大排序值 | +| `/xxx/export` | GET | 导出列表 | + +按实际需求裁剪,不强制全部实现。 + +--- + +## 前端目录结构 + +``` +web/src/ +├── api//index.ts # HTTP 请求封装 +├── views// +│ ├── index.vue # 列表页 +│ ├── edit.vue # 新增/编辑弹窗 +│ └── model.ts # State 类、rules、schemas、columns、loadOptions +├── components/ # 通用组件(BasicTable、BasicForm、BasicModal 等) +├── store/modules/dict.ts # 字典 store(loadOptions、getLabel、getOptions) +└── utils/ + ├── http/axios.ts # HTTP 封装(http.request / jumpExport) + └── dateUtil.ts # 日期工具(defRangeShortcuts 等) +``` + +--- + +## 前端编码约定 + +### API 文件 `api//index.ts` + +- 使用 `http.request`,禁止直接使用 axios +- 函数名与接口语义一致:`List`、`Edit`、`Delete`、`View`、`Status`、`Switch`、`Export`、`MaxSort` +- 导出接口用 `jumpExport('/xxx/export', params)` + +```ts +import { http, jumpExport } from '@/utils/http/axios'; + +export function List(params) { + return http.request({ url: '/xxxModule/list', method: 'get', params }); +} +export function Edit(params) { + return http.request({ url: '/xxxModule/edit', method: 'POST', params }); +} +export function Export(params) { + jumpExport('/xxxModule/export', params); +} +``` + +### model.ts 结构 + +- `class State`:属性与后端 entity 字段对应,提供合理默认值 +- `newState()`:工厂函数,支持深拷贝(`cloneDeep`) +- `rules`:Naive UI 表单校验规则 +- `schemas`:搜索栏 `FormSchema[]`(`ref` 包装) +- `columns`:表格列定义,含权限守卫的操作用 `hasPermission(['/xxx/edit'])` +- `loadOptions()`:调用 `dict.loadOptions([...])`,预加载字典数据 + +### 组件使用规范 + +**必须优先使用 Naive UI 原生组件**,能用 Naive UI 实现的禁止自行封装替代组件: + +| 场景 | 必须使用的组件 | +|------|--------------| +| 表格 | 项目封装 `BasicTable`(基于 Naive UI) | +| 表单 | 项目封装 `BasicForm`(基于 Naive UI) | +| 弹窗 | `n-modal` 或项目封装 `BasicModal` | +| 按钮 | `n-button`,类型用 `primary`/`default`/`error` 等语义值 | +| 选择器 | `n-select`(字典下拉)、`n-tree-select`(树形) | +| 开关 | `n-switch`,配合 Switch 接口 | +| 输入框 | `n-input` | +| 日期选择 | `n-date-picker`,范围选择配合 `defRangeShortcuts()` | +| 图片渲染 | `renderImage(url)` | +| 文件渲染 | `renderFile(url)` | +| 成员信息 | `renderPopoverMemberSumma(summa)` | + +**禁止行为:** +- 禁止引入 Element Plus、Ant Design Vue 等其他 UI 库 +- 禁止使用内联 style(使用 Naive UI 的 props 或 class) +- 禁止在模板里硬编码字典值文本,必须通过 `dict.getLabel()` 渲染 + +### 权限控制 + +```ts +import { usePermission } from '@/hooks/web/usePermission'; +const { hasPermission } = usePermission(); + +// 模板中 +v-if="hasPermission(['/xxxModule/edit'])" + +// columns 中开关操作 +disabled: !hasPermission(['/xxxModule/switch']) +``` + +权限标识与后端路由路径保持一致,**路由由后端菜单数据驱动,禁止在源码里硬编码路由路径**。 + +### Vue 3 代码规范 + +- 使用 Composition API(` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sidebar.md b/sidebar.md new file mode 100644 index 0000000..e3e9b8d --- /dev/null +++ b/sidebar.md @@ -0,0 +1,58 @@ +- 介绍安装 + + - [系统介绍](../../README.md) + - [环境搭建](/docs/guide-zh-CN/start-environment.md) + - [系统安装](/docs/guide-zh-CN/start-installation.md) + - [生产部署](/docs/guide-zh-CN/start-deploy.md) + - [如何提问](/docs/guide-zh-CN/start-questions.md) + - [常见问题](/docs/guide-zh-CN/start-issue.md) + - [更新历史](/docs/guide-zh-CN/start-update-log.md) + + +- 系统开发 + + - [目录结构](/docs/guide-zh-CN/sys-catalog.md) + - [开发规范](/docs/guide-zh-CN/sys-exploit.md) + - [控制台](/docs/guide-zh-CN/sys-console.md) + - [中间件/拦截器](/docs/guide-zh-CN/sys-middleware.md) + - [WebHook](/docs/guide-zh-CN/sys-webhook.md) + - [权限控制](/docs/guide-zh-CN/sys-auth.md) + - [支付网关](/docs/guide-zh-CN/sys-payment.md) + - [定时任务](/docs/guide-zh-CN/sys-cron.md) + - [消息队列](/docs/guide-zh-CN/sys-queue.md) + - [功能扩展库](/docs/guide-zh-CN/sys-library.md) + - [工具方法](/docs/guide-zh-CN/sys-utility.md) + - [WebSocket服务器](/docs/guide-zh-CN/sys-websocket-server.md) + - [TCP服务器](/docs/guide-zh-CN/sys-tcp-server.md) + - [SaaS多租户](/docs/guide-zh-CN/sys-tenant.md) + - [国际化](/docs/guide-zh-CN/sys-i18n.md) + - [单元测试](/docs/guide-zh-CN/sys-test.md) + + +- 插件模块开发 + + - [模块介绍及目录](/docs/guide-zh-CN/addon-introduce-catalog.md) + - [模块开发流程](/docs/guide-zh-CN/addon-flow.md) + - [模块辅助说明](/docs/guide-zh-CN/addon-helper.md) + + +- 生成代码 + - [使用前提](/docs/guide-zh-CN/code-start.md) + - [数据库](/docs/guide-zh-CN/sys-db.md) + - [生成配置](/docs/guide-zh-CN/code-config.md) + - [生成CURD](/docs/guide-zh-CN/code-curd.md) + - [生成关联表CURD](/docs/guide-zh-CN/code-curd-join.md) + - [生成树型CURD](/docs/guide-zh-CN/code-tree.md) + - [生成业务模板](/docs/guide-zh-CN/code-business.md) + - [生成模板开发](/docs/guide-zh-CN/code-template-dev.md) + - [生成常见问题](/docs/guide-zh-CN/code-help.md) + + +- 前端开发 + - [表单组件](/docs/guide-zh-CN/web-form.md) + - [WebSocket客户端](/docs/guide-zh-CN/sys-websocket-client.md) + - [独立部署](/docs/guide-zh-CN/web-deploy.md) + + +- 附录 + - [网址收录](/docs/guide-zh-CN/append-website.md) \ No newline at end of file diff --git a/tools/__pycache__/build_reference_prd.cpython-312.pyc b/tools/__pycache__/build_reference_prd.cpython-312.pyc new file mode 100644 index 0000000..57e414d Binary files /dev/null and b/tools/__pycache__/build_reference_prd.cpython-312.pyc differ diff --git a/tools/build_admin_prd.py b/tools/build_admin_prd.py new file mode 100644 index 0000000..4ddeea5 --- /dev/null +++ b/tools/build_admin_prd.py @@ -0,0 +1,800 @@ +from __future__ import annotations + +from datetime import date +from pathlib import Path + +from PIL import Image, ImageDraw +from docx import Document +from docx.enum.text import WD_ALIGN_PARAGRAPH +from docx.oxml import OxmlElement +from docx.oxml.ns import qn +from docx.shared import Inches, Pt, RGBColor + +from build_reference_prd import ( + INK, MUTED, add_page_number, add_picture, add_table, bullet, font, + heading, numbered, p, page_break, rounded, set_run_font, text, +) + + +ROOT = Path(__file__).resolve().parents[1] +OUT_DIR = ROOT / "docs" / "admin_reference_prd" +ASSET_DIR = OUT_DIR / "assets" +OUT_DOCX = OUT_DIR / "后台管理系统需求文档.docx" + +NAV_BG = "#191B20" +TOP_BG = "#FFFFFF" +PAGE_BG = "#F3F5F8" +TEAL = "#4F958E" +BLUE = "#5A7BEF" +RED = "#D95E62" +ORANGE = "#E39B3C" +PURPLE = "#8C54CC" +GREEN = "#45A06B" + + +def ui_text(draw, xy, value, size=20, fill="#202631", bold=False, anchor=None): + text(draw, xy, value, size=size, fill=fill, bold=bold, anchor=anchor) + + +def desktop_base(title: str, active: str): + im = Image.new("RGB", (1600, 900), PAGE_BG) + d = ImageDraw.Draw(im) + d.rectangle((0, 0, 250, 900), fill=NAV_BG) + d.rectangle((250, 0, 1600, 66), fill=TOP_BG) + ui_text(d, (125, 34), "DD后台", 23, "white", anchor="mm") + ui_text(d, (278, 34), "☰", 24, "#333A46", anchor="mm") + ui_text(d, (330, 34), "↻", 24, "#333A46", anchor="mm") + ui_text(d, (1530, 34), "admin ▾", 18, "#333A46", anchor="mm") + groups = [ + ("主页", ["首页", "网站设置", "文本管理", "Banner设置", "手工商城"]), + ("会员管理", ["会员列表", "会员等级", "任务大厅"]), + ("交易管理", ["订单列表", "充值管理", "提现管理", "客服管理"]), + ("商城管理", ["商品列表"]), + ("任务管理", ["任务列表", "会员任务审核"]), + ("管理员", ["后台管理员", "角色管理", "权限管理", "数据字典"]), + ("设置", ["基本资料", "修改密码"]), + ] + y = 85 + for group, children in groups: + ui_text(d, (24, y), group, 17, "#D9DEE7") + y += 34 + if active in children or active == group: + for child in children: + if child == active: + d.rectangle((0, y - 6, 250, y + 27), fill=TEAL) + ui_text(d, (50, y + 10), child, 16, "white", anchor="lm") + else: + ui_text(d, (50, y + 10), child, 15, "#C9CFD8", anchor="lm") + y += 34 + y += 10 + d.rectangle((250, 66, 1600, 112), fill="#FFFFFF") + ui_text(d, (282, 89), "⌂", 19, "#596273", anchor="mm") + ui_text(d, (322, 89), title, 17, "#596273", anchor="lm") + return im, d + + +def metric_card(d, box, label, value, sub1, sub2, color): + rounded(d, box, 8, color) + x1, y1, x2, y2 = box + ui_text(d, (x1 + 28, y1 + 36), label, 20, "white") + ui_text(d, (x1 + 28, y1 + 84), value, 32, "white", bold=True) + ui_text(d, (x1 + 28, y1 + 123), sub1, 16, "white") + ui_text(d, (x1 + 28, y1 + 151), sub2, 16, "white") + + +def dashboard_proto(): + im, d = desktop_base("首页", "首页") + ui_text(d, (275, 142), "商城统计", 18, "#333A46") + cards = [ + ("用户总量", "5,038", "今日注册 13", "昨日注册 21", "#D95B83"), + ("充值用户总量", "2,609", "今日新增 7", "昨日新增 15", "#E86866"), + ("商品总量", "705", "今日新增 0", "昨日新增 0", "#5BA4CF"), + ("订单总量", "75,548", "今日新增 243", "昨日新增 264", "#9851CF"), + ("订单总金额", "87,576,426.20", "今日新增 155,616.00", "昨日新增 554,758.90", "#5755B7"), + ("用户充值", "40,145,160.82", "今日新增 59,828.00", "昨日新增 230,469.00", "#E6AF1E"), + ("用户提现", "3,500,782.79", "今日新增 2,316.04", "昨日新增 4,648.47", "#D96E19"), + ("抢单佣金", "2,315,790.44", "今日新增 6,073.24", "昨日新增 13,803.84", "#833052"), + ] + for i, c in enumerate(cards): + col, row = i % 2, i // 2 + x = 275 + col * 645 + y = 165 + row * 170 + metric_card(d, (x, y, x + 615, y + 150), *c) + return im + + +def list_proto(title: str, active: str, filters, headers, rows, action_label, sensitive=False): + im, d = desktop_base(title, active) + x0, y0 = 280, 140 + for i, label in enumerate(filters): + x = x0 + (i % 4) * 300 + y = y0 + (i // 4) * 58 + ui_text(d, (x, y), label, 15, "#374151") + rounded(d, (x + 72, y - 10, x + 270, y + 25), 4, "white", "#D5DAE2") + ui_text(d, (x + 86, y + 7), "请输入 / 请选择", 13, "#9AA2AE", anchor="lm") + top = y0 + ((len(filters) - 1) // 4 + 1) * 58 + rounded(d, (280, top, 360, top + 38), 4, BLUE) + ui_text(d, (320, top + 20), "搜索", 15, "white", anchor="mm") + rounded(d, (370, top, 465, top + 38), 4, RED) + ui_text(d, (418, top + 20), "批量删除", 15, "white", anchor="mm") + rounded(d, (475, top, 555, top + 38), 4, TEAL) + ui_text(d, (515, top + 20), "添加", 15, "white", anchor="mm") + table_y = top + 58 + widths = [120] + [max(100, int(1050 / max(1, len(headers) - 1))) for _ in headers[1:]] + scale = 1270 / sum(widths) + widths = [int(w * scale) for w in widths] + x = 275 + for i, h in enumerate(headers): + d.rectangle((x, table_y, x + widths[i], table_y + 46), fill="#405D8E") + ui_text(d, (x + widths[i] / 2, table_y + 24), h, 13, "white", anchor="mm") + x += widths[i] + for ridx, row in enumerate(rows): + y = table_y + 46 + ridx * 54 + x = 275 + for i, val in enumerate(row): + fill = "white" if ridx % 2 == 0 else "#F7F9FC" + d.rectangle((x, y, x + widths[i], y + 54), fill=fill, outline="#DDE2EA") + display = val + if sensitive and i in (1, 2, 3): + display = val + ui_text(d, (x + 8, y + 27), display[:18], 12, "#2C3440", anchor="lm") + x += widths[i] + rounded(d, (1180, table_y + 240, 1515, table_y + 288), 6, "#FFF7E6", "#E5B45A") + ui_text(d, (1195, table_y + 264), action_label, 13, "#915F14", anchor="lm") + ui_text(d, (280, 860), "共 5,038 条 30 条/页 1 2 3 …", 13, "#667085") + return im + + +def modal_proto(): + im = list_proto( + "会员列表", "会员列表", ["用户名", "手机号", "注册时间", "状态", "自动派单"], + ["ID", "账号", "绑卡姓名", "用户名", "余额", "状态", "操作"], + [["8165", "155****7676", "王**", "会员 A", "299.00", "正常", "编辑 / 银行卡 / 地址 / 团队"], + ["8164", "180****8046", "—", "会员 B", "0.00", "正常", "账变 / 奖励金 / 禁用"]], + "敏感信息默认脱敏;查看需授权并留痕", True, + ) + overlay = Image.new("RGBA", im.size, (0, 0, 0, 85)) + im = Image.alpha_composite(im.convert("RGBA"), overlay).convert("RGB") + d = ImageDraw.Draw(im) + rounded(d, (560, 155, 1285, 785), 10, "white", "#D2D7E0") + d.rectangle((560, 155, 1285, 208), fill="#F6F7F9") + ui_text(d, (590, 182), "添加会员", 21, "#202631", bold=True, anchor="lm") + ui_text(d, (1250, 182), "×", 23, "#667085", anchor="mm") + fields = ["标记", "用户名称", "手机号码", "账户余额", "冻结金额", "会员等级", "交易状态", "登录密码", "交易密码", "上级ID", "信用分"] + for i, lab in enumerate(fields): + col, row = i % 2, i // 2 + x = 595 + col * 330 + y = 238 + row * 74 + ui_text(d, (x, y), lab, 15, "#3C4450") + rounded(d, (x, y + 20, x + 290, y + 56), 4, "white", "#CBD2DC") + rounded(d, (975, 725, 1065, 765), 5, BLUE) + rounded(d, (1078, 725, 1168, 765), 5, "#E8EBF0") + ui_text(d, (1020, 746), "确定", 15, "white", anchor="mm") + ui_text(d, (1123, 746), "取消", 15, "#3F4651", anchor="mm") + return im + + +def finance_proto(): + im, d = desktop_base("提现管理", "提现管理") + x0 = 280 + ui_text(d, (x0, 150), "订单号", 15) + rounded(d, (350, 132, 560, 170), 4, "white", "#D4DAE3") + ui_text(d, (600, 150), "用户名", 15) + rounded(d, (670, 132, 880, 170), 4, "white", "#D4DAE3") + rounded(d, (900, 132, 980, 170), 4, BLUE) + ui_text(d, (940, 151), "搜索", 15, "white", anchor="mm") + headers = ["提现用户", "余额", "提现金额", "手续费", "实际到账", "银行", "银行卡号", "发起时间", "处理时间", "操作"] + xs = [280, 420, 520, 630, 740, 855, 970, 1120, 1300, 1450, 1570] + for i, h in enumerate(headers): + d.rectangle((xs[i], 210, xs[i + 1], 258), fill="#405D8E") + ui_text(d, ((xs[i] + xs[i + 1]) / 2, 234), h, 12, "white", anchor="mm") + rows = [ + ["会员 A", "300.00", "48.38", "0.00", "48.38", "农业银行", "6228 **** **** 7161", "10-07 17:23", "—", "通过 / 驳回"], + ["会员 B", "2,940.00", "500.00", "2.00", "498.00", "邮储银行", "6217 **** **** 3408", "10-07 16:21", "16:34", "审核通过"], + ["会员 C", "718.35", "100.00", "1.00", "99.00", "建设银行", "6236 **** **** 5670", "10-07 15:25", "15:48", "审核驳回"], + ] + for r, row in enumerate(rows): + y = 258 + r * 62 + for i, val in enumerate(row): + d.rectangle((xs[i], y, xs[i + 1], y + 62), fill="white" if r % 2 == 0 else "#F7F9FC", outline="#DDE2EA") + ui_text(d, (xs[i] + 7, y + 32), val, 11, "#2C3440", anchor="lm") + rounded(d, (305, 520, 785, 740), 10, "#FFF4F0", "#E98E73") + ui_text(d, (335, 558), "P0 资金审核要求", 22, RED, bold=True) + for i, line in enumerate(["完整银行卡号仅在授权后临时查看", "通过/驳回必须填写原因", "大额或异常订单双人复核", "幂等、余额校验、审计日志不可缺失"]): + ui_text(d, (340, 610 + i * 34), "• " + line, 16, "#523129") + rounded(d, (845, 520, 1515, 740), 10, "#EFF6FF", "#7AA2E8") + ui_text(d, (875, 558), "审核抽屉", 22, BLUE, bold=True) + for i, lab in enumerate(["订单摘要与风险命中", "收款信息(脱敏)", "凭证预览", "处理意见与复核人"]): + ui_text(d, (880, 610 + i * 34), "□ " + lab, 16, "#2D466B") + return im + + +def rbac_proto(): + im, d = desktop_base("角色管理", "角色管理") + ui_text(d, (280, 150), "角色与权限矩阵", 22, "#202631", bold=True) + headers = ["角色", "会员", "订单", "充值", "提现", "内容", "配置", "账号/权限", "导出"] + xs = [280, 470, 590, 710, 830, 950, 1070, 1190, 1400, 1535] + for i, h in enumerate(headers): + d.rectangle((xs[i], 190, xs[i + 1], 240), fill="#405D8E") + ui_text(d, ((xs[i] + xs[i + 1]) / 2, 216), h, 13, "white", anchor="mm") + rows = [ + ("超级管理员", ["读写", "读写", "复核", "复核", "发布", "发布", "管理", "授权"]), + ("运营", ["读", "读", "无", "无", "编辑", "草稿", "无", "无"]), + ("客服", ["脱敏读", "读", "只读", "只读", "无", "无", "无", "无"]), + ("财务", ["脱敏读", "读", "审核", "审核", "无", "无", "无", "受控"]), + ("风控", ["受控查看", "冻结", "复核", "复核", "无", "只读", "无", "受控"]), + ("审计员", ["只读", "只读", "只读", "只读", "只读", "只读", "只读", "受控"]), + ] + colors = {"无": "#E9EDF3", "只读": "#E8F1FF", "读": "#E8F1FF", "脱敏读": "#E8F1FF", "读写": "#E9F7ED", "编辑": "#E9F7ED", "发布": "#FFF1D8", "审核": "#FFF1D8", "复核": "#FFE4E4", "管理": "#FFE4E4", "授权": "#FFE4E4", "冻结": "#FFE4E4", "受控": "#F2E9FF", "受控查看": "#F2E9FF", "草稿": "#E9F7ED"} + for r, (role, vals) in enumerate(rows): + y = 240 + r * 62 + d.rectangle((xs[0], y, xs[1], y + 62), fill="white", outline="#DDE2EA") + ui_text(d, (xs[0] + 14, y + 32), role, 14, "#2C3440", anchor="lm") + for i, val in enumerate(vals, 1): + d.rectangle((xs[i], y, xs[i + 1], y + 62), fill=colors.get(val, "white"), outline="#DDE2EA") + ui_text(d, ((xs[i] + xs[i + 1]) / 2, y + 32), val, 12, "#364152", anchor="mm") + rounded(d, (280, 665, 1535, 792), 10, "#FFF8E8", "#E1B454") + ui_text(d, (310, 705), "关键原则", 20, "#7B5314", bold=True) + ui_text(d, (310, 746), "最小权限 · 职责分离 · 敏感字段临时授权 · 权限变更双人复核 · 全量审计", 18, "#7B5314") + return im + + +def flow_proto(): + im = Image.new("RGB", (1600, 900), "white") + d = ImageDraw.Draw(im) + ui_text(d, (800, 60), "C 端与后台业务闭环", 32, "#202631", bold=True, anchor="mm") + lanes = [("会员", 150, "#EAF1FF"), ("系统", 390, "#EAF8F0"), ("运营/财务", 630, "#FFF4E0")] + for name, y, color in lanes: + rounded(d, (70, y, 1530, y + 160), 16, color) + rounded(d, (90, y + 45, 220, y + 115), 14, "white", "#BCC6D4") + ui_text(d, (155, y + 80), name, 21, "#303846", bold=True, anchor="mm") + boxes = [ + ("注册/登录", 270, 175, BLUE), ("绑定资料", 500, 175, BLUE), ("领取任务", 730, 175, BLUE), ("提交结果", 960, 175, BLUE), ("查看台账", 1190, 175, BLUE), + ("身份与风控", 270, 415, GREEN), ("创建订单", 500, 415, GREEN), ("冻结/解冻", 730, 415, GREEN), ("结算与幂等", 960, 415, GREEN), ("通知与申诉", 1190, 415, GREEN), + ("会员配置", 270, 655, ORANGE), ("内容/商品", 500, 655, ORANGE), ("任务审核", 730, 655, ORANGE), ("充值/提现复核", 960, 655, ORANGE), ("审计/对账", 1190, 655, ORANGE), + ] + for label, x, y, color in boxes: + rounded(d, (x, y, x + 175, y + 70), 12, color) + ui_text(d, (x + 88, y + 36), label, 16, "white", bold=True, anchor="mm") + for y in (210, 450, 690): + for x in (450, 680, 910, 1140): + ui_text(d, (x, y), "→", 27, "#687386", anchor="mm") + for x in (357, 587, 817, 1047, 1277): + ui_text(d, (x, 355), "↕", 27, "#687386", anchor="mm") + ui_text(d, (x, 595), "↕", 27, "#687386", anchor="mm") + return im + + +def save_assets(): + ASSET_DIR.mkdir(parents=True, exist_ok=True) + assets = { + "prototype_01_dashboard.png": dashboard_proto(), + "prototype_02_member_list.png": list_proto( + "会员列表", "会员列表", ["用户名", "手机号", "注册时间", "状态", "自动派单"], + ["ID", "账号", "绑卡姓名", "用户名", "余额", "状态", "操作"], + [["8165", "155****7676", "王**", "会员 A", "299.00", "正常", "编辑 / 银行卡 / 地址"], + ["8164", "180****8046", "—", "会员 B", "0.00", "正常", "团队 / 账变 / 奖励金"]], + "删除、禁用、设为假人均需二次确认与理由", True, + ), + "prototype_03_member_modal.png": modal_proto(), + "prototype_04_withdrawal.png": finance_proto(), + "prototype_05_rbac.png": rbac_proto(), + "prototype_06_flow.png": flow_proto(), + } + paths = [] + for name, image in assets.items(): + path = ASSET_DIR / name + image.save(path, quality=94) + paths.append(path) + return paths + + +def configure_doc(doc: Document): + sec = doc.sections[0] + sec.page_width = Inches(8.5) + sec.page_height = Inches(11) + sec.top_margin = Inches(0.64) + sec.bottom_margin = Inches(0.62) + sec.left_margin = Inches(0.68) + sec.right_margin = Inches(0.68) + normal = doc.styles["Normal"] + normal.font.name = "Heiti SC" + normal._element.rPr.rFonts.set(qn("w:eastAsia"), "Heiti SC") + normal.font.size = Pt(10.2) + normal.font.color.rgb = RGBColor.from_string(INK) + for name, size in (("Title", 27), ("Heading 1", 17.5), ("Heading 2", 13.5), ("Heading 3", 11.3)): + st = doc.styles[name] + st.font.name = "Heiti SC" + st._element.rPr.rFonts.set(qn("w:eastAsia"), "Heiti SC") + st.font.size = Pt(size) + st.font.color.rgb = RGBColor(0, 0, 0) + st.font.bold = True + header = sec.header.paragraphs[0] + header.alignment = WD_ALIGN_PARAGRAPH.RIGHT + set_run_font(header.add_run("后台管理系统需求文档"), size=8.5, color=MUTED) + add_page_number(sec.footer.paragraphs[0]) + + +def add_cover(doc: Document): + title = doc.add_paragraph(style="Title") + title.alignment = WD_ALIGN_PARAGRAPH.LEFT + title.paragraph_format.space_before = Pt(72) + title.paragraph_format.space_after = Pt(20) + title_pr = title._p.get_or_add_pPr() + border = OxmlElement("w:pBdr") + for edge in ("top", "left", "bottom", "right", "between"): + node = OxmlElement("w:" + edge) + node.set(qn("w:val"), "nil") + border.append(node) + title_pr.append(border) + set_run_font(title.add_run("后台管理系统需求文档"), size=27, bold=True, color="000000") + sub = doc.add_paragraph() + set_run_font(sub.add_run("参考管理端功能拆解、C 端映射与安全重构方案"), size=15.5, bold=True, color="000000") + sub.paragraph_format.space_after = Pt(32) + p(doc, "目标:基于参考管理系统的实际页面、按钮、链接与弹窗,形成可直接用于产品设计、前后端开发、测试和运维的后台需求基线;保留业务闭环,不复制品牌资产和真实用户数据。") + p(doc, "主要读者:产品负责人、交互设计师、前端开发、后端开发、测试、运营、客服、财务、风控、安全与审计。") + p(doc, f"观察日期:{date(2026, 10, 7).isoformat()} 参考环境:Web 管理后台 文档版本:V1.0") + p(doc, "结论:后台覆盖门户配置、会员、交易、商品、任务、RBAC 与个人设置七大域。复刻时应优先修复敏感数据裸露、资金操作单人审批、配置无校验、接口错误和审计不足。") + page_break(doc) + + +def add_scope(doc): + heading(doc, "1 文档范围与走查方法", 1) + p(doc, "本需求对后台 21 个可见页面入口进行了逐项走查,并打开新增、编辑、查看、分配、审核等代表性弹窗。为了保护现网数据,没有执行最终确定、上传、删除、禁用、设为假人、审核通过或驳回、资金调整、奖励金发放、权限保存和改密。") + heading(doc, "1.1 已覆盖入口", 2) + add_table(doc, ["一级模块", "页面", "主要控件"], [ + ("主页", "首页、网站设置、文本管理、Banner 设置、手工商城", "指标卡、保存、上传、编辑、删除、发布"), + ("会员管理", "会员列表、会员等级、任务大厅", "搜索、新增、编辑、团队、账变、奖励金、等级配置"), + ("交易管理", "订单、充值、提现、客服", "筛选、自动刷新、匹配、凭证、审核、客服嵌入"), + ("商城管理", "商品列表", "搜索、新增、编辑、推荐、删除、富文本"), + ("任务管理", "任务列表、会员任务审核", "任务新增、编辑、通过、驳回"), + ("管理员", "后台管理员、角色、权限、数据字典", "账号、角色、权限树、配置项"), + ("设置", "基本资料、修改密码", "资料修改、密码修改"), + ], [0.95, 2.7, 2.95]) + heading(doc, "1.2 操作边界", 2) + for item in [ + "只验证页面、按钮和弹窗是否可达,未提交会改变会员、资金、权限或配置的数据。", + "删除、禁用、设为假人、审核、账变、奖励金、改密等高风险入口仅记录需求,不执行最终动作。", + "原型图基于实测界面脱敏重绘,手机号、姓名、IP、银行卡、订单号均为掩码或虚构值。", + "接口名称以推荐实现命名;现网真实接口需在开发前通过代码或服务端文档二次核验。", + ]: + bullet(doc, item) + heading(doc, "1.3 证据等级", 2) + add_table(doc, ["等级", "定义", "使用方式"], [ + ("A 实测", "页面、按钮、表格或弹窗在走查中直接可见", "可作为复刻基线"), + ("B 推导", "由相邻页面、C 端闭环或字段关系推导", "开发前需确认"), + ("C 建议", "为安全、合规、可用性提出的重构要求", "作为新系统强制规范"), + ], [0.8, 3.3, 2.5]) + + +def add_architecture(doc): + heading(doc, "2 产品定位与后台角色", 1) + p(doc, "该后台用于运营一个移动端会员任务与账户平台。C 端会员进行注册、余额储入、领取订单、任务提交、佣金结算、提现和客服咨询;后台完成内容配置、会员治理、商品与任务配置、交易审核、财务对账和权限审计。") + add_table(doc, ["角色", "职责", "允许范围", "禁止范围"], [ + ("超级管理员", "系统与权限治理", "账号、角色、权限、系统参数", "不得绕过双人复核直接放款"), + ("运营", "内容、Banner、商品、任务、等级", "草稿、预览、发布申请", "不得查看完整银行卡或改余额"), + ("客服", "会员与订单查询、工单", "脱敏资料、只读订单、备注", "不得资金审核或导出全量用户"), + ("财务", "充值、提现、对账", "凭证、审核、支付状态", "不得修改会员身份与权限"), + ("风控", "异常行为与冻结复核", "设备、IP 风险、冻结申请", "不得单人完成冻结与解冻"), + ("审计", "只读复核与导出", "日志、审批链、差异报表", "不得修改业务数据"), + ], [0.9, 1.65, 2.1, 2.25]) + heading(doc, "2.1 信息架构", 2) + p(doc, "采用“一级业务域 + 二级页面 + 多标签工作区”的桌面后台结构。一级菜单固定在左侧,二级页面以标签页打开;标签支持关闭、刷新和回到首页。任何页面刷新后,应保持当前路由但不保留未提交敏感表单。") + heading(doc, "2.2 全局交互规范", 2) + for item in [ + "列表页统一:查询区、主操作区、表格、固定操作列、分页;查询条件可重置并写入 URL。", + "弹窗统一:标题、关闭、表单、确定、取消;确定前做前后端双重校验,提交后禁止重复点击。", + "危险操作使用红色按钮并要求对象、影响、理由和二次确认;资金与权限操作额外要求复核人。", + "敏感值默认脱敏;查看完整值需单独权限、再次确认、限定时长,并记录操作者、目标、时间和用途。", + "加载超过 2 秒展示骨架与取消,接口失败展示错误码、重试和上报入口,不长期停留空白页。", + "操作成功后提供结果提示与审计编号;失败不得只显示“error”。", + ]: + bullet(doc, item) + + +def add_c_mapping(doc, flow_img): + heading(doc, "3 C 端与后台功能映射", 1) + p(doc, "后台不是独立工具,其配置和操作必须能解释 C 端每个入口、状态和金额。以下矩阵为联调的单一事实源。") + add_table(doc, ["C 端能力", "后台来源", "后台操作", "一致性要求"], [ + ("首页横幅与快捷入口", "Banner、网站设置", "排序、有效期、跳转、开关", "发布后按版本生效"), + ("平台简介/规则/公告", "文本管理", "富文本编辑、预览、发布", "CSP 与 HTML 白名单"), + ("手工商城", "手工商城", "商品增删改、图片、价格、时间", "C 端仅显示已上架"), + ("会员等级", "会员等级", "门槛、赠送、次数、佣金、提现次数", "计算与展示同源"), + ("领取中心", "网站设置、商品、订单", "营业时间、最低余额、匹配规则", "服务端状态机判定"), + ("订单记录", "订单列表", "查询、冻结、匹配、异常处理", "业务单号和台账可追溯"), + ("储入", "充值管理", "凭证、审核、入账、驳回", "幂等入账与自动对账"), + ("取出", "提现管理、银行卡信息", "收款资料、审核、通道、结果", "金额、手续费、到账同源"), + ("任务大厅与任务", "任务大厅、任务列表、会员任务审核", "配置、分发、审核", "等级、佣金、状态一致"), + ("个人资料", "会员列表", "资料、团队、状态、风控", "敏感字段默认脱敏"), + ("通知与弹幕", "文本、会员弹幕", "发布、定向、撤回、查看记录", "真实性标识和审计"), + ("客服", "客服管理", "客服入口、工作时间、会话映射", "失败有备用通道"), + ], [1.2, 1.25, 2.3, 1.8], 7.8) + add_picture(doc, flow_img, "图 1 C 端与后台业务闭环(脱敏重绘原型)", width=6.7) + + +def add_dashboard(doc, img): + page_break(doc) + heading(doc, "4 首页数据看板", 1) + p(doc, "首页展示用户、商品、订单、充值、提现、佣金、利息宝转入、下级返佣与账户余额等汇总卡,并展示微信、支付宝和银行卡渠道统计。新系统应把口径、时间区间、刷新时间和数据延迟显式化。") + add_table(doc, ["指标", "定义", "筛选维度", "权限"], [ + ("用户总量/新增", "去重有效会员数", "今日、昨日、自定义日期", "运营只读"), + ("充值用户", "至少一笔成功充值的会员数", "时间、渠道、等级", "财务/运营"), + ("订单量与金额", "按订单状态和完成时间统计", "状态、商品、等级", "运营/财务"), + ("充值/提现", "成功与待处理金额分开", "渠道、状态、时间", "财务"), + ("佣金/返佣", "任务佣金与层级返佣分开", "类型、等级、时间", "财务/审计"), + ("账户余额", "钱包可用与冻结余额总和", "币种、账户状态", "财务/审计"), + ], [1.2, 2.55, 1.75, 1.0]) + bullet(doc, "卡片可点击进入对应明细页,并继承时间筛选;无权限用户只能看到隐藏金额或不可点击状态。") + bullet(doc, "页面顶部展示“数据截至时间”和刷新按钮;自动刷新不得造成重复请求风暴。") + add_picture(doc, img, "图 2 后台首页看板(按实测界面脱敏重绘)", width=6.7) + + +def add_content_modules(doc): + heading(doc, "5 门户、内容与 Banner 管理", 1) + heading(doc, "5.1 网站设置", 2) + add_table(doc, ["配置组", "字段", "要求"], [ + ("品牌", "Logo、站点名称、隐私政策 URL", "Logo 可预览;URL 仅允许 HTTPS 白名单"), + ("交易", "交易余额、等待时间、每日次数、奖励次数", "数值范围校验;修改按版本发布"), + ("佣金", "0–5 级普通佣金", "Decimal;总和上限;法务开关"), + ("时间", "提现、充值、交易、签到时间", "支持多区间;禁止结束早于开始"), + ("门槛", "最低充值、自动派单时间与金额", "最小值≤最大值;币种与单位清晰"), + ("开关", "免费领取、手工商城、首页任务、签到、商品模式、验证码", "每项写明 C 端影响和降级文案"), + ], [0.85, 2.65, 3.1]) + p(doc, "实测问题:交易等待时间输入框提示语与字段无关;签到时段出现“18:00–17:00”反向区间。新系统保存前必须做语义校验,并支持草稿、预览、发布、回滚。") + heading(doc, "5.2 文本管理", 2) + p(doc, "内容类型包括平台公告、平台简介、订单规则、代理合作、FAQ、指南、利息宝规则、首页滚动、订单提示、活动、首页弹窗和公司资质。编辑器需支持标题、正文、图片、链接、预览、定时发布、版本和回滚。") + bullet(doc, "富文本使用标签/属性白名单;禁止 script、事件属性、javascript: URL 和未知 iframe。") + bullet(doc, "现网编辑弹窗标题错误显示“编辑商品”,新系统标题必须与内容类型一致。") + heading(doc, "5.3 Banner 设置", 2) + p(doc, "支持多张首页 Banner 的上传、删除、排序、上下线、有效期、跳转类型与替代文本。上传前预览并校验尺寸、比例、MIME、文件大小和恶意内容。删除需要二次确认,已发布素材优先下线而非物理删除。") + heading(doc, "5.4 手工商城", 2) + p(doc, "列表字段为图片、名称、价格、时间与操作;新增/编辑字段为产品名称、价格、图片与展示时间。现网新增弹窗曾长时间停留 loading,需增加 8 秒超时、重试和错误上报。") + + +def add_member(doc, list_img, modal_img): + page_break(doc) + heading(doc, "6 会员管理", 1) + heading(doc, "6.1 会员列表", 2) + p(doc, "查询条件:用户名、手机号、注册时间、状态、自动派单。列表字段:ID、账号、绑卡姓名、用户名、账户余额、冻结金额、上级用户、邀请码、注册时间、最后登录 IP、IP 属地、自动抢单、状态、当日交易次数。") + add_table(doc, ["操作", "页面或弹窗", "关键校验", "审计要求"], [ + ("添加/编辑", "会员表单", "手机号唯一;余额不可由普通编辑修改;密码强度", "记录前后值,密码永不回显"), + ("银行卡信息", "开户人、银行、电话、卡号、数字钱包、云闪付、收款码", "必要性与格式;图片扫描", "完整值查看留痕"), + ("地址信息", "姓名、电话、地区、详细地址", "最小化收集;字段脱敏", "查看和修改留痕"), + ("查看团队", "当前用户、层级、人数、余额、佣金、充值、提现", "仅展示授权层级", "导出单独授权"), + ("账变", "余额调整或流水", "金额、类型、理由、业务单号", "双人复核;不可直接改余额"), + ("弹幕", "会员定向或模拟内容", "标注来源、有效期、撤回", "禁止伪造真实用户行为"), + ("奖励金", "奖励金额与原因", "非负、额度、幂等", "财务复核与凭证"), + ("设为假人", "账号标记", "不得混入真实统计或 C 端荣誉榜", "仅测试环境默认启用"), + ("禁用", "账号状态", "理由、范围、时长、申诉", "双人复核;通知用户"), + ("删除", "软删除/注销", "检查资金与订单;不可物理删台账", "高风险二次确认"), + ], [0.85, 2.0, 2.3, 1.8], 7.6) + p(doc, "P0:现网页面默认显示完整手机号、姓名与登录 IP。新系统必须默认脱敏,按角色和目的临时授权查看;列表、导出、日志、埋点和截图统一执行同一脱敏规则。") + add_picture(doc, list_img, "图 3 会员列表脱敏原型", width=6.7) + add_picture(doc, modal_img, "图 4 添加会员弹窗原型", width=6.7, page_break_before=True) + + +def add_member_level_taskhall(doc): + page_break(doc) + heading(doc, "7 会员等级与任务大厅", 1) + heading(doc, "7.1 会员等级", 2) + p(doc, "列表字段为等级名称、升级价格、赠送金额、接单次数、佣金比例和提现次数;支持编辑与受控删除。等级配置直接影响 C 端充值、领取和提现,必须使用版本化发布,不得修改后立即影响进行中的订单。") + add_table(doc, ["规则", "校验", "生效策略"], [ + ("升级价格/赠送金额", "≥0;货币精度;赠送比例上限", "新会员或下个结算周期"), + ("接单次数", "整数;按日重置时区明确", "发布后次日生效"), + ("佣金比例", "0–1 Decimal;展示百分比", "锁定到任务订单快照"), + ("提现次数", "整数;与提现时间窗一致", "发布后次日生效"), + ("删除等级", "无有效会员与在途订单方可删除", "优先停用并保留历史"), + ], [1.45, 2.65, 2.5]) + heading(doc, "7.2 任务大厅", 2) + p(doc, "页面字段为名称、图标、比例、简介、创建时间;新增弹窗还包含会员等级。实测列表接口直接显示“数据接口请求异常:error”,但新增弹窗可打开。新系统需要标准错误码、可重试状态、traceId 与空数据区分。") + bullet(doc, "任务大厅条目必须绑定可用会员等级、比例单位、图标和 C 端跳转。") + bullet(doc, "停用条目不影响已领取任务;删除仅允许无历史引用的数据,建议统一软删除。") + + +def add_transactions(doc, finance_img): + page_break(doc) + heading(doc, "8 交易管理", 1) + heading(doc, "8.1 订单列表", 2) + p(doc, "查询条件:订单号、手机号、用户名、日期;支持开启/关闭自动刷新。列表含绑卡姓名、用户名、自动派单、余额、手机号、当日交易次数、商品、数量、金额、佣金、下单时间、解冻时间、消息、订单状态、冻结状态和操作。") + add_table(doc, ["状态", "后台操作", "约束"], [ + ("匹配中", "查看进度、取消匹配", "同一会员仅一笔匹配;需幂等"), + ("待处理", "查看详情、发送提醒", "不可手动完成;服务端倒计时"), + ("冻结", "查看风险、发起解冻复核", "冻结理由、时长、申诉路径"), + ("已完成", "查看台账", "金额、佣金、解冻三方一致"), + ("异常/失败", "重新匹配、人工处理申请", "人工改状态必须双人审批"), + ], [1.0, 2.2, 3.35]) + heading(doc, "8.2 充值管理", 2) + p(doc, "顶部展示全部、用户已支付、用户未支付、手动审核、手动驳回等汇总金额。列表字段:订单号、真实姓名、手机号、余额、交易金额、打款凭证、添加时间、支付方式、类型、处理时间、备注和操作。") + bullet(doc, "审核通过前校验凭证、订单金额、收款主体、重复订单和账户状态;入账使用幂等键。") + bullet(doc, "驳回必须选择标准原因并可补充说明;通知 C 端且允许补充材料。") + heading(doc, "8.3 提现管理", 2) + p(doc, "查询条件:订单号、用户名、日期。列表含用户余额、提现金额、手续费、实际到账、银行名称、开户名称、银行卡号、云闪付、数字钱包、支付宝/微信收款码、发起与处理时间、操作。") + p(doc, "P0:现网直接显示完整银行卡号与多个钱包账号。新系统列表只显示掩码,完整值不进入普通 DOM;付款处理时通过一次性授权查看,超时自动隐藏。") + add_picture(doc, finance_img, "图 5 提现审核脱敏原型", width=6.7) + heading(doc, "8.4 客服管理", 2) + p(doc, "实测页面在加载后保持空白。新系统至少提供客服账号、名称、工作时间、在线状态、跳转 URL、排序、启停和会话映射;第三方 iframe 失败时显示备用联系方式和错误编号。") + + +def add_products_tasks(doc): + page_break(doc) + heading(doc, "9 商品与任务管理", 1) + heading(doc, "9.1 商品列表", 2) + p(doc, "查询条件:商品名称、支付类型。列表:ID、图片、名称、商品价格、店铺名称、创建时间、是否推荐、操作。新增/编辑字段:商品名称、分类、店铺名称、商品单价、展示图片、商品详情富文本。") + bullet(doc, "推荐/不推荐为明确状态切换,提交前展示影响范围;列表筛选和 C 端排序一致。") + bullet(doc, "价格采用 Decimal;图片与富文本执行内容安全校验;商品被订单引用后只允许停用。") + heading(doc, "9.2 任务列表", 2) + p(doc, "按会员类型筛选;字段为任务编号、封面、标题、描述、等级、佣金、创建时间。新增弹窗含标题、描述、封面、等级、佣金和详情。实测新增任务弹窗标题误用“添加大厅任务”,需修正。") + heading(doc, "9.3 会员任务审核", 2) + p(doc, "按手机号、用户名查询;列表含记录 ID、用户名、手机、任务标题、等级、佣金、成功率、状态、备注、创建时间和操作。待审核记录支持通过与驳回。") + add_table(doc, ["动作", "前置条件", "提交内容", "结果"], [ + ("通过", "任务存在、会员有效、未重复审核", "审核意见、证据摘要、幂等键", "发放佣金或进入结算队列"), + ("驳回", "记录为待审核", "标准原因、补充说明、是否允许重提", "通知会员并保留证据"), + ("撤回审核", "仅异常且未结算", "变更单与复核人", "冲正而非修改历史记录"), + ], [0.9, 2.35, 2.2, 2.0]) + + +def add_rbac(doc, rbac_img): + page_break(doc) + heading(doc, "10 管理员、角色与权限", 1) + heading(doc, "10.1 后台管理员", 2) + p(doc, "查询条件为登录名、手机、邮箱、角色;列表含姓名、登录名、手机号、邮箱、角色、更新时间和创建时间。新增字段为姓名、用户名、密码、手机、邮箱和多选角色。") + bullet(doc, "密码强度至少 12 位,禁止默认密码,首次登录强制改密;密码永不回显。") + bullet(doc, "禁用优先于删除;删除账号时保留历史审计主体,不得影响日志可追溯性。") + heading(doc, "10.2 角色管理", 2) + p(doc, "角色列表支持新增、编辑、删除和分配权限。分配弹窗为可展开/折叠的权限树。保存权限属于高风险操作,必须展示新增与移除差异,并由另一名管理员复核。") + heading(doc, "10.3 权限管理", 2) + p(doc, "权限树字段为 ID、名称、权限标识、父级 ID 和操作;支持添加顶级权限、添加子级、编辑、删除、展开/折叠。权限标识唯一且不可随意改名;被角色引用时禁止删除。") + add_picture(doc, rbac_img, "图 6 建议 RBAC 权限矩阵", width=6.7) + + +def add_dictionary_settings(doc): + page_break(doc) + heading(doc, "11 数据字典与个人设置", 1) + heading(doc, "11.1 数据字典", 2) + p(doc, "列表字段为 ID、名称、值、创建时间;支持新增、编辑、删除。现网同时存在英文 key、中文名称和缺失名称的条目,并与网站设置重复维护。建议将字典拆为“系统常量”和“业务配置”,以结构化 Schema 管理。") + add_table(doc, ["字段", "要求"], [ + ("key", "全局唯一;小写或大写规范统一;发布后不可改名"), + ("value", "按 Schema 校验类型、范围、枚举、时间段和单位"), + ("description", "必填,说明业务含义、C 端影响和默认值"), + ("scope", "环境、租户、渠道、会员等级等作用域"), + ("version", "草稿、已发布、已回滚;记录生效时间"), + ("secret", "敏感配置不得明文显示,使用密钥管理系统"), + ], [1.3, 5.2]) + heading(doc, "11.2 基本资料", 2) + p(doc, "字段为用户名(不可修改)、名称、手机、邮箱,提交按钮为“确认修改”。修改手机或邮箱需验证当前身份和新联系方式;成功后记录审计并通知原联系方式。") + heading(doc, "11.3 修改密码", 2) + p(doc, "字段为当前密码、新密码、确认新密码,现网提示 6–16 个字符。新系统建议至少 12 位并支持密码管理器;最终提交必须由用户本人完成,成功后撤销其他会话并发送安全通知。") + + +def add_state_models(doc): + page_break(doc) + heading(doc, "12 状态机与数据模型", 1) + heading(doc, "12.1 核心状态机", 2) + add_table(doc, ["实体", "状态", "允许转换"], [ + ("会员", "正常、受限、禁用、注销", "正常→受限/禁用;复核后恢复;注销不可逆"), + ("订单", "匹配中、待处理、处理中、完成、超时、冻结、取消、失败", "仅服务端状态机转换"), + ("充值", "待支付、待审核、成功、驳回、过期、取消", "成功后只允许冲正"), + ("提现", "待审核、复核中、处理中、成功、失败、驳回、取消", "付款前可取消;成功后只允许冲正"), + ("任务审核", "待审核、通过、驳回、已结算、已冲正", "结算后不可回到待审核"), + ("内容", "草稿、待审、已发布、已下线、已归档", "发布需审批;可回滚版本"), + ("配置", "草稿、待发布、已发布、已回滚", "发布后生成不可变版本"), + ], [1.0, 2.45, 3.1]) + heading(doc, "12.2 核心实体", 2) + add_table(doc, ["实体", "关键字段", "约束"], [ + ("AdminUser", "id, loginName, roles, status, mfa, lastLogin", "管理员身份与会话"), + ("Role/Permission", "roleId, permissionKey, scope", "最小权限与数据范围"), + ("Member", "id, mobileEnc, nameEnc, levelId, status", "敏感字段加密、索引分离"), + ("Wallet", "available, frozen, currency, version", "只允许台账事务修改"), + ("LedgerEntry", "bizNo, type, amount, before, after, reversalOf", "不可变、幂等、可冲正"), + ("Order", "orderNo, memberId, productSnapshot, amount, commission, status", "保存规则快照"), + ("Deposit/Withdrawal", "bizNo, amount, fee, channel, status, reviewer", "审批链与支付回执"), + ("Content/Banner", "type, body, version, publishAt, operator", "预览与版本化发布"), + ("ConfigVersion", "key, value, schema, effectiveAt", "语义校验与回滚"), + ("AuditLog", "actor, action, target, before, after, reason, traceId", "防篡改与长期留存"), + ], [1.15, 3.5, 2.0], 7.8) + + +def add_api(doc): + page_break(doc) + heading(doc, "13 推荐接口清单", 1) + p(doc, "接口为新系统建议设计,统一前缀 /admin-api/v1。响应包含 data、code、message、traceId;所有写接口必须携带 Idempotency-Key,资金与权限写操作同时携带审批单号。") + rows = [ + ("GET", "/dashboard/summary", "首页指标", "timeRange, dimensions"), + ("GET/PUT", "/site-settings", "读取/保存站点配置草稿", "version, settings"), + ("POST", "/site-settings/publish", "发布配置", "draftVersion, reason"), + ("GET/POST", "/contents", "内容列表/新建", "type, status, body"), + ("POST", "/contents/{id}/publish", "内容发布", "publishAt, approver"), + ("GET/POST", "/banners", "Banner 查询/新建", "imageAssetId, sort, target"), + ("GET/POST", "/members", "会员查询/新建", "filters, profile"), + ("GET/PATCH", "/members/{id}", "会员详情/编辑", "editableProfile, version"), + ("POST", "/members/{id}/adjustment-requests", "账变申请", "type, amount, reason, evidence"), + ("POST", "/members/{id}/status-requests", "禁用/解禁申请", "targetStatus, reason, duration"), + ("GET/POST", "/member-levels", "等级查询/草稿", "rules, effectiveAt"), + ("GET/POST", "/products", "商品查询/新建", "category, price, assets, detail"), + ("GET/POST", "/tasks", "任务查询/新建", "levelIds, commission, detail"), + ("GET", "/orders", "订单列表", "orderNo, member, status, timeRange"), + ("POST", "/orders/{id}/exception-requests", "异常处理申请", "action, reason"), + ("GET", "/deposits", "充值列表", "status, channel, timeRange"), + ("POST", "/deposits/{id}/review", "充值审核", "decision, reason, version"), + ("GET", "/withdrawals", "提现列表", "status, member, timeRange"), + ("POST", "/withdrawals/{id}/review", "提现审核", "decision, reason, version"), + ("GET", "/withdrawals/{id}/sensitive-view", "一次性查看收款信息", "purpose, challengeToken"), + ("GET/POST", "/task-submissions", "任务审核列表/决定", "decision, reason"), + ("GET/POST", "/admin-users", "管理员查询/新建", "profile, roleIds"), + ("GET/POST", "/roles", "角色查询/新建", "name, scope"), + ("POST", "/roles/{id}/permission-change-requests", "权限变更申请", "add, remove, reason"), + ("GET", "/audit-logs", "审计查询", "actor, action, target, timeRange"), + ] + add_table(doc, ["方法", "路径", "用途", "关键参数"], rows, [0.55, 2.3, 1.75, 2.0], 7.4) + + +def add_security(doc): + page_break(doc) + heading(doc, "14 安全、隐私与审计", 1) + add_table(doc, ["风险", "现网表现", "新系统要求", "优先级"], [ + ("个人信息裸露", "完整手机号、姓名、IP", "默认脱敏;临时授权;全链路审计", "P0"), + ("金融信息裸露", "完整银行卡与钱包账号", "应用层加密;非 DOM 展示;一次性查看", "P0"), + ("资金单人操作", "通过/驳回、账变、奖励入口直接可达", "职责分离、双人复核、额度和幂等", "P0"), + ("伪造行为", "设为假人、弹幕入口", "测试数据隔离;禁止混入真实榜单与统计", "P0"), + ("富文本 XSS", "商品与内容支持富文本", "白名单、CSP、上传扫描、预览隔离", "P0"), + ("配置误发布", "时间反向、字段提示错误", "Schema 校验、预览、审批、回滚", "P0"), + ("接口不可用", "任务大厅 error、客服空白", "错误码、重试、熔断、监控和降级", "P1"), + ("权限漂移", "多角色与权限树直接保存", "差异预览、审批、定期复核", "P0"), + ], [1.0, 1.65, 3.0, 0.65]) + heading(doc, "14.1 审计日志", 2) + for item in [ + "记录登录、查看敏感信息、导出、查询大范围数据、资金审核、账变、奖励、冻结、配置发布、权限变更和改密。", + "字段至少包含操作者、角色、MFA、目标、动作、前值、后值、理由、审批人、IP、设备、traceId、时间和结果。", + "日志写入独立存储并防篡改;业务管理员无删除权限;按监管与公司政策设定留存期。", + "导出文件水印、加密、限时下载;下载与转发均可追踪。", + ]: + bullet(doc, item) + heading(doc, "14.2 登录与会话", 2) + for item in [ + "管理员必须启用 MFA;高风险动作触发再次认证。", + "闲置 15–30 分钟自动锁定;会话撤销、设备列表和异地登录提醒。", + "连续失败触发限流与告警;不得依赖前端验证码作为唯一防护。", + "服务端密码使用 Argon2id 或 bcrypt;任何日志、监控和前端状态都不得保存密码。", + ]: + bullet(doc, item) + + +def add_nonfunctional(doc): + heading(doc, "15 非功能需求", 1) + add_table(doc, ["类别", "目标", "验收指标"], [ + ("性能", "常用列表与详情快速可用", "列表 P95<1s;写操作 P95<1.5s;首屏<2.5s"), + ("可用性", "关键交易全年可用", "资金审核 99.95%;其余 99.9%"), + ("容量", "支持 10 万会员与百万级订单", "游标分页、索引与冷热分层"), + ("并发", "自动刷新与多运营并发安全", "乐观锁、版本号、冲突提示"), + ("可观测", "定位每次请求与资金变更", "traceId、指标、日志、告警、审计关联"), + ("兼容", "主流桌面浏览器", "Chrome/Edge 最近两个稳定版;1366×768 可用"), + ("可访问", "键盘与读屏可操作", "焦点、标签、颜色对比、44px 点击区"), + ("灾备", "配置与交易可恢复", "RPO≤5 分钟,RTO≤30 分钟;季度演练"), + ], [1.0, 3.0, 2.65]) + heading(doc, "15.1 列表与弹窗通用验收", 2) + for item in [ + "查询条件、分页、排序、刷新后可恢复;空数据、加载中、失败、无权限均有独立状态。", + "横向宽表固定关键列和操作列;敏感字段不因横向滚动或 tooltip 意外暴露。", + "弹窗关闭与取消不产生写操作;表单脏数据关闭前提示;成功后只刷新受影响区域。", + "重复点击、网络重试和浏览器回退不会重复创建、重复审核或重复入账。", + "所有时间显示时区,金额显示币种和精度,百分比与小数含义统一。", + ]: + bullet(doc, item) + + +def add_acceptance(doc): + page_break(doc) + heading(doc, "16 端到端验收场景", 1) + scenarios = [ + ("A01 内容发布", "运营新建公告→预览→提交审核→审批→定时发布→C 端显示相同版本→回滚"), + ("A02 会员查询", "客服按掩码手机号查询→查看脱敏资料→申请查看完整值→审计留痕→超时隐藏"), + ("A03 任务闭环", "配置任务→C 端领取→生成订单→提交→后台审核→佣金入账→台账核对"), + ("A04 充值审核", "C 端提交→后台待审核→重复回调→单次入账→通知→对账一致"), + ("A05 提现复核", "C 端申请→风控命中→财务初审→复核→通道付款→状态与到账金额一致"), + ("A06 禁用会员", "客服发起→填写理由和时长→风控复核→会员受限→通知与申诉→解禁"), + ("A07 账变", "运营申请奖励→财务复核→台账入账→重复提交被幂等拦截→审计可追溯"), + ("A08 权限变更", "管理员申请新增提现审核权限→展示差异→复核→即时生效→历史会话重新鉴权"), + ("A09 配置错误", "输入反向时间/非法比例→前后端阻止→错误定位到字段→不生成草稿版本"), + ("A10 服务降级", "任务大厅 API 失败/客服 iframe 失败→清晰错误→重试/备用入口→告警产生"), + ] + add_table(doc, ["编号", "场景与验收路径"], scenarios, [0.75, 5.9]) + heading(doc, "16.1 发布门槛", 2) + for item in [ + "P0 风险全部关闭;资金、权限、隐私与上传通过专项安全测试。", + "C 端和后台使用同一配置版本、状态枚举、金额口径和错误码。", + "关键写操作完成幂等、并发、回滚、重试、超时与断网测试。", + "审计日志可以从一次用户投诉还原完整操作者、审批链和资金流水。", + "备份恢复、支付对账、权限复核和事故响应完成演练。", + ]: + bullet(doc, item) + + +def add_roadmap(doc): + page_break(doc) + heading(doc, "17 研发里程碑", 1) + add_table(doc, ["阶段", "范围", "退出条件"], [ + ("M0 设计基线", "信息架构、组件、状态机、RBAC、字段字典", "产品/设计/技术/安全评审通过"), + ("M1 基础后台", "登录、管理员、角色、权限、审计、内容、Banner", "MFA、审计、发布流可用"), + ("M2 会员与配置", "会员、等级、团队、配置中心", "脱敏、临时授权、版本发布完成"), + ("M3 商品与任务", "商品、任务、任务大厅、审核", "C 端联调与佣金快照通过"), + ("M4 交易与资金", "订单、充值、提现、对账、复核", "支付沙箱、幂等、双人复核通过"), + ("M5 运营与稳定性", "看板、客服、监控、灾备、性能", "SLO、告警、恢复演练通过"), + ], [1.1, 3.4, 2.25]) + heading(doc, "17.1 建议开发顺序", 2) + for item in [ + "先建设统一认证、RBAC、审计、脱敏和配置发布,再开发具体业务页。", + "会员、商品、任务可先使用模拟资金;充值和提现必须最后接真实通道。", + "资金域上线前实行沙箱、小流量、额度限制和人工对账。", + "上线后第一周每日权限复核、账务核对和错误率复盘。", + ]: + numbered(doc, item) + + +def add_prototypes(doc, imgs): + page_break(doc) + heading(doc, "18 原型图说明", 1) + p(doc, "文档中的界面图按实测后台的布局、菜单、表格、弹窗和业务字段脱敏重绘,可直接用于讨论信息层级和交互。它们不是视觉稿:品牌、颜色、图标和真实数据应在 UI 设计阶段重新建立。") + for idx, (img, caption) in enumerate([ + (imgs[0], "首页看板"), (imgs[1], "会员列表"), (imgs[2], "会员弹窗"), + (imgs[3], "提现审核"), (imgs[4], "角色权限"), (imgs[5], "业务闭环"), + ], 1): + if idx > 1: + page_break(doc) + heading(doc, f"18.{idx} {caption}(脱敏重绘)", 2) + pic = doc.add_paragraph() + pic.alignment = WD_ALIGN_PARAGRAPH.CENTER + pic.add_run().add_picture(str(img), width=Inches(5.8)) + + +def add_open_questions(doc): + page_break(doc) + heading(doc, "19 待确认事项", 1) + for item in [ + "目标系统是否处理真实资金,适用司法辖区、支付牌照与实名要求是什么。", + "“设为假人、弹幕、奖励金、层级返佣”是否保留;若保留,业务合法性和真实性如何证明。", + "充值、提现、账变和会员禁用的初审/复核角色与金额阈值。", + "C 端现有接口能否修改,还是需要后台兼容旧字段和状态枚举。", + "客服使用自建工单还是第三方服务,允许向第三方传输哪些数据。", + "运营内容是否需要多语言、定时发布、区域差异与灰度发布。", + "历史用户、订单、银行卡和台账的迁移范围、清洗规则和保留年限。", + "生产环境数据导出、敏感值查看和紧急权限的审批人。", + ]: + bullet(doc, item) + p(doc, "在上述事项确认前,可以完成认证、RBAC、审计、内容、会员脱敏查询、商品任务配置和沙箱交易;不得接入真实收款、放款或自动资金调整。") + + +def build_doc(): + OUT_DIR.mkdir(parents=True, exist_ok=True) + imgs = save_assets() + doc = Document() + configure_doc(doc) + add_cover(doc) + add_scope(doc) + add_architecture(doc) + add_c_mapping(doc, imgs[5]) + add_dashboard(doc, imgs[0]) + add_content_modules(doc) + add_member(doc, imgs[1], imgs[2]) + add_member_level_taskhall(doc) + add_transactions(doc, imgs[3]) + add_products_tasks(doc) + add_rbac(doc, imgs[4]) + add_dictionary_settings(doc) + add_state_models(doc) + add_api(doc) + add_security(doc) + add_nonfunctional(doc) + add_acceptance(doc) + add_roadmap(doc) + add_prototypes(doc, imgs) + add_open_questions(doc) + doc.core_properties.title = "后台管理系统需求文档" + doc.core_properties.subject = "参考管理系统拆解、C 端映射与安全重构方案" + doc.core_properties.author = "Product Requirement Analysis" + doc.core_properties.keywords = "后台, 需求文档, 会员, 交易, RBAC, 审计, 原型" + doc.save(OUT_DOCX) + print(OUT_DOCX) + + +if __name__ == "__main__": + build_doc() diff --git a/tools/build_reference_prd.py b/tools/build_reference_prd.py new file mode 100644 index 0000000..ef57b01 --- /dev/null +++ b/tools/build_reference_prd.py @@ -0,0 +1,794 @@ +from __future__ import annotations + +from pathlib import Path +from datetime import date + +from PIL import Image, ImageDraw, ImageFont +from docx import Document +from docx.enum.section import WD_SECTION +from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_BREAK, WD_LINE_SPACING +from docx.enum.table import WD_TABLE_ALIGNMENT, WD_CELL_VERTICAL_ALIGNMENT +from docx.oxml import OxmlElement +from docx.oxml.ns import qn +from docx.shared import Inches, Pt, RGBColor + + +ROOT = Path(__file__).resolve().parents[1] +OUT_DIR = ROOT / "docs" / "reference_site_prd" +ASSET_DIR = OUT_DIR / "assets" +OUT_DOCX = OUT_DIR / "移动端任务与账户平台需求文档.docx" +FONT_PATH = "/System/Library/Fonts/STHeiti Light.ttc" + +INK = "18202F" +BLUE = "4F79E8" +PALE_BLUE = "EAF1FF" +PALE = "F6F8FC" +GOLD = "D8AD58" +RED = "C64F48" +GRID = "D9D9D9" +MUTED = "667085" + + +def font(size: int, bold: bool = False): + try: + return ImageFont.truetype(FONT_PATH, size=size) + except Exception: + return ImageFont.load_default() + + +def rounded(draw, box, radius=18, fill="white", outline=None, width=1): + draw.rounded_rectangle(box, radius=radius, fill=fill, outline=outline, width=width) + + +def text(draw, xy, value, size=24, fill="#18202F", bold=False, anchor=None): + draw.text(xy, value, font=font(size, bold), fill=fill, anchor=anchor) + + +def phone_base(title: str): + im = Image.new("RGB", (460, 860), "#F3F5FA") + d = ImageDraw.Draw(im) + rounded(d, (8, 8, 452, 852), 34, "#F3F5FA", "#D8DEE9", 2) + text(d, (230, 42), title, 28, anchor="mm") + return im, d + + +def nav(d, active: str): + rounded(d, (14, 790, 446, 842), 24, "white") + items = ["首页", "记录", "领取", "客服", "我的"] + for i, item in enumerate(items): + x = 52 + i * 89 + color = "#4F79E8" if item == active else "#4B5565" + d.ellipse((x - 9, 802, x + 9, 820), fill=color) + text(d, (x, 831), item, 15, color, anchor="mm") + + +def home_proto(): + im, d = phone_base("首页") + rounded(d, (20, 78, 440, 220), 18, "#2459D9") + text(d, (230, 145), "运营活动横幅", 34, "white", anchor="mm") + for i, label in enumerate(["领取", "储入", "取出", "手工"]): + x = 65 + i * 110 + d.ellipse((x - 22, 238, x + 22, 282), fill=["#6C8FF1", "#6DD0B5", "#D77B6C", "#E2B362"][i]) + text(d, (x, 301), label, 19, anchor="mm") + rounded(d, (20, 322, 440, 422), 28, "#DCEBFF") + text(d, (42, 347), "账户余额", 18, "#667085") + text(d, (42, 395), "Rmb$ 300,019.13", 32) + text(d, (20, 455), "荣誉榜", 23) + for i in range(3): + y = 486 + i * 68 + rounded(d, (20, y, 440, y + 56), 20, "white") + d.ellipse((34, y + 9, 72, y + 47), fill="#DDE5F5") + text(d, (88, y + 19), f"用户{i+1} 积分 {5200-i*430}.00", 16) + rounded(d, (340, y + 12, 425, y + 44), 16, "#E3BB6F") + text(d, (382, y + 29), "领取成功", 13, anchor="mm") + text(d, (20, 705), "会员等级 · 公司简介", 20) + nav(d, "首页") + return im + + +def records_proto(): + im, d = phone_base("记录") + text(d, (28, 82), "剩余可用资产", 17, "#667085") + text(d, (28, 126), "Rmb$ 300,019.13", 34) + for i, tab in enumerate(["全部", "待处理", "已完成"]): + text(d, (55 + i * 92, 184), tab, 18, "#18202F" if i == 0 else "#77808F", anchor="mm") + for i, (name, price, comm) in enumerate([("商品订单 A", "¥298", "¥14.90"), ("商品订单 B", "¥235", "¥4.23")]): + y = 220 + i * 190 + rounded(d, (18, y, 442, y + 168), 22, "white") + text(d, (32, y + 25), "2026-10-07 16:25", 15, "#667085") + rounded(d, (32, y + 50, 150, y + 142), 12, "#D8E4F8") + text(d, (168, y + 64), name, 19) + text(d, (168, y + 101), f"商品价格 {price}", 16) + rounded(d, (168, y + 117, 422, y + 150), 10, "#F4D5A0") + text(d, (185, y + 134), f"佣金 {comm}", 16, "#C64F48", anchor="lm") + text(d, (384, y + 134), "已完成", 15, anchor="mm") + nav(d, "记录") + return im + + +def receive_proto(): + im, d = phone_base("领取") + rounded(d, (18, 72, 442, 320), 18, "#DCEEFF") + text(d, (35, 102), "至尊会员", 30) + text(d, (35, 138), "佣金费率 5%", 18) + d.ellipse((165, 165, 295, 295), fill="#BED8FF") + rounded(d, (148, 250, 312, 298), 24, "#4F79E8") + text(d, (230, 275), "自动领取", 22, "white", anchor="mm") + text(d, (230, 350), "全力领取中 结果将在下方发放", 16, "#667085", anchor="mm") + text(d, (22, 398), "今日战果", 23) + cards = [("总资产", "300019.13"), ("昨日佣金", "0"), ("今日佣金", "14.9"), ("今日领取数", "1")] + for i, (label, val) in enumerate(cards): + x = 20 + (i % 2) * 212 + y = 430 + (i // 2) * 104 + rounded(d, (x, y, x + 200, y + 88), 14, ["#E4E1FF", "#FFF0CF", "#FFE2E4", "#DDF6FF"][i]) + text(d, (x + 14, y + 25), label, 15, "#667085") + text(d, (x + 14, y + 62), val, 22) + text(d, (22, 655), "规则提示:营业时间、余额门槛、60 分钟时限", 15, "#667085") + nav(d, "领取") + return im + + +def mine_proto(): + im, d = phone_base("我的") + rounded(d, (20, 78, 440, 166), 22, "#CCE4FF") + d.ellipse((38, 96, 92, 150), fill="#AFC8EA") + text(d, (110, 108), "用户昵称", 22) + text(d, (110, 139), "邀请码 ******", 15, "#667085") + rounded(d, (20, 188, 440, 315), 25, "#F5D37D") + text(d, (42, 226), "Rmb$ 300,019.13", 30) + rounded(d, (48, 257, 177, 297), 19, "#B9A95F") + rounded(d, (200, 257, 329, 297), 19, "white") + text(d, (112, 278), "立即取出", 17, anchor="mm") + text(d, (264, 278), "立即储入", 17, anchor="mm") + text(d, (22, 355), "更多功能", 22) + for i, label in enumerate(["个人信息", "储入记录", "取出记录", "账户明细", "弹窗记录", "退出登录"]): + y = 390 + i * 58 + rounded(d, (20, y, 440, y + 48), 10, "white") + text(d, (46, y + 25), label, 18, anchor="lm") + text(d, (416, y + 25), ">", 18, "#667085", anchor="mm") + nav(d, "我的") + return im + + +def recharge_proto(): + im, d = phone_base("储入") + cols = ["等级", "金额", "赠送", "单数", "比例"] + d.rounded_rectangle((14, 76, 446, 114), radius=10, fill="#4F79E8") + for i, c in enumerate(cols): + x = 24 + i * 82 + text(d, (x, 95), c, 14, "white", anchor="mm") + rows = [("普通", "500", "20", "10", "1.8%"), ("白银", "1888", "88", "20", "2.0%"), ("黄金", "10000", "188", "30", "2.2%"), ("铂金", "30000", "388", "40", "3.0%"), ("钻石", "50000", "588", "50", "3.5%"), ("星耀", "88888", "1888", "80", "4.0%"), ("至尊", "188888", "2888", "1000", "5.0%")] + for r, row in enumerate(rows): + y = 126 + r * 42 + if r % 2: + d.rectangle((14, y - 17, 446, y + 20), fill="#EEF3FC") + for i, c in enumerate(row): + text(d, (24 + i * 82, y), c, 13, anchor="mm") + text(d, (22, 455), "输入金额", 16) + rounded(d, (20, 478, 440, 530), 18, "white", "#D9D9D9") + text(d, (22, 565), "姓名", 16) + rounded(d, (20, 588, 440, 640), 18, "white", "#D9D9D9") + rounded(d, (20, 690, 440, 746), 25, "#4F79E8") + text(d, (230, 718), "提交", 21, "white", anchor="mm") + return im + + +def bind_proto(): + im, d = phone_base("绑定信息") + labels = ["姓名", "银行名", "银行账户", "人民币编码"] + for i, lab in enumerate(labels): + y = 78 + i * 100 + text(d, (24, y), lab, 17) + rounded(d, (20, y + 24, 440, y + 78), 18, "white", "#D9D9D9") + text(d, (24, 490), "支付宝收款码", 17) + rounded(d, (20, 520, 156, 650), 16, "white", "#C9CFDA") + text(d, (88, 585), "+", 42, anchor="mm") + text(d, (210, 490), "微信收款码", 17) + rounded(d, (206, 520, 342, 650), 16, "white", "#C9CFDA") + text(d, (274, 585), "+", 42, anchor="mm") + rounded(d, (20, 700, 440, 756), 25, "#4F79E8") + text(d, (230, 728), "提交", 21, "white", anchor="mm") + return im + + +def service_proto(): + im, d = phone_base("在线客服") + text(d, (28, 92), "储入与问题处理请联系在线客服", 18) + for i in range(3): + x = 18 + i * 144 + rounded(d, (x, 148, x + 132, 330), 20, "white") + d.ellipse((x + 42, 176, x + 90, 224), fill="#2C3440") + text(d, (x + 66, 253), f"在线客服 {i+1}", 16, anchor="mm") + text(d, (x + 66, 281), "9:00-22:00", 13, "#667085", anchor="mm") + rounded(d, (x + 16, 295, x + 116, 327), 16, "#4F79E8") + text(d, (x + 66, 312), "联系客服", 14, "white", anchor="mm") + text(d, (20, 390), "进入后嵌入第三方即时聊天页", 17, "#667085") + nav(d, "客服") + return im + + +def mall_proto(): + im, d = phone_base("手工商城") + rounded(d, (18, 78, 442, 210), 18, "#285FD8") + text(d, (230, 144), "手工任务横幅", 30, "white", anchor="mm") + for i in range(6): + x = 18 + (i % 2) * 214 + y = 228 + (i // 2) * 172 + rounded(d, (x, y, x + 204, y + 156), 16, "white") + rounded(d, (x + 8, y + 8, x + 196, y + 88), 12, "#DDE6F4") + text(d, (x + 13, y + 110), f"手工商品 {i+1} 工资说明", 15) + text(d, (x + 13, y + 137), "已领取 0.8", 13, "#667085") + return im + + +def composite(path: Path, title: str, left, right, left_label: str, right_label: str): + canvas = Image.new("RGB", (1200, 980), "white") + d = ImageDraw.Draw(canvas) + text(d, (600, 34), title, 28, anchor="mm") + canvas.paste(left.resize((460, 860)), (105, 74)) + canvas.paste(right.resize((460, 860)), (635, 74)) + text(d, (335, 955), left_label, 17, "#667085", anchor="mm") + text(d, (865, 955), right_label, 17, "#667085", anchor="mm") + canvas.save(path, quality=92) + + +def set_cell_shading(cell, fill): + tc_pr = cell._tc.get_or_add_tcPr() + shd = tc_pr.find(qn("w:shd")) + if shd is None: + shd = OxmlElement("w:shd") + tc_pr.append(shd) + shd.set(qn("w:fill"), fill) + + +def set_cell_border(cell, color=GRID, size="6"): + tc_pr = cell._tc.get_or_add_tcPr() + borders = tc_pr.first_child_found_in("w:tcBorders") + if borders is None: + borders = OxmlElement("w:tcBorders") + tc_pr.append(borders) + for edge in ("top", "left", "bottom", "right", "insideH", "insideV"): + tag = "w:" + edge + node = borders.find(qn(tag)) + if node is None: + node = OxmlElement(tag) + borders.append(node) + node.set(qn("w:val"), "single") + node.set(qn("w:sz"), size) + node.set(qn("w:color"), color) + + +def set_cell_margins(cell, top=100, start=110, bottom=100, end=110): + tc = cell._tc + tc_pr = tc.get_or_add_tcPr() + tc_mar = tc_pr.first_child_found_in("w:tcMar") + if tc_mar is None: + tc_mar = OxmlElement("w:tcMar") + tc_pr.append(tc_mar) + for m, v in (("top", top), ("start", start), ("bottom", bottom), ("end", end)): + node = tc_mar.find(qn("w:" + m)) + if node is None: + node = OxmlElement("w:" + m) + tc_mar.append(node) + node.set(qn("w:w"), str(v)) + node.set(qn("w:type"), "dxa") + + +def add_table(doc, headers, rows, widths=None, font_size=8.8): + table = doc.add_table(rows=1, cols=len(headers)) + table.alignment = WD_TABLE_ALIGNMENT.CENTER + table.autofit = False + hdr = table.rows[0].cells + header_props = table.rows[0]._tr.get_or_add_trPr() + repeat_header = OxmlElement("w:tblHeader") + repeat_header.set(qn("w:val"), "true") + header_props.append(repeat_header) + header_props.append(OxmlElement("w:cantSplit")) + for i, h in enumerate(headers): + hdr[i].text = h + set_cell_shading(hdr[i], "334E7D") + set_cell_border(hdr[i]) + set_cell_margins(hdr[i]) + hdr[i].vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER + p = hdr[i].paragraphs[0] + p.alignment = WD_ALIGN_PARAGRAPH.CENTER + for r in p.runs: + r.font.color.rgb = RGBColor(255, 255, 255) + r.font.bold = True + r.font.size = Pt(font_size) + for ridx, row in enumerate(rows): + table_row = table.add_row() + table_row._tr.get_or_add_trPr().append(OxmlElement("w:cantSplit")) + cells = table_row.cells + for i, value in enumerate(row): + cells[i].text = str(value) + set_cell_border(cells[i]) + set_cell_margins(cells[i]) + if ridx % 2: + set_cell_shading(cells[i], "F3F6FB") + cells[i].vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER + p = cells[i].paragraphs[0] + p.alignment = WD_ALIGN_PARAGRAPH.CENTER if i == 0 else WD_ALIGN_PARAGRAPH.LEFT + for r in p.runs: + r.font.size = Pt(font_size) + r.font.color.rgb = RGBColor.from_string(INK) + if widths: + for row in table.rows: + for i, w in enumerate(widths): + row.cells[i].width = Inches(w) + doc.add_paragraph() + return table + + +def set_run_font(run, name="Heiti SC", size=10.5, bold=None, color=INK): + run.font.name = name + run._element.get_or_add_rPr().rFonts.set(qn("w:eastAsia"), "Heiti SC") + run.font.size = Pt(size) + run.font.color.rgb = RGBColor.from_string(color) + if bold is not None: + run.font.bold = bold + + +def p(doc, content="", style=None, bold_lead=None): + par = doc.add_paragraph(style=style) + par.paragraph_format.space_after = Pt(6) + par.paragraph_format.line_spacing = 1.28 + if bold_lead and content.startswith(bold_lead): + a = par.add_run(bold_lead) + set_run_font(a, bold=True) + b = par.add_run(content[len(bold_lead):]) + set_run_font(b) + else: + r = par.add_run(content) + set_run_font(r) + return par + + +def bullet(doc, content, level=0): + par = doc.add_paragraph(style="List Bullet" if level == 0 else "List Bullet 2") + par.paragraph_format.space_after = Pt(3) + par.paragraph_format.line_spacing = 1.2 + set_run_font(par.add_run(content), size=10.2) + return par + + +def numbered(doc, content): + par = doc.add_paragraph(style="List Number") + par.paragraph_format.space_after = Pt(4) + set_run_font(par.add_run(content), size=10.2) + return par + + +def heading(doc, value, level=1): + h = doc.add_heading(value, level=level) + h.paragraph_format.space_before = Pt(10 if level == 1 else 7) + h.paragraph_format.space_after = Pt(6) + return h + + +def page_break(doc): + doc.add_page_break() + + +def add_picture(doc, path, caption, width=6.6, page_break_before=False): + par = doc.add_paragraph() + par.paragraph_format.page_break_before = page_break_before + if page_break_before: + par.paragraph_format.space_before = Pt(18) + par.alignment = WD_ALIGN_PARAGRAPH.CENTER + par.add_run().add_picture(str(path), width=Inches(width)) + cap = doc.add_paragraph() + cap.alignment = WD_ALIGN_PARAGRAPH.CENTER + cap.paragraph_format.space_after = Pt(8) + set_run_font(cap.add_run(caption), size=9, color=MUTED) + + +def add_page_number(paragraph): + paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER + run = paragraph.add_run() + fld_char1 = OxmlElement("w:fldChar") + fld_char1.set(qn("w:fldCharType"), "begin") + instr = OxmlElement("w:instrText") + instr.set(qn("xml:space"), "preserve") + instr.text = "PAGE" + fld_char2 = OxmlElement("w:fldChar") + fld_char2.set(qn("w:fldCharType"), "end") + run._r.append(fld_char1) + run._r.append(instr) + run._r.append(fld_char2) + + +def build_assets(): + ASSET_DIR.mkdir(parents=True, exist_ok=True) + pairs = [ + ("prototype_01.png", "核心导航与内容列表", home_proto(), records_proto(), "首页", "订单记录"), + ("prototype_02.png", "领取与个人中心", receive_proto(), mine_proto(), "领取中心", "我的"), + ("prototype_03.png", "资金入口与收款信息", recharge_proto(), bind_proto(), "储入申请", "收款信息绑定"), + ("prototype_04.png", "客服与手工任务", service_proto(), mall_proto(), "在线客服", "手工商城"), + ] + out = [] + for name, title, left, right, ll, rl in pairs: + path = ASSET_DIR / name + composite(path, title, left, right, ll, rl) + out.append(path) + return out + + +def build_doc(): + OUT_DIR.mkdir(parents=True, exist_ok=True) + figures = build_assets() + doc = Document() + sec = doc.sections[0] + sec.page_width = Inches(8.5) + sec.page_height = Inches(11) + sec.top_margin = Inches(0.68) + sec.bottom_margin = Inches(0.65) + sec.left_margin = Inches(0.72) + sec.right_margin = Inches(0.72) + + styles = doc.styles + normal = styles["Normal"] + normal.font.name = "Heiti SC" + normal._element.rPr.rFonts.set(qn("w:eastAsia"), "Heiti SC") + normal.font.size = Pt(10.5) + normal.font.color.rgb = RGBColor.from_string(INK) + for name, size in (("Title", 27), ("Heading 1", 18), ("Heading 2", 14), ("Heading 3", 11.5)): + st = styles[name] + st.font.name = "Heiti SC" + st._element.rPr.rFonts.set(qn("w:eastAsia"), "Heiti SC") + st.font.size = Pt(size) + st.font.color.rgb = RGBColor(0, 0, 0) + st.font.bold = True + + header = sec.header.paragraphs[0] + header.alignment = WD_ALIGN_PARAGRAPH.RIGHT + set_run_font(header.add_run("移动端任务与账户平台需求文档"), size=8.5, color=MUTED) + add_page_number(sec.footer.paragraphs[0]) + + title = doc.add_paragraph(style="Title") + title_pr = title._p.get_or_add_pPr() + border = title_pr.find(qn("w:pBdr")) + if border is not None: + title_pr.remove(border) + border = OxmlElement("w:pBdr") + for edge in ("top", "left", "bottom", "right", "between"): + node = OxmlElement("w:" + edge) + node.set(qn("w:val"), "nil") + border.append(node) + title_pr.append(border) + title.alignment = WD_ALIGN_PARAGRAPH.LEFT + title.paragraph_format.space_before = Pt(70) + title.paragraph_format.space_after = Pt(18) + set_run_font(title.add_run("移动端任务与账户平台需求文档"), size=27, bold=True, color="000000") + sub = doc.add_paragraph() + set_run_font(sub.add_run("参考站点功能拆解与重构建议"), size=16, bold=True, color="000000") + sub.paragraph_format.space_after = Pt(30) + p(doc, "目标:在不复制品牌素材、敏感数据与高风险业务表述的前提下,复刻参考站点的信息架构和交互骨架,并形成可开发、可验收、可审计的产品需求基线。") + p(doc, "主要读者:产品负责人、交互设计师、前端开发、后端开发、测试、风控与运营。") + p(doc, f"观察日期:{date(2026, 10, 7).isoformat()} 参考环境:移动端网页 文档版本:V1.0") + p(doc, "结论:参考站点由账户、任务订单、余额台账、储入取出、会员等级、内容展示和在线客服七个域构成。建议复刻页面结构与业务闭环,但重写资金、隐私、安全和合规机制。") + page_break(doc) + + heading(doc, "1 文档范围与方法", 1) + p(doc, "本需求基于登录后的页面逐项浏览、按钮与导航行为检查、页面状态观察,以及浏览器中可见网络请求和前端资源分析。本文把结论分为三类:实测行为、前端可见实现、建议需求。敏感手机号、邀请码、银行卡等信息已脱敏,不作为原型内容。") + heading(doc, "1.1 已覆盖范围", 2) + for item in [ + "登录页现状、注册页字段、会话与路由保护。", + "首页、荣誉榜、会员等级、平台简介、规则说明、代理合作、公司资质。", + "订单记录筛选、领取中心、订单资金变化、手工商城。", + "储入、取出、收款信息绑定、储入记录、取出记录、账户明细。", + "个人信息、头像上传、登录密码、交易密码、通知记录、在线客服。", + "可观察接口、响应结构、关键数据字段与前端安全实现。", + ]: + bullet(doc, item) + heading(doc, "1.2 未执行操作", 2) + p(doc, "为避免生成真实订单、变更资金、上传个人文件、修改密码或退出当前会话,本文未点击自动领取、订单提交、储入提交、取出确认、收款信息提交、头像上传、密码提交和退出登录。对应需求由页面字段、前端接口定义与上下游数据状态推导,并标记为待联调确认。") + + heading(doc, "2 产品定位与角色", 1) + p(doc, "产品可定位为移动端会员任务与佣金账户平台。用户通过注册、储入余额、领取任务订单、完成任务、获得本金返还与佣金,并可查看台账或发起取出。平台通过等级、任务数量和费率管理用户权益,通过客服处理储入、异常订单和账户问题。") + add_table(doc, ["角色", "主要目标", "关键权限"], [ + ("游客", "了解平台并注册", "登录、注册、查看隐私政策"), + ("会员", "领取任务并查看收益", "首页、任务、订单、余额、客服、个人设置"), + ("高级会员", "按等级获得更多任务和更高费率", "等级权益、额度与次数受配置控制"), + ("客服", "处理储入、取出、异常任务", "会话、工单、用户与交易查询"), + ("运营", "管理内容、等级、任务和公告", "配置、发布、审核、数据看板"), + ("财务与风控", "审核资金和异常行为", "充值审核、提现审核、台账、风控规则"), + ("管理员", "维护权限与系统参数", "RBAC、审计日志、系统配置"), + ], [0.8, 2.1, 3.5]) + + heading(doc, "3 信息架构与页面路由", 1) + add_table(doc, ["一级模块", "页面或路由", "核心内容", "入口"], [ + ("认证", "/login /register", "手机号登录、账户名、推荐码、验证码", "未登录访问"), + ("首页", "/home", "活动图、快捷入口、余额、荣誉榜、会员等级、公司介绍", "底部首页"), + ("任务", "/receive /orderDetail", "领取、等待、任务详情、提交完成", "底部领取"), + ("记录", "记录页", "全部、待处理、已完成订单", "底部记录"), + ("手工", "/mall", "手工任务卡片并引导客服", "首页快捷入口"), + ("资金", "/recharge /withdrawal", "储入、取出、余额、交易密码", "首页与个人中心"), + ("账户", "/mine /personalInfo", "用户资料、信用分、邀请码、设置", "底部我的"), + ("明细", "/depositRecord /withdrawalRecord /bill", "储入、取出、余额台账", "我的"), + ("客服", "/customerService /iframeCustom", "客服列表与第三方会话", "底部客服"), + ("内容", "/html/{id}", "平台简介、规则、代理、资质", "首页公司简介"), + ], [0.7, 1.45, 3.1, 1.0]) + heading(doc, "3.1 建议导航原则", 2) + for item in [ + "底部五栏固定为首页、记录、领取、客服、我的;详情页隐藏底部栏并保留明确返回。", + "资金页面必须显示币种、可用余额、冻结余额、预计到账和手续费,不使用含义不明的“人民币编码”。", + "所有金额变动都能跳转至同一业务单据,并在台账中保持可解释、可追溯。", + "客服 iframe 需明确第三方来源、隐私边界和会话状态,失败时提供备用联系方式。", + ]: + bullet(doc, item) + + heading(doc, "4 核心业务闭环", 1) + heading(doc, "4.1 任务订单闭环", 2) + for item in [ + "用户进入领取中心,系统校验登录态、营业时间、会员等级、最低可用余额、未完成任务与风控状态。", + "用户点击领取后,系统创建或匹配一笔任务订单,返回任务编号、商品、金额、佣金、截止时间与状态。", + "任务确认时,台账先记录交易扣款;完成后记录本金返还和佣金入账。参考数据中同一业务单号出现 -298、+298、+14.9 三条流水。", + "订单必须支持待领取、匹配中、待处理、处理中、已完成、超时、冻结、取消与失败,并记录每次状态变化。", + "任何补差额、冻结或信用分变化都必须有明确原因、复核入口和申诉渠道;不得依赖口头客服指令。", + ]: + numbered(doc, item) + heading(doc, "4.2 储入与取出闭环", 2) + p(doc, "储入页面按等级展示金额、赠送额、每日单数和佣金比例,用户填写金额与姓名后提交。参考站点还要求联系客服获取收款方式。新系统应改为平台内生成可核验的支付订单,禁止客服通过聊天发送临时个人账户。") + p(doc, "取出前需绑定姓名、银行名、银行账户与收款码,随后输入金额和交易密码。新系统应只保留与实际支付通道必要的字段,敏感数据加密存储,收款码上传须做病毒扫描、内容校验与访问控制。") + heading(doc, "4.3 会员与代理闭环", 2) + p(doc, "参考站点设置普通、白银、黄金、铂金、钻石、星耀、至尊七档,充值门槛、赠送额、每日单数和佣金比例逐级上升,并存在三级推荐奖励。建议将等级规则做成版本化配置,禁止前端写死;代理奖励必须在合规评估通过后再启用。") + + page_break(doc) + heading(doc, "5 页面级功能需求", 1) + heading(doc, "5.1 登录与注册", 2) + add_table(doc, ["页面", "字段与控件", "校验与行为", "验收要点"], [ + ("登录", "手机号、密码、记住密码、登录、去注册、隐私政策", "手机号格式;密码非空;错误次数限制;登录成功进入首页", "不在本地明文保存密码;支持会话过期提示"), + ("注册", "账户名、11 位手机号、密码、推荐码、图片验证码、隐私政策", "账户名必填;手机号唯一;验证码校验;推荐码可选或按运营配置", "提交前明确同意协议;防批量注册;注册成功自动登录或返回登录"), + ("会话", "Authorization 令牌", "401 清除会话并返回登录;403 显示可解释错误", "支持刷新、撤销、设备管理与退出所有设备"), + ], [0.65, 2.1, 2.35, 1.55]) + + heading(doc, "5.2 首页", 2) + for item in [ + "展示轮播图或单图运营位,支持后台排序、上下线、跳转类型和有效期。", + "快捷入口为领取、储入、取出、手工;按后台开关显示,关闭时给出原因而不是静默失效。", + "账户卡展示昵称、可用余额与币种;点击可进入账户明细。", + "荣誉榜为脱敏昵称、积分和结果状态,要求数据真实性标识、刷新频率与隐私策略。", + "会员等级展示当前等级、费率和下一等级条件;等级图不得只是一张不可访问的图片。", + "公司简介包括平台简介、规则说明、代理合作和公司资质,内容由 CMS 管理并保留版本。", + ]: + bullet(doc, item) + + heading(doc, "5.3 记录与订单详情", 2) + p(doc, "记录页显示可用资产,提供全部、待处理、已完成三种筛选。列表项包括创建时间、商品图、商品名、商品价格、佣金与状态。分页默认 10 条,支持下拉刷新、空状态、加载失败重试和详情跳转。") + p(doc, "实测发现先切换待处理、再切换已完成时曾短暂出现空列表,而重新加载全部后可见已完成记录。验收时需覆盖筛选参数、缓存状态和并发请求覆盖问题。") + add_table(doc, ["状态", "用户可见文案", "允许操作", "系统约束"], [ + ("匹配中", "正在匹配任务", "取消等待", "只允许一个匹配请求"), + ("待处理", "请在截止时间前完成", "查看详情、提交", "倒计时与服务端时间一致"), + ("处理中", "已提交,等待确认", "查看详情、联系客服", "防重复提交"), + ("已完成", "本金与佣金已入账", "查看流水", "三笔或组合流水必须可核对"), + ("超时或冻结", "显示原因与处理路径", "申诉、联系客服", "需要人工复核和审计"), + ("失败或取消", "显示失败原因", "重新领取", "不得产生不一致余额"), + ], [0.8, 2.1, 1.4, 2.35]) + + heading(doc, "5.4 领取中心", 2) + p(doc, "领取中心包含会员等级、佣金费率、主领取按钮、匹配进度、今日战果和规则说明。点击主按钮前需完成资格预检;按钮点击后立即进入不可重复提交的 loading 状态;匹配成功跳转订单详情,失败显示可恢复原因。") + bullet(doc, "预检项:营业时间、账户状态、信用或风控状态、最低余额、当日次数、未完成订单、等级商品范围。") + bullet(doc, "统计项:总资产、昨日佣金、今日佣金、今日领取数;所有统计口径需要后台统一定义。") + bullet(doc, "规则文案需要 CMS 管理,禁止把风控与资金规则硬编码在页面。") + + heading(doc, "5.5 手工商城", 2) + p(doc, "页面以双列卡片展示图片、任务名称、份数、工资与已领取数;点击卡片实测直接进入客服页。建议增加任务详情、适用人群、交付方式、预计周期、库存、审核标准和风险提示,再由用户主动发起咨询。") + p(doc, "参考站点一条商品名称中可见脚本标签文本,说明内容过滤不足。新系统必须对运营内容做 HTML 转义、富文本白名单、图片域名白名单和持久型 XSS 检测。") + + heading(doc, "5.6 客服", 2) + p(doc, "客服页展示多个客服入口与工作时间,点击后在站内 iframe 打开第三方聊天。聊天页含历史会话、系统消息、文本框、图片与视频上传。需求上应增加服务状态、排队人数、会话编号、隐私声明、附件大小与类型限制、敏感信息提醒和会话评价。") + + page_break(doc) + heading(doc, "5.7 我的与个人信息", 2) + add_table(doc, ["功能", "需求", "边界或风险"], [ + ("资料概览", "头像、昵称、邀请码、会员等级、信用状态、余额", "手机号等敏感字段默认脱敏"), + ("储入与取出", "提供余额入口与状态提示", "资金操作必须二次确认与风控"), + ("收款信息", "姓名、银行、账户、可选支付通道", "加密、最小化收集、修改留痕"), + ("头像", "上传、裁剪、预览、替换", "文件扫描、大小和格式校验"), + ("密码", "旧密码、新密码、确认密码", "强度、频控、成功后令牌失效"), + ("交易密码", "独立于登录密码", "不得用无盐 MD5;失败次数锁定"), + ("通知", "公告列表、未读、已读、详情", "重要规则变更需留存阅读证据"), + ("退出", "清除令牌和本地用户数据", "保留确认,避免误触"), + ], [1.0, 3.1, 2.45]) + + heading(doc, "5.8 储入", 2) + p(doc, "页面展示等级规则表和金额、姓名输入框。参考规则为普通 500、白银 1888、黄金 10000、铂金 30000、钻石 50000、星耀 88888、至尊 188888;费率从 1.8% 到 5%。规则说明和表格存在个别口径差异,必须以后台版本化配置为唯一事实源。") + bullet(doc, "提交前展示收款主体、订单号、有效期、金额、手续费和风险提示。") + bullet(doc, "储入订单状态:待支付、待审核、成功、失败、过期、取消;失败必须提供原因。") + bullet(doc, "若需要上传付款凭证,必须经过用户明确选择,并限制为图片或 PDF。") + + heading(doc, "5.9 取出与收款绑定", 2) + p(doc, "取出页面展示余额、金额、已绑定收款信息摘要和交易密码。若未绑定,弹窗提示并引导至绑定页。绑定页实测字段为姓名、银行名、银行账户、人民币编码、支付宝收款码和微信收款码。建议删除含义不清或非必要字段,并根据支付渠道动态展示。") + bullet(doc, "金额校验:大于 0、不超过可用余额、符合单笔最小值和最大值,并显示手续费与到账金额。") + bullet(doc, "状态:待审核、审核中、处理中、成功、失败、驳回、取消;用户可查看原因和预计时间。") + bullet(doc, "交易密码只在提交时使用;服务端采用强哈希校验并配合频率限制、设备风控和二次验证。") + + page_break(doc) + heading(doc, "\u20605.10 账户明细与记录", 2) + p(doc, "账户明细需按业务单号聚合展示变动类型、变动金额、变动前余额、变动后余额、时间、状态和关联单据。储入记录显示订单号、状态、金额、创建时间;取出记录字段同构,并增加手续费、到账金额与失败原因。") + + heading(doc, "6 数据模型与状态机", 1) + add_table(doc, ["实体", "关键字段", "说明"], [ + ("User", "id, username, mobile, avatar, status, inviteCode", "用户主档,手机号单独加密与索引"), + ("Membership", "levelId, rate, dailyLimit, withdrawLimits, effectiveAt", "版本化等级权益"), + ("Wallet", "available, frozen, currency, version", "使用乐观锁或账户序列保证一致性"), + ("LedgerEntry", "bizNo, type, direction, amount, before, after", "不可变台账,支持幂等与冲正"), + ("TaskOrder", "orderNo, productId, amount, commission, status, deadline", "任务生命周期"), + ("DepositOrder", "depositNo, amount, channel, status, proofUrl", "储入生命周期"), + ("WithdrawalOrder", "withdrawNo, amount, fee, netAmount, status", "取出生命周期"), + ("PayoutProfile", "realName, bankName, maskedAccount, qrAssetIds", "敏感字段加密与脱敏"), + ("Content", "type, title, body, version, status, publishedAt", "公告、规则与公司资料"), + ("SupportSession", "sessionNo, provider, status, openedAt, closedAt", "第三方客服映射"), + ("AuditLog", "actor, action, target, before, after, ip, device", "资金与权限操作强制留痕"), + ], [1.05, 3.55, 2.0]) + heading(doc, "6.1 幂等与一致性", 2) + for item in [ + "领取、提交订单、储入回调、取出申请和密码修改都必须使用幂等键。", + "钱包余额只能由服务端台账事务修改;前端显示值不参与结算。", + "订单状态转换由服务端状态机控制,不允许客户端任意设置。", + "重复回调、网络重试和并发点击不得重复扣款、返款或发佣金。", + "所有涉及金额的接口返回业务单号和最新余额版本。", + ]: + bullet(doc, item) + + heading(doc, "7 接口需求", 1) + p(doc, "下表分为实测请求与前端资源中可见接口。实测接口在浏览器中返回 HTTP 200,响应外层为 Base64 字符串,解码后为 JSON,统一包含 success、code、data、msg。建议新系统直接使用标准 JSON,不把 Base64 当作安全措施。") + add_table(doc, ["方法", "接口", "用途", "主要请求或返回字段", "证据"], [ + ("POST", "/wap-api/doLogin", "登录", "username, password;token, users", "前端实现与已发生请求"), + ("POST", "/wap-api/doRegister", "注册", "nickName, username, password, inviteCode, code, uuid", "前端实现"), + ("GET", "/wap-api/captchaImage", "图片验证码", "uuid, img, captchaBol", "前端实现"), + ("GET", "/wap-api/profile", "用户概要", "tel, username, headpic, inviteCode, level, levelRate, balance, xyf", "实测"), + ("GET", "/wap-api/banner/list", "首页横幅", "图片地址数组", "实测"), + ("GET", "/wap-api/home", "首页开关与内容编号", "SHOP_STATUS, TASK, POP_MESSAGE, 内容 ID", "实测"), + ("GET", "/wap-api/user/data/home", "荣誉榜", "name, avatar, balance", "实测"), + ("GET", "/wap-api/ctrl/level-list", "等级配置", "name, orderNum, num, giveNum, bili, 提现限制", "实测"), + ("GET", "/wap-api/support", "客服列表", "qq, url, workTime, 分页", "实测"), + ("GET", "/wap-api/convey/page", "订单分页", "pageNo, pageSize, status;订单与商品字段", "实测"), + ("POST", "/wap-api/convey/order", "领取或匹配订单", "无显式参数;返回订单", "前端实现,未执行"), + ("POST", "/wap-api/convey/order/submit/{id}", "提交任务", "订单 id", "前端实现,未执行"), + ("GET", "/wap-api/convey/count", "领取统计", "balance, countToday, countNumToday, countNumYesterday, content", "实测"), + ("GET", "/wap-api/convey/unpay", "未完成订单检查", "djs 等状态", "实测"), + ("GET", "/wap-api/product/page", "手工商品分页", "分页条件;商品卡片", "前端实现"), + ("GET", "/wap-api/platform-config/trade-wait-time", "任务等待时间", "秒数或分钟数", "实测"), + ("GET", "/wap-api/bank/current/info", "当前收款信息", "收款资料摘要", "前端实现"), + ("POST", "/wap-api/bank/save", "保存收款信息", "姓名、银行、账户、收款码", "前端实现,未执行"), + ("POST", "/wap-api/recharge/recharge", "创建储入申请", "amount, name 等", "前端实现,未执行"), + ("GET", "/wap-api/recharge/page", "储入记录分页", "分页与状态", "前端实现"), + ("POST", "/wap-api/deposit/do_deposit", "创建取出申请", "amount, paypassword 等", "前端实现,未执行"), + ("GET", "/wap-api/deposit/page", "取出记录分页", "分页与状态", "前端实现"), + ("GET", "/wap-api/balance-log/page", "账户流水", "分页;类型、金额、业务单号", "前端实现与页面实测"), + ("POST", "/wap-api/users/setPwd", "修改登录密码", "oldPwd, newPwd", "前端实现,未执行"), + ("POST", "/wap-api/users/setPwd2", "修改交易密码", "oldPwd, newPwd", "前端实现,未执行"), + ("POST", "/wap-api/local/upload", "文件上传", "multipart file", "前端实现,未执行"), + ("GET/POST", "/wap-api/user-tc/select /read/{id} /page", "弹窗通知", "公告、已读、分页", "实测与前端实现"), + ], [0.55, 1.65, 1.25, 2.45, 0.85], 7.2) + + heading(doc, "7.1 新系统接口规范", 2) + for item in [ + "统一使用 HTTPS、JSON、明确的 HTTP 状态码、traceId、错误码和可本地化 message。", + "Authorization 使用短期访问令牌与可撤销刷新令牌;敏感操作增加一次性挑战或二次验证。", + "列表接口统一 page、pageSize、sort、status,返回 items、total、hasNext。", + "金额使用最小货币单位整数或高精度 Decimal,禁止浮点结算。", + "上传接口先申请受限上传凭证,服务端扫描后再绑定业务。", + "所有写接口要求 Idempotency-Key、设备信息与审计上下文。", + ]: + bullet(doc, item) + + heading(doc, "8 管理后台需求", 1) + add_table(doc, ["模块", "主要能力", "审批与审计"], [ + ("用户管理", "查询、状态、等级、信用、设备、邀请关系", "冻结与解冻需理由和双人复核"), + ("等级配置", "门槛、赠送、次数、费率、提现限制、商品范围", "版本化发布,可回滚"), + ("任务商品", "商品、图片、金额、佣金、库存、上下线", "内容过滤和审核流"), + ("任务订单", "状态、倒计时、资金流水、异常处理", "人工改状态必须双人审批"), + ("储入管理", "支付订单、回调、凭证、审核、对账", "每日对账与差错处理"), + ("取出管理", "审核、通道、手续费、失败重试", "大额与异常规则"), + ("内容管理", "横幅、规则、简介、资质、公告", "预览、定时、版本与发布人"), + ("客服管理", "客服入口、工作时间、会话映射、工单", "第三方访问最小权限"), + ("风控", "设备、IP、频次、关联账户、异常金额", "命中规则可解释并可申诉"), + ("权限审计", "RBAC、操作日志、导出日志", "关键权限定期复核"), + ], [1.0, 3.65, 2.1]) + + heading(doc, "9 非功能需求", 1) + heading(doc, "9.1 安全", 2) + for item in [ + "密码使用 Argon2id 或 bcrypt 加盐存储。参考站点在浏览器端对密码做 MD5,这不能替代服务端强哈希。", + "输入与富文本做上下文相关转义;运营内容采用白名单;CSP 禁止任意外部脚本。", + "银行卡和手机号加密存储,日志与埋点禁止记录完整值;展示统一脱敏。", + "接口启用 CSRF 或同站策略、速率限制、风控挑战、签名回调和重放保护。", + "第三方客服 iframe 设置最小 sandbox 权限、allowlist 域名和清晰的数据传输告知。", + "上传文件限制 MIME、扩展名、体积与像素,执行恶意内容扫描,使用隔离存储和短期访问 URL。", + ]: + bullet(doc, item) + heading(doc, "9.2 性能与可用性", 2) + for item in [ + "首屏 LCP 目标小于 2.5 秒,核心 API P95 小于 800 毫秒,写操作 P95 小于 1.5 秒。", + "按钮防抖、请求取消、重试与离线提示;长列表分页和图片懒加载。", + "资金写入接口可用性目标 99.95%,客服与内容接口目标 99.9%。", + "客户端时间仅用于展示,截止时间与状态以服务端为准。", + ]: + bullet(doc, item) + heading(doc, "9.3 可访问性与国际化", 2) + p(doc, "按钮和导航必须有语义标签与至少 44×44 像素触控区域;颜色不作为唯一状态标识;支持字体放大。简体、繁体和术语需统一,避免同一页面混用“储入/充值”“取出/提现”“领取/抢单”。") + + heading(doc, "10 合规与业务风险", 1) + p(doc, "参考站点涉及先储入、任务扣款、返本付佣、推荐奖励、信用分和提现限制。此类模式在不同司法辖区可能触及支付、消费者保护、反洗钱、网络营销或其他监管要求。上线前需由法务和持牌支付机构评估,不应直接复制其资金规则、免责条款或客服收款模式。") + add_table(doc, ["风险", "参考站点表现", "新系统要求", "优先级"], [ + ("资金真实性", "客服提供收款方式,失败责任不清", "使用合规支付通道、订单化收款与自动对账", "P0"), + ("诱导与不透明", "高等级对应更高储入和收益", "明确费用、风险、无保证收益,禁止误导", "P0"), + ("推荐奖励", "三级佣金 16% 8% 4%", "法务审查后决定是否启用", "P0"), + ("账户冻结", "规则含冻结、补差额、信用分", "冻结需合法依据、通知、申诉和复核", "P0"), + ("内容安全", "商品名出现脚本标签文本", "CMS 白名单与持久型 XSS 防护", "P0"), + ("密码安全", "前端无盐 MD5", "服务端强哈希、MFA、频控", "P0"), + ("隐私", "收集银行账户和收款码", "最小化、加密、授权、删除与访问审计", "P0"), + ("数据一致性", "筛选短暂空列表、规则口径差异", "单一配置源、请求竞态处理、自动化测试", "P1"), + ], [1.0, 2.0, 2.9, 0.65]) + + heading(doc, "11 埋点与运营指标", 1) + add_table(doc, ["事件", "触发时机", "关键属性"], [ + ("auth_login_result", "登录成功或失败", "result, errorCode, deviceRisk"), + ("home_shortcut_click", "点击首页快捷入口", "target, userLevel"), + ("order_claim_click", "点击领取", "eligibilityResult, balanceBucket, level"), + ("order_state_change", "订单状态变化", "orderNo, from, to, reason"), + ("deposit_submit", "提交储入申请", "amountBucket, channel, result"), + ("withdraw_submit", "提交取出申请", "amountBucket, fee, result"), + ("support_open", "打开客服会话", "provider, entry, workStatus"), + ("content_view", "查看规则或公告", "contentId, version, readDuration"), + ("security_challenge", "触发安全验证", "scene, result, ruleId"), + ], [1.35, 2.2, 3.0]) + p(doc, "核心指标包括注册转化、首个任务完成率、领取成功率、订单超时率、储入成功率、取出成功率与处理时长、客服转人工率、异常账户率、账务差错率和投诉率。涉及金额与身份的数据只做区间化或匿名化统计。") + + heading(doc, "12 验收标准", 1) + for idx, item in enumerate([ + "未登录用户只能访问登录、注册和公开协议;受保护路由统一拦截。", + "同一用户重复点击领取或提交订单,不产生重复业务单和重复资金流水。", + "订单完成后,订单状态、钱包余额、三类流水和统计数据在一次事务或可验证最终一致性中完成。", + "储入与取出所有状态均可在记录页查询,失败和驳回有明确原因。", + "等级规则由后台发布后前台一致生效,表格、领取校验与提现限制不存在口径差异。", + "手机号、银行卡、邀请码和交易密码不出现在客户端日志、服务端普通日志或分析平台。", + "富文本、商品名、公告和客服消息中的脚本或危险 HTML 不能执行。", + "接口 401、403、429、5xx、超时和断网场景均有清晰恢复路径。", + "移动端 320 至 430 像素宽度可用,底部导航不遮挡内容,键盘弹出时表单按钮可达。", + "关键资金和权限操作在后台可按用户、业务单号和时间完整审计。", + ], 1): + p(doc, f"{idx}. {item}") + + heading(doc, "13 交付优先级与里程碑", 1) + add_table(doc, ["阶段", "范围", "退出条件"], [ + ("MVP 认证与账户", "登录注册、资料、钱包、台账、内容、客服", "权限、安全、审计基线通过"), + ("MVP 任务闭环", "任务列表、领取、详情、提交、状态机、佣金", "幂等和账务一致性测试通过"), + ("资金闭环", "储入、取出、收款绑定、支付通道、对账", "支付与法务合规评审通过"), + ("运营能力", "等级、公告、横幅、商品、通知、后台", "配置版本和发布审核可用"), + ("增长与优化", "邀请关系、数据看板、体验优化", "合规批准且核心指标稳定"), + ], [1.1, 3.55, 2.0]) + + page_break(doc) + heading(doc, "14 低保真原型", 1) + p(doc, "以下原型根据实测页面重新绘制,用于确认页面层级、组件位置和交互入口,不复制原站品牌素材、头像或敏感数据。视觉设计阶段应重新建立色彩、字体、图标和组件规范。") + for idx, fig in enumerate(figures, 1): + add_picture(doc, fig, f"图 {idx} 参考站点功能复刻原型", width=6.2, page_break_before=(idx > 1)) + + final_heading = heading(doc, "15 待确认事项", 1) + final_heading.paragraph_format.page_break_before = True + for item in [ + "目标产品是否真实涉及用户资金储入与取出,还是仅做演示积分。", + "任务来源、商品真实性、结算主体和佣金承担方。", + "目标市场与适用法律、支付通道和实名要求。", + "是否保留会员等级、推荐奖励、信用分和冻结机制。", + "客服使用自建系统还是第三方服务,允许传输哪些用户数据。", + "管理后台的组织结构、审批层级和财务对账责任人。", + "品牌名、语言版本、视觉方向与是否需要 App 壳或 PWA。", + ]: + bullet(doc, item) + p(doc, "在上述事项明确前,可以先完成无资金风险的认证、内容、任务展示、客服、账户明细和后台配置原型;资金接口只做沙箱与模拟数据。") + + doc.core_properties.title = "移动端任务与账户平台需求文档" + doc.core_properties.subject = "参考站点功能拆解与重构建议" + doc.core_properties.author = "Product Requirement Analysis" + doc.core_properties.keywords = "需求文档, 移动端, 任务订单, 账户, 接口, 原型" + doc.save(OUT_DOCX) + print(OUT_DOCX) + + +if __name__ == "__main__": + build_doc() diff --git a/tools/convert_admin_prd_to_markdown.py b/tools/convert_admin_prd_to_markdown.py new file mode 100644 index 0000000..3a212e8 --- /dev/null +++ b/tools/convert_admin_prd_to_markdown.py @@ -0,0 +1,146 @@ +from __future__ import annotations + +import hashlib +import re +from pathlib import Path + +from docx import Document +from docx.oxml.ns import qn +from docx.table import Table +from docx.text.paragraph import Paragraph + + +ROOT = Path(__file__).resolve().parents[1] +DOC_DIR = ROOT / "docs" / "admin_reference_prd" +SOURCE = DOC_DIR / "后台管理系统需求文档.docx" +TARGET = DOC_DIR / "后台管理系统需求文档.md" +ASSET_DIR = DOC_DIR / "assets" + +IMAGE_ALTS = { + "prototype_01_dashboard.png": "后台首页看板脱敏原型", + "prototype_02_member_list.png": "会员列表脱敏原型", + "prototype_03_member_modal.png": "会员编辑弹窗原型", + "prototype_04_withdrawal.png": "提现审核脱敏原型", + "prototype_05_rbac.png": "RBAC 角色权限原型", + "prototype_06_flow.png": "C 端与后台业务闭环原型", +} + + +def iter_blocks(document: Document): + for child in document.element.body.iterchildren(): + if child.tag == qn("w:p"): + yield Paragraph(child, document) + elif child.tag == qn("w:tbl"): + yield Table(child, document) + + +def media_map(document: Document) -> dict[str, str]: + assets_by_hash = { + hashlib.sha256(path.read_bytes()).hexdigest(): path.name + for path in ASSET_DIR.glob("*.png") + } + mapping: dict[str, str] = {} + for rel_id, rel in document.part.rels.items(): + if "image" not in rel.reltype: + continue + digest = hashlib.sha256(rel.target_part.blob).hexdigest() + name = assets_by_hash.get(digest) + if name: + mapping[rel_id] = f"assets/{name}" + return mapping + + +def paragraph_images(paragraph: Paragraph, images: dict[str, str]) -> list[str]: + result: list[str] = [] + for blip in paragraph._p.xpath(".//a:blip"): + rel_id = blip.get(qn("r:embed")) + if rel_id in images: + result.append(images[rel_id]) + return result + + +def escape_cell(value: str) -> str: + return value.strip().replace("|", "\\|").replace("\n", "
") or "—" + + +def table_markdown(table: Table) -> list[str]: + rows = [[escape_cell(cell.text) for cell in row.cells] for row in table.rows] + if not rows: + return [] + width = max(len(row) for row in rows) + rows = [row + ["—"] * (width - len(row)) for row in rows] + lines = [ + "| " + " | ".join(rows[0]) + " |", + "| " + " | ".join(["---"] * width) + " |", + ] + lines.extend("| " + " | ".join(row) + " |" for row in rows[1:]) + return lines + + +def github_slug(title: str) -> str: + slug = title.strip().lower() + slug = re.sub(r"[^\w\-\u4e00-\u9fff ]", "", slug) + return re.sub(r"\s+", "-", slug) + + +def convert() -> None: + document = Document(SOURCE) + images = media_map(document) + body: list[str] = [] + top_level: list[str] = [] + image_number = 0 + + for block in iter_blocks(document): + if isinstance(block, Table): + body.extend(table_markdown(block)) + body.append("") + continue + + text = block.text.strip() + style = block.style.name if block.style else "Normal" + embedded = paragraph_images(block, images) + + if style == "Title" and text: + body.extend([f"# {text}", ""]) + elif style == "Heading 1" and text: + top_level.append(text) + body.extend([f"## {text}", ""]) + elif style == "Heading 2" and text: + body.extend([f"### {text}", ""]) + elif style == "List Bullet" and text: + body.extend([f"- {text}", ""]) + elif style == "List Number" and text: + body.extend([f"1. {text}", ""]) + elif text: + if text.startswith("结论:"): + body.extend([f"> **{text[:3]}** {text[3:]}", ""]) + elif text.startswith("P0:"): + body.extend([f"> **P0 风险:** {text[3:]}", ""]) + else: + body.extend([text, ""]) + + for path in embedded: + image_number += 1 + alt = IMAGE_ALTS.get(Path(path).name, f"需求原型图 {image_number}") + body.extend([f"![{alt}]({path})", ""]) + + # Word 封面之后放置 Markdown 可点击目录,去掉 Word 中无意义的空段落。 + first_section = next(i for i, line in enumerate(body) if line.startswith("## 1 ")) + toc = ["## 目录", ""] + toc.extend(f"- [{title}](#{github_slug(title)})" for title in top_level) + toc.extend(["", "---", ""]) + output = body[:first_section] + toc + body[first_section:] + + compact: list[str] = [] + for line in output: + if line == "" and compact and compact[-1] == "": + continue + compact.append(line) + rendered = "\n".join(compact).rstrip() + "\n" + rendered = re.sub(r"(^- .+)\n\n(?=- )", r"\1\n", rendered, flags=re.MULTILINE) + rendered = re.sub(r"(^1\. .+)\n\n(?=1\. )", r"\1\n", rendered, flags=re.MULTILINE) + TARGET.write_text(rendered, encoding="utf-8") + + +if __name__ == "__main__": + convert() diff --git a/tools/fonts.conf b/tools/fonts.conf new file mode 100644 index 0000000..797afa6 --- /dev/null +++ b/tools/fonts.conf @@ -0,0 +1,8 @@ + + + + /System/Library/Fonts + /System/Library/Fonts/Supplemental + /Library/Fonts + /private/tmp/codex-font-cache + diff --git a/tools/revise_mobile_prd_from_admin.py b/tools/revise_mobile_prd_from_admin.py new file mode 100644 index 0000000..e41208d --- /dev/null +++ b/tools/revise_mobile_prd_from_admin.py @@ -0,0 +1,302 @@ +from __future__ import annotations + +from pathlib import Path + +from docx import Document +from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT, WD_TABLE_ALIGNMENT +from docx.enum.text import WD_ALIGN_PARAGRAPH +from docx.oxml import OxmlElement +from docx.oxml.ns import qn +from docx.shared import Inches, Pt, RGBColor +from docx.text.paragraph import Paragraph + + +ROOT = Path(__file__).resolve().parents[1] +SOURCE = ROOT / "docs" / "reference_site_prd" / "移动端任务与账户平台需求文档.docx" +OUT_DIR = ROOT / "docs" / "reference_site_prd_v2" +OUTPUT = OUT_DIR / "移动端任务与账户平台需求文档 V2.docx" + +INK = "18202F" +MUTED = "667085" +GRID = "D9D9D9" + + +def set_font(run, size=10.5, bold=False, color=INK): + run.font.name = "Heiti SC" + run._element.get_or_add_rPr().rFonts.set(qn("w:eastAsia"), "Heiti SC") + run.font.size = Pt(size) + run.font.bold = bold + run.font.color.rgb = RGBColor.from_string(color) + + +def replace_all(doc, old: str, new: str): + for paragraph in list(doc.paragraphs) + list(doc.sections[0].header.paragraphs): + if old not in paragraph.text: + continue + full = paragraph.text.replace(old, new) + for run in paragraph.runs: + run.text = "" + run = paragraph.runs[0] if paragraph.runs else paragraph.add_run() + run.text = full + style = paragraph.style.name if paragraph.style else "" + if style == "Title": + set_font(run, 25, True, "000000") + elif style.startswith("Heading"): + set_font(run, 14, True, "000000") + else: + set_font(run, 10.5) + + +def find_paragraph(doc, exact: str): + for p in doc.paragraphs: + if p.text.strip() == exact: + return p + raise ValueError(f"Paragraph not found: {exact}") + + +def add_before(anchor, text: str, style: str | None = None, size=10.5, bold=False, color=INK, + space_before=0, space_after=6): + p = OxmlElement("w:p") + anchor._p.addprevious(p) + paragraph = Paragraph(p, anchor._parent) + if style: + paragraph.style = style + paragraph.paragraph_format.space_before = Pt(space_before) + paragraph.paragraph_format.space_after = Pt(space_after) + paragraph.paragraph_format.line_spacing = 1.25 + set_font(paragraph.add_run(text), size, bold, color) + return paragraph + + +def add_heading_before(anchor, text: str, level=2): + sizes = {1: 18, 2: 14, 3: 11.5} + return add_before(anchor, text, f"Heading {level}", sizes[level], True, "000000", 10, 6) + + +def add_bullet_before(anchor, text: str): + return add_before(anchor, text, "List Bullet", 10.2, False, INK, 0, 3) + + +def set_cell(cell, text, header=False, shade=None, align=WD_ALIGN_PARAGRAPH.LEFT, size=8.6): + cell.text = str(text) + cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER + tc_pr = cell._tc.get_or_add_tcPr() + mar = OxmlElement("w:tcMar") + for side in ("top", "start", "bottom", "end"): + node = OxmlElement(f"w:{side}") + node.set(qn("w:w"), "100") + node.set(qn("w:type"), "dxa") + mar.append(node) + tc_pr.append(mar) + borders = OxmlElement("w:tcBorders") + for edge in ("top", "left", "bottom", "right"): + node = OxmlElement(f"w:{edge}") + node.set(qn("w:val"), "single") + node.set(qn("w:sz"), "6") + node.set(qn("w:color"), GRID) + borders.append(node) + tc_pr.append(borders) + if shade: + shd = OxmlElement("w:shd") + shd.set(qn("w:fill"), shade) + tc_pr.append(shd) + p = cell.paragraphs[0] + p.alignment = align + p.paragraph_format.space_after = Pt(0) + for run in p.runs: + set_font(run, size, header, "FFFFFF" if header else INK) + + +def table_before(doc, anchor, headers, rows, widths): + table = doc.add_table(rows=1, cols=len(headers)) + table.alignment = WD_TABLE_ALIGNMENT.CENTER + table.autofit = False + table.rows[0]._tr.get_or_add_trPr().append(OxmlElement("w:cantSplit")) + repeat = OxmlElement("w:tblHeader") + repeat.set(qn("w:val"), "true") + table.rows[0]._tr.get_or_add_trPr().append(repeat) + for i, h in enumerate(headers): + set_cell(table.rows[0].cells[i], h, True, "334E7D", WD_ALIGN_PARAGRAPH.CENTER) + for ridx, row in enumerate(rows): + tr = table.add_row() + tr._tr.get_or_add_trPr().append(OxmlElement("w:cantSplit")) + for i, value in enumerate(row): + set_cell(tr.cells[i], value, False, "F3F6FB" if ridx % 2 else None, + WD_ALIGN_PARAGRAPH.CENTER if i == 0 else WD_ALIGN_PARAGRAPH.LEFT) + for row in table.rows: + for i, width in enumerate(widths): + row.cells[i].width = Inches(width) + anchor._p.addprevious(table._tbl) + return table + + +def add_revision_summary(doc): + anchor = find_paragraph(doc, "1 文档范围与方法") + add_heading_before(anchor, "0 后台反向校验结论", 1) + add_before(anchor, + "后台走查表明,原 V1 已覆盖账户、任务订单、储入取出和客服等主链路,但对后台可配置项、人工审核、任务大厅、会员限制和运营动作的用户端反馈描述不足。V2 将后台视为业务规则的管理端,并补齐移动端必须展示的状态、原因、时效和恢复路径。") + table_before(doc, anchor, + ["校验主题", "后台证据", "V1 缺口", "V2 调整"], + [ + ("任务模型", "商品订单、任务大厅、任务列表、会员任务审核并存", "容易把所有任务理解为自动领取订单", "拆分自动订单与人工任务两条链路"), + ("资金审核", "充值与提现支持人工通过或驳回", "状态虽有定义,但用户通知与补件不够明确", "增加审核进度、驳回原因、补件和到账凭证"), + ("会员治理", "后台可改等级、禁用、账变和奖励", "移动端缺少被限制后的统一反馈", "增加受限状态页、原因、期限、申诉和台账说明"), + ("运营配置", "营业时间、金额门槛、页面开关、Banner 和文本可配置", "前台规则散落在页面描述中", "建立配置版本、发布时间和客户端降级契约"), + ("内容真实性", "存在假人和弹幕入口", "只提出风险,未明确产品取舍", "生产环境不展示伪造用户行为;演示数据必须标识"), + ("异常恢复", "任务大厅接口异常,客服页可能空白", "通用错误处理不够落地", "每个核心入口增加错误码、重试和备用路径"), + ], [1.0, 2.0, 1.9, 2.0]) + add_before(anchor, "V2 的核心原则是:后台每一次影响用户权益的操作,都必须在移动端形成可解释、可追踪、可申诉的结果。", size=10.5, bold=True) + + +def add_business_closure(doc): + anchor = find_paragraph(doc, "5 页面级功能需求") + add_heading_before(anchor, "4.4 后台操作与移动端反馈闭环", 2) + for text in [ + "后台修改等级、佣金、每日次数或提现限制时,移动端必须显示规则版本和生效时间。进行中的订单继续使用创建时的规则快照。", + "后台审核充值、提现或会员任务后,移动端记录页同步显示审核节点、处理时间、结果和原因,并通过站内通知提醒用户。", + "后台禁用、冻结或限制会员时,移动端不得只表现为接口失败。系统应进入受限状态页,说明受影响功能、期限、原因类别和申诉入口。", + "后台执行余额调整或奖励发放时,移动端账户明细必须产生独立流水,展示业务单号、变动方向、原因摘要和处理主体类型。", + "后台下线 Banner、内容、商品、任务或客服入口后,移动端按配置版本刷新。已打开的页面应显示已下线状态,不得继续提交。", + ]: + add_bullet_before(anchor, text) + + # The V1 builder placed an explicit page break between sections 4 and 5. + # The new 4.4 content now occupies that boundary, so remove the old break to + # avoid leaving section 4.3 alone on a mostly empty page. + paragraphs = doc.paragraphs + closure = find_paragraph(doc, "4.4 后台操作与移动端反馈闭环") + closure_index = next(i for i, paragraph in enumerate(paragraphs) if paragraph._p is closure._p) + for candidate in reversed(paragraphs[:closure_index]): + if candidate._p.xpath('.//w:br[@w:type="page"]'): + candidate._element.getparent().remove(candidate._element) + break + + +def add_mobile_pages(doc): + anchor = find_paragraph(doc, "6 数据模型与状态机") + add_heading_before(anchor, "5.11 任务大厅与会员任务", 2) + add_before(anchor, "后台同时存在任务大厅、任务列表和会员任务审核,因此移动端需要把人工任务与自动领取订单分开设计,避免共用状态和文案。") + table_before(doc, anchor, + ["环节", "移动端需求", "后台对应", "关键状态"], + [ + ("任务大厅", "展示任务名称、图标、奖励、适用等级、剩余名额和截止时间", "任务大厅配置", "未开始、可申请、已满、已结束、已下线"), + ("任务详情", "展示说明、材料要求、审核标准、预计时长和风险提示", "任务列表", "可申请、不可申请、已申请"), + ("提交材料", "支持文本、图片或文件,提交前预览并可撤回", "会员任务审核", "草稿、已提交、审核中"), + ("审核结果", "显示通过、驳回或补件原因,允许查看历史版本", "会员任务审核", "通过、驳回、待补件、已取消"), + ("奖励入账", "审核通过后生成奖励流水和通知", "奖励及账变", "待入账、已入账、入账失败"), + ], [0.9, 2.55, 1.45, 1.85]) + add_heading_before(anchor, "5.12 会员受限与运营通知", 2) + for text in [ + "会员状态至少包括正常、临时限制、冻结、禁用和注销中;登录后优先展示状态说明,而不是让各页面分别报错。", + "站内通知按系统公告、审核结果、资金结果、安全提醒和规则变更分类,重要通知保留已读时间和内容版本。", + "荣誉榜、滚动消息和弹幕只能使用可证明的真实业务数据。测试或演示数据必须与生产数据隔离并明确标识。", + "客服入口不可用时,显示服务时间、错误编号、重试按钮和经审核的备用渠道;不得把空白 iframe 作为最终状态。", + ]: + add_bullet_before(anchor, text) + + +def add_contracts(doc): + anchor = find_paragraph(doc, "8 管理后台需求") + add_heading_before(anchor, "7.2 后台配置与移动端契约", 2) + table_before(doc, anchor, + ["后台配置", "移动端消费方式", "校验与降级"], + [ + ("营业与交易时间", "展示当前可用状态和下一开放时间", "结束时间必须晚于开始时间;配置无效时关闭提交并告警"), + ("金额与次数门槛", "表单提示、按钮状态和服务端校验使用同一版本", "客户端仅展示,服务端最终裁决"), + ("会员等级", "等级页、领取资格、佣金和提现限制统一读取", "订单创建时保存规则快照"), + ("Banner 与文本", "按排序、有效期、语言和跳转类型渲染", "危险链接拦截;富文本白名单"), + ("商品与任务", "仅展示已发布且适用于当前用户的条目", "已下线条目不可新建申请,历史记录仍可查看"), + ("客服入口", "按在线状态、时间和排序展示", "第三方失败时回退到备用联系方式"), + ], [1.35, 3.0, 2.4]) + add_before(anchor, "所有配置响应应包含 configVersion、effectiveAt 和 updatedAt。客户端缓存必须按版本失效,关键交易提交时还要携带规则版本,由服务端拒绝过期规则并返回可读提示。") + + +def add_acceptance(doc): + anchor = find_paragraph(doc, "13 交付优先级与里程碑") + add_heading_before(anchor, "12.1 后台联动补充验收", 2) + for idx, text in enumerate([ + "后台发布新等级规则后,移动端在生效时间后展示新规则;存量订单仍按原规则结算。", + "后台驳回充值、提现或任务申请后,移动端显示同一原因码、用户文案、处理时间和补救入口。", + "后台冻结会员后,移动端所有受影响写操作均被服务端拒绝,并统一跳转受限状态页;解除后无需重新安装或清缓存。", + "后台余额调整和奖励发放均生成不可变流水;移动端可从通知跳转至对应流水详情。", + "任务大厅服务不可用时,移动端保留其他导航功能,显示错误编号并支持重试,不出现空白页或无限加载。", + "客服第三方页面失败时,移动端展示备用渠道,且不泄露令牌、手机号、银行卡或完整会话参数。", + "后台下线商品或任务后,新申请立即禁止;已申请记录仍可查看状态和审核结果。", + "生产环境的榜单、弹幕和消息不得混入测试账号或伪造行为数据。", + ], 11): + add_before(anchor, f"{idx}. {text}") + + +def add_pending_questions(doc): + anchor = find_paragraph(doc, "在上述事项明确前,可以先完成无资金风险的认证、内容、任务展示、客服、账户明细和后台配置原型;资金接口只做沙箱与模拟数据。") + add_heading_before(anchor, "15.1 后台联动待确认", 2) + for text in [ + "任务大厅与自动领取订单是否属于两个独立业务,还是同一任务的不同入口。", + "充值、提现和会员任务的驳回原因由固定字典选择,还是允许运营自由输入。", + "会员禁用、冻结、等级调整和余额调整分别由哪些角色发起、复核与申诉处理。", + "规则配置采用立即生效、定时发布还是审批后发布;存量订单使用哪一版规则。", + "荣誉榜与弹幕是否保留。若保留,只能展示真实、可审计且已脱敏的数据。", + ]: + add_bullet_before(anchor, text) + + +def remove_page_break_before(doc, heading_text: str): + paragraphs = doc.paragraphs + target = find_paragraph(doc, heading_text) + target_index = next(i for i, paragraph in enumerate(paragraphs) if paragraph._p is target._p) + for candidate in reversed(paragraphs[:target_index]): + if candidate._p.xpath('.//w:br[@w:type="page"]'): + candidate._element.getparent().remove(candidate._element) + return + + +def normalize_layout(doc): + # Fill the otherwise nearly empty customer-service page and reset inherited + # indentation that clipped the first digit of a top-of-page heading. + remove_page_break_before(doc, "5.7 我的与个人信息") + remove_page_break_before(doc, "\u20605.10 账户明细与记录") + for text in ("5.7 我的与个人信息", "5.9 取出与收款绑定", "5.10 账户明细与记录"): + paragraph = next(p for p in doc.paragraphs if p.text.strip().endswith(text)) + paragraph.paragraph_format.left_indent = Inches(0) + paragraph.paragraph_format.first_line_indent = Inches(0) + + # The source document predates the table-row split safeguard used by the + # backend PRD. Apply it globally so milestone and interface rows do not break + # across pages. + for table in doc.tables: + for row in table.rows: + tr_pr = row._tr.get_or_add_trPr() + if not tr_pr.xpath('./w:cantSplit'): + tr_pr.append(OxmlElement("w:cantSplit")) + + +def update_metadata(doc): + doc.core_properties.title = "移动端任务与账户平台需求文档 V2" + doc.core_properties.subject = "基于后台功能的移动端需求反向校验修订版" + doc.core_properties.author = "Product Requirement Analysis" + doc.core_properties.keywords = "需求文档, 移动端, 后台联动, 任务, 资金, 审核, 原型" + + +def main(): + OUT_DIR.mkdir(parents=True, exist_ok=True) + doc = Document(SOURCE) + replace_all(doc, "移动端任务与账户平台需求文档", "移动端任务与账户平台需求文档 V2") + replace_all(doc, "参考站点功能拆解与重构建议", "后台反向校验修订版") + replace_all(doc, "文档版本:V1.0", "文档版本:V2.0") + replace_all(doc, + "结论:参考站点由账户、任务订单、余额台账、储入取出、会员等级、内容展示和在线客服七个域构成。建议复刻页面结构与业务闭环,但重写资金、隐私、安全和合规机制。", + "结论:移动端主链路可以保留,但必须新增人工任务、审核结果、会员受限、配置版本和后台账变反馈。资金、权限、隐私和内容真实性仍按高风险能力重构。") + add_revision_summary(doc) + add_business_closure(doc) + add_mobile_pages(doc) + add_contracts(doc) + add_acceptance(doc) + add_pending_questions(doc) + normalize_layout(doc) + update_metadata(doc) + doc.save(OUTPUT) + print(OUTPUT) + + +if __name__ == "__main__": + main() diff --git a/tools/test_docx_fonts.py b/tools/test_docx_fonts.py new file mode 100644 index 0000000..ae715d7 --- /dev/null +++ b/tools/test_docx_fonts.py @@ -0,0 +1,23 @@ +from docx import Document +from docx.oxml.ns import qn + +names = [ + "Heiti SC", + "STHeiti", + "Hiragino Sans GB", + "Songti SC", + "Arial Unicode MS", + "PingFang SC", + "Microsoft YaHei", + "SimSun", + "Noto Sans CJK SC", +] +doc = Document() +for name in names: + p = doc.add_paragraph() + r = p.add_run(name + " 中文字体测试 移动端任务与账户平台") + r.font.name = name + r._element.get_or_add_rPr().rFonts.set(qn("w:ascii"), name) + r._element.get_or_add_rPr().rFonts.set(qn("w:hAnsi"), name) + r._element.get_or_add_rPr().rFonts.set(qn("w:eastAsia"), name) +doc.save("docs/reference_site_prd/font_test.docx") diff --git a/web/.editorconfig b/web/.editorconfig new file mode 100644 index 0000000..d92c3ed --- /dev/null +++ b/web/.editorconfig @@ -0,0 +1,19 @@ +root = true + +[*] +charset=utf-8 +end_of_line=LF +insert_final_newline=true +indent_style=space +indent_size=2 +max_line_length = 100 + +[*.{yml,yaml,json}] +indent_style = space +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false + +[Makefile] +indent_style = tab \ No newline at end of file diff --git a/web/.env.development b/web/.env.development new file mode 100644 index 0000000..d618ebf --- /dev/null +++ b/web/.env.development @@ -0,0 +1,34 @@ +# 只在开发模式中被载入 + +# 网站根目录 +VITE_PUBLIC_PATH=/ + +# 网站前缀 +VITE_BASE_URL=/ + +# 是否删除console +VITE_DROP_CONSOLE=true + +# 跨域代理,可以配置多个,请注意不要换行,如果是公网运行,请改成公网IP:服务端运行端口 +#VITE_PROXY = [["/appApi","http://localhost:8001"],["/upload","http://localhost:8001/upload"]] +VITE_PROXY=[["/admin","http://localhost:8000/admin"]] + + +# API 接口地址 +VITE_GLOB_API_URL= + +# 图片上传地址 +VITE_GLOB_UPLOAD_URL= + +# 图片前缀地址 +VITE_GLOB_IMG_URL= + +# 接口前缀 +VITE_GLOB_API_URL_PREFIX=/admin + +# 快速登录账号密码配置,没有配置则不开启快速登录 +## 格式为 [["账号名称","账号密码","角色名称"],["账号名称","账号密码"],["账号名称"]] +## 帐号名称不能为空,密码为空则和帐号名称相同 +## 角色名称可选,如果不填写则默认使用账号名称作为角色名称 +## 账号名称和角色名称可以重复,账号名称和密码可以重复 +VITE_APP_DEMO_ACCOUNT=[["admin","123456","超管"],["test","123456","管理员"],["ameng","123456","租户"],["abai","123456","商户"],["asong","123456","用户"]] \ No newline at end of file diff --git a/web/.env.production b/web/.env.production new file mode 100644 index 0000000..7a6c774 --- /dev/null +++ b/web/.env.production @@ -0,0 +1,30 @@ +# 只在生产模式中被载入 + +# 网站根目录 +VITE_PUBLIC_PATH=/admin + +# 网站前缀 +VITE_BASE_URL=/ + +# 是否删除console +VITE_DROP_CONSOLE=true + +# API +VITE_GLOB_API_URL= + +# 图片上传地址 +VITE_GLOB_UPLOAD_URL= + +# 图片前缀地址 +VITE_GLOB_IMG_URL= + +# 接口前缀 +VITE_GLOB_API_URL_PREFIX=/admin + +# 是否启用gzip压缩或brotli压缩 +# 可选: gzip | brotli | none +# 如果你需要多种形式,你可以用','来分隔 +VITE_BUILD_COMPRESS='none' + +# 使用压缩时是否删除原始文件,默认为false +VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE=false diff --git a/web/.gitignore b/web/.gitignore new file mode 100644 index 0000000..18a53b5 --- /dev/null +++ b/web/.gitignore @@ -0,0 +1,29 @@ +.DS_Store +node_modules +/screenshots +/dist +dist.zip +dist_electron +package-lock.json +yarn.lock + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +/components.d.ts + diff --git a/web/.prettierignore b/web/.prettierignore new file mode 100644 index 0000000..f7e39e6 --- /dev/null +++ b/web/.prettierignore @@ -0,0 +1,9 @@ +/dist/* +.local +.output.js +/node_modules/** + +**/*.svg +**/*.sh + +/public/* diff --git a/web/.stylelintignore b/web/.stylelintignore new file mode 100644 index 0000000..0517076 --- /dev/null +++ b/web/.stylelintignore @@ -0,0 +1,3 @@ +/dist/* +/public/* +public/* diff --git a/web/LICENSE b/web/LICENSE new file mode 100644 index 0000000..d012d2a --- /dev/null +++ b/web/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021-present Naive Ui Admin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/web/README.md b/web/README.md new file mode 100644 index 0000000..e260b18 --- /dev/null +++ b/web/README.md @@ -0,0 +1 @@ +## HotGo 管理web前端 diff --git a/web/auto-imports.d.ts b/web/auto-imports.d.ts new file mode 100644 index 0000000..0fc6e25 --- /dev/null +++ b/web/auto-imports.d.ts @@ -0,0 +1,79 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// noinspection JSUnusedGlobalSymbols +// Generated by unplugin-auto-import +// biome-ignore lint: disable +export {} +declare global { + const EffectScope: typeof import('vue').EffectScope + const computed: typeof import('vue').computed + const createApp: typeof import('vue').createApp + const customRef: typeof import('vue').customRef + const defineAsyncComponent: typeof import('vue').defineAsyncComponent + const defineComponent: typeof import('vue').defineComponent + const effectScope: typeof import('vue').effectScope + const getCurrentInstance: typeof import('vue').getCurrentInstance + const getCurrentScope: typeof import('vue').getCurrentScope + const getCurrentWatcher: typeof import('vue').getCurrentWatcher + const h: typeof import('vue').h + const inject: typeof import('vue').inject + const isProxy: typeof import('vue').isProxy + const isReactive: typeof import('vue').isReactive + const isReadonly: typeof import('vue').isReadonly + const isRef: typeof import('vue').isRef + const isShallow: typeof import('vue').isShallow + const markRaw: typeof import('vue').markRaw + const nextTick: typeof import('vue').nextTick + const onActivated: typeof import('vue').onActivated + const onBeforeMount: typeof import('vue').onBeforeMount + const onBeforeRouteLeave: typeof import('vue-router').onBeforeRouteLeave + const onBeforeRouteUpdate: typeof import('vue-router').onBeforeRouteUpdate + const onBeforeUnmount: typeof import('vue').onBeforeUnmount + const onBeforeUpdate: typeof import('vue').onBeforeUpdate + const onDeactivated: typeof import('vue').onDeactivated + const onErrorCaptured: typeof import('vue').onErrorCaptured + const onMounted: typeof import('vue').onMounted + const onRenderTracked: typeof import('vue').onRenderTracked + const onRenderTriggered: typeof import('vue').onRenderTriggered + const onScopeDispose: typeof import('vue').onScopeDispose + const onServerPrefetch: typeof import('vue').onServerPrefetch + const onUnmounted: typeof import('vue').onUnmounted + const onUpdated: typeof import('vue').onUpdated + const onWatcherCleanup: typeof import('vue').onWatcherCleanup + const provide: typeof import('vue').provide + const reactive: typeof import('vue').reactive + const readonly: typeof import('vue').readonly + const ref: typeof import('vue').ref + const resolveComponent: typeof import('vue').resolveComponent + const shallowReactive: typeof import('vue').shallowReactive + const shallowReadonly: typeof import('vue').shallowReadonly + const shallowRef: typeof import('vue').shallowRef + const t: typeof import('@/locale/index').t + const toRaw: typeof import('vue').toRaw + const toRef: typeof import('vue').toRef + const toRefs: typeof import('vue').toRefs + const toValue: typeof import('vue').toValue + const triggerRef: typeof import('vue').triggerRef + const unref: typeof import('vue').unref + const useAttrs: typeof import('vue').useAttrs + const useCssModule: typeof import('vue').useCssModule + const useCssVars: typeof import('vue').useCssVars + const useId: typeof import('vue').useId + const useLink: typeof import('vue-router').useLink + const useModel: typeof import('vue').useModel + const useRoute: typeof import('vue-router').useRoute + const useRouter: typeof import('vue-router').useRouter + const useSlots: typeof import('vue').useSlots + const useTemplateRef: typeof import('vue').useTemplateRef + const watch: typeof import('vue').watch + const watchEffect: typeof import('vue').watchEffect + const watchPostEffect: typeof import('vue').watchPostEffect + const watchSyncEffect: typeof import('vue').watchSyncEffect +} +// for type re-export +declare global { + // @ts-ignore + export type { Component, Slot, Slots, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, ShallowRef, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue' + import('vue') +} diff --git a/web/build/constant.ts b/web/build/constant.ts new file mode 100644 index 0000000..cbcc5f3 --- /dev/null +++ b/web/build/constant.ts @@ -0,0 +1,6 @@ +/** + * The name of the configuration file entered in the production environment + */ +export const GLOB_CONFIG_FILE_NAME = 'app.config.js'; + +export const OUTPUT_DIR = 'dist'; diff --git a/web/build/getConfigFileName.ts b/web/build/getConfigFileName.ts new file mode 100644 index 0000000..d61cd41 --- /dev/null +++ b/web/build/getConfigFileName.ts @@ -0,0 +1,9 @@ +/** + * Get the configuration file variable name + * @param env + */ +export const getConfigFileName = (env: Record) => { + return `__PRODUCTION__${env.VITE_GLOB_APP_SHORT_NAME || '__APP'}__CONF__` + .toUpperCase() + .replace(/\s/g, ''); +}; diff --git a/web/build/script/buildConf.ts b/web/build/script/buildConf.ts new file mode 100644 index 0000000..c3071a8 --- /dev/null +++ b/web/build/script/buildConf.ts @@ -0,0 +1,44 @@ +/** + * Generate additional configuration files when used for packaging. The file can be configured with some global variables, so that it can be changed directly externally without repackaging + */ +import { GLOB_CONFIG_FILE_NAME, OUTPUT_DIR } from '../constant'; +import fs from 'fs-extra'; +import chalk from 'chalk'; + +import { getRootPath, getEnvConfig } from '../utils'; +import { getConfigFileName } from '../getConfigFileName'; + +import pkg from '../../package.json'; + +async function createConfig( + { + configName, + config, + configFileName = GLOB_CONFIG_FILE_NAME, + }: { configName: string; config: any; configFileName?: string } = { configName: '', config: {} } +) { + try { + const windowConf = `window.${configName}`; + // Ensure that the variable will not be modified + const configStr = `${windowConf}=${JSON.stringify(config)}; + Object.freeze(${windowConf}); + Object.defineProperty(window, "${configName}", { + configurable: false, + writable: false, + }); + `.replace(/\s/g, ''); + await fs.mkdirp(getRootPath(OUTPUT_DIR)); + fs.writeFileSync(getRootPath(`${OUTPUT_DIR}/${configFileName}`), configStr); + + console.log(chalk.cyan(`✨ [${pkg.name}]`) + ` - configuration file is build successfully:`); + console.log(chalk.gray(OUTPUT_DIR + '/' + chalk.green(configFileName)) + '\n'); + } catch (error) { + console.log(chalk.red('configuration file configuration file failed to package:\n' + error)); + } +} + +export async function runBuildConfig() { + const config = getEnvConfig(); + const configFileName = getConfigFileName(config); + await createConfig({ config, configName: configFileName }); +} diff --git a/web/build/script/postBuild.ts b/web/build/script/postBuild.ts new file mode 100644 index 0000000..441a09a --- /dev/null +++ b/web/build/script/postBuild.ts @@ -0,0 +1,23 @@ +// #!/usr/bin/env node + +import { runBuildConfig } from './buildConf'; +import chalk from 'chalk'; +import process from 'node:process' +import pkg from '../../package.json'; + +export const runBuild = async () => { + try { + const argvList = process.argv.splice(2); + + // Generate configuration file + if (!argvList.includes('disabled-config')) { + await runBuildConfig(); + } + + console.log(`✨ ${chalk.cyan(`[${pkg.name}]`)}` + ' - build successfully!'); + } catch (error) { + console.log(chalk.red('vite build error:\n' + error)); + process.exit(1); + } +}; +runBuild().then(); diff --git a/web/build/utils.ts b/web/build/utils.ts new file mode 100644 index 0000000..9653cea --- /dev/null +++ b/web/build/utils.ts @@ -0,0 +1,71 @@ +import fs from 'fs'; +import path from 'path'; +import dotenv from 'dotenv'; + +export function isDevFn(mode: string): boolean { + return mode === 'development'; +} + +export function isProdFn(mode: string): boolean { + return mode === 'production'; +} + +/** + * Whether to generate package preview + */ +export function isReportMode(): boolean { + return process.env.REPORT === 'true'; +} + +// Read all environment variable configuration files to process.env +export function wrapperEnv(envConf: Recordable): ViteEnv { + const ret: any = {}; + + for (const envName of Object.keys(envConf)) { + let realName = envConf[envName].replace(/\\n/g, '\n'); + realName = realName === 'true' ? true : realName === 'false' ? false : realName; + + if (envName === 'VITE_PORT') { + realName = Number(realName); + } + if (envName === 'VITE_PROXY') { + try { + realName = JSON.parse(realName); + } catch (error) {} + } + ret[envName] = realName; + // process.env[envName] = realName; + } + return ret; +} + +/** + * Get the environment variables starting with the specified prefix + * @param match prefix + * @param confFiles ext + */ +export function getEnvConfig(match = 'VITE_GLOB_', confFiles = ['.env', '.env.production']) { + let envConfig = {}; + confFiles.forEach((item) => { + try { + const env = dotenv.parse(fs.readFileSync(path.resolve(process.cwd(), item))); + envConfig = { ...envConfig, ...env }; + } catch (error) {} + }); + + Object.keys(envConfig).forEach((key) => { + const reg = new RegExp(`^(${match})`); + if (!reg.test(key)) { + Reflect.deleteProperty(envConfig, key); + } + }); + return envConfig; +} + +/** + * Get member root directory + * @param dir file path + */ +export function getRootPath(...dir: string[]) { + return path.resolve(process.cwd(), ...dir); +} diff --git a/web/build/vite/plugin/compress.ts b/web/build/vite/plugin/compress.ts new file mode 100644 index 0000000..9563679 --- /dev/null +++ b/web/build/vite/plugin/compress.ts @@ -0,0 +1,35 @@ +/** + * Used to package and output gzip. Note that this does not work properly in Vite, the specific reason is still being investigated + * https://github.com/anncwb/vite-plugin-compression + */ +import type { Plugin } from 'vite'; + +import compressPlugin from 'vite-plugin-compression'; + +export function configCompressPlugin( + compress: 'gzip' | 'brotli' | 'none', + deleteOriginFile = false +): Plugin | Plugin[] { + const compressList = compress.split(','); + + const plugins: Plugin[] = []; + + if (compressList.includes('gzip')) { + plugins.push( + compressPlugin({ + ext: '.gz', + deleteOriginFile, + }) + ); + } + if (compressList.includes('brotli')) { + plugins.push( + compressPlugin({ + ext: '.br', + algorithm: 'brotliCompress', + deleteOriginFile, + }) + ); + } + return plugins; +} diff --git a/web/build/vite/plugin/html.ts b/web/build/vite/plugin/html.ts new file mode 100644 index 0000000..ef744d8 --- /dev/null +++ b/web/build/vite/plugin/html.ts @@ -0,0 +1,38 @@ +/** + * Plugin to minimize and use ejs template syntax in index.html. + * https://github.com/anncwb/vite-plugin-html + */ +import { createHtmlPlugin } from 'vite-plugin-html'; +import pkg from '../../../package.json'; +import { GLOB_CONFIG_FILE_NAME } from '../../constant'; + +export function configHtmlPlugin(env: ViteEnv, isBuild: boolean) { + const { VITE_GLOB_APP_TITLE, VITE_PUBLIC_PATH } = env; + + const path = VITE_PUBLIC_PATH.endsWith('/') ? VITE_PUBLIC_PATH : `${VITE_PUBLIC_PATH}/`; + + const getAppConfigSrc = () => { + return `${path || '/'}${GLOB_CONFIG_FILE_NAME}?v=${pkg.version}-${new Date().getTime()}`; + }; + + return createHtmlPlugin({ + minify: isBuild, + inject: { + // Inject data into ejs template + data: { + title: VITE_GLOB_APP_TITLE, + }, + // Embed the generated app.config.js file + tags: isBuild + ? [ + { + tag: 'script', + attrs: { + src: getAppConfigSrc(), + }, + }, + ] + : [], + }, + }); +} diff --git a/web/build/vite/plugin/index.ts b/web/build/vite/plugin/index.ts new file mode 100644 index 0000000..a28d808 --- /dev/null +++ b/web/build/vite/plugin/index.ts @@ -0,0 +1,61 @@ +import type { Plugin } from 'vite'; +import Components from 'unplugin-vue-components/vite'; +import { NaiveUiResolver } from 'unplugin-vue-components/resolvers'; +import AutoImport from 'unplugin-auto-import/vite'; +import topLevelAwait from 'vite-plugin-top-level-await'; +import setupExtend from 'vite-plugin-vue-setup-extend'; +import vue from '@vitejs/plugin-vue'; +import vueJsx from '@vitejs/plugin-vue-jsx'; +import { configHtmlPlugin } from './html'; +import { configCompressPlugin } from './compress'; + +export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean) { + const { VITE_BUILD_COMPRESS, VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE } = viteEnv; + + const vitePlugins: (Plugin | Plugin[])[] = [ + // have to + vue(), + // have to + vueJsx(), + + // 按需引入NaiveUi且自动创建组件声明 + Components({ + dts: true, + resolvers: [NaiveUiResolver()], + }), + + // 自动引入API + AutoImport({ + imports: [ + 'vue', + 'vue-router', + { + '@/locale/index': ['t'], + }, + ], + dts: 'auto-imports.d.ts', + }), + + // 支持顶级wait + topLevelAwait({ + // The export name of top-level await promise for each chunk module + promiseExportName: '__tla', + // The function to generate import names of top-level await promise in each chunk module + promiseImportName: (i) => `__tla_${i}`, + }), + ]; + + // vite-plugin-html + vitePlugins.push(configHtmlPlugin(viteEnv, isBuild)); + + if (isBuild) { + // rollup-plugin-gzip + vitePlugins.push( + configCompressPlugin(VITE_BUILD_COMPRESS, VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE) + ); + } + + vitePlugins.push(setupExtend()); + + return vitePlugins; +} diff --git a/web/build/vite/plugin/styleImport.ts b/web/build/vite/plugin/styleImport.ts new file mode 100644 index 0000000..f09d35d --- /dev/null +++ b/web/build/vite/plugin/styleImport.ts @@ -0,0 +1,22 @@ +/** + * Introduces component library styles on demand. + * https://github.com/anncwb/vite-plugin-style-import + */ + +import styleImport from 'vite-plugin-style-import'; + +export function configStyleImportPlugin(isBuild: boolean) { + if (!isBuild) return []; + const styleImportPlugin = styleImport({ + libs: [ + { + libraryName: 'ant-design-vue', + esModule: true, + resolveStyle: (name) => { + return `ant-design-vue/es/${name}/style/index`; + }, + }, + ], + }); + return styleImportPlugin; +} diff --git a/web/build/vite/proxy.ts b/web/build/vite/proxy.ts new file mode 100644 index 0000000..dc23646 --- /dev/null +++ b/web/build/vite/proxy.ts @@ -0,0 +1,34 @@ +/** + * Used to parse the .env.development proxy configuration + */ +import type { ProxyOptions } from 'vite'; + +type ProxyItem = [string, string]; + +type ProxyList = ProxyItem[]; + +type ProxyTargetList = Record string }>; + +const httpsRE = /^https:\/\//; + +/** + * Generate proxy + * @param list + */ +export function createProxy(list: ProxyList = []) { + const ret: ProxyTargetList = {}; + for (const [prefix, target] of list) { + const isHttps = httpsRE.test(target); + + // https://github.com/http-party/node-http-proxy#options + ret[prefix] = { + target: target, + changeOrigin: true, + ws: true, + rewrite: (path) => path.replace(new RegExp(`^${prefix}`), ''), + // https is require secure=false + ...(isHttps ? { secure: false } : {}), + }; + } + return ret; +} diff --git a/web/commitlint.config.js b/web/commitlint.config.js new file mode 100644 index 0000000..7189e8f --- /dev/null +++ b/web/commitlint.config.js @@ -0,0 +1,57 @@ +module.exports = { + ignores: [(commit) => commit.includes('init')], + extends: ['@commitlint/config-conventional'], + parserPreset: { + parserOpts: { + headerPattern: /^(\w*|[\u4e00-\u9fa5]*)(?:[\(\(](.*)[\)\)])?[\:\:] (.*)/, + headerCorrespondence: ['type', 'scope', 'subject'], + referenceActions: [ + 'close', + 'closes', + 'closed', + 'fix', + 'fixes', + 'fixed', + 'resolve', + 'resolves', + 'resolved', + ], + issuePrefixes: ['#'], + noteKeywords: ['BREAKING CHANGE'], + fieldPattern: /^-(.*?)-$/, + revertPattern: /^Revert\s"([\s\S]*)"\s*This reverts commit (\w*)\./, + revertCorrespondence: ['header', 'hash'], + warn() {}, + mergePattern: null, + mergeCorrespondence: null, + }, + }, + rules: { + 'body-leading-blank': [2, 'always'], + 'footer-leading-blank': [1, 'always'], + 'header-max-length': [2, 'always', 108], + 'subject-empty': [2, 'never'], + 'type-empty': [2, 'never'], + 'type-enum': [ + 2, + 'always', + [ + 'feat', + 'fix', + 'perf', + 'style', + 'docs', + 'test', + 'refactor', + 'build', + 'ci', + 'chore', + 'revert', + 'wip', + 'workflow', + 'types', + 'release', + ], + ], + }, +}; diff --git a/web/eslint.config.js b/web/eslint.config.js new file mode 100644 index 0000000..a4eb964 --- /dev/null +++ b/web/eslint.config.js @@ -0,0 +1,104 @@ +import parser from 'vue-eslint-parser'; +import { FlatCompat } from '@eslint/eslintrc'; + +const compat = new FlatCompat(); + +export default [ + { + ignores: [ + '**/*.sh', + '**/node_modules', + '**/*.md', + '**/*.woff', + '**/*.ttf', + '**/.vscode', + '**/.idea', + '**/dist', + 'public', + 'docs', + '**/.husky', + '**/.local', + 'bin', + '**/Dockerfile', + '**/components.d.ts', + ], + }, + ...compat.extends( + 'plugin:vue/vue3-recommended', + 'plugin:@typescript-eslint/recommended', + 'prettier', + 'plugin:prettier/recommended' + ), + { + languageOptions: { + parser: parser, + ecmaVersion: 2020, + sourceType: 'module', + parserOptions: { + parser: '@typescript-eslint/parser', + jsxPragma: 'React', + ecmaFeatures: { + jsx: true, + }, + }, + }, + rules: { + 'vue/script-setup-uses-vars': 'error', + '@typescript-eslint/ban-ts-ignore': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/no-empty-function': 'off', + 'vue/custom-event-name-casing': 'off', + 'no-use-before-define': 'off', + '@typescript-eslint/no-use-before-define': 'off', + '@typescript-eslint/ban-ts-comment': 'off', + '@typescript-eslint/ban-types': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-unused-vars': [ + 'error', + { + varsIgnorePattern: '.*', + args: 'none', + }, + ], + 'no-unused-vars': [ + 'error', + { + varsIgnorePattern: '.*', + args: 'none', + }, + ], + 'space-before-function-paren': 'off', + 'vue/multi-word-component-names': 'off', + 'vue/attributes-order': 'off', + 'vue/one-component-per-file': 'off', + 'vue/html-closing-bracket-newline': 'off', + 'vue/max-attributes-per-line': 'off', + 'vue/multiline-html-element-content-newline': 'off', + 'vue/singleline-html-element-content-newline': 'off', + 'vue/attribute-hyphenation': 'off', + 'vue/require-default-prop': 'off', + 'vue/html-self-closing': [ + 'error', + { + html: { + void: 'always', + normal: 'never', + component: 'always', + }, + svg: 'always', + math: 'always', + }, + ], + '@typescript-eslint/no-this-alias': [ + 'error', + { + allowDestructuring: false, + allowedNames: ['that'], + }, + ], + }, + }, +]; diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..a838df0 --- /dev/null +++ b/web/index.html @@ -0,0 +1,123 @@ + + + + + + + + + <%= title %> + + + +
+ +
+
+ +
+
+
+ + + + + diff --git a/web/package.json b/web/package.json new file mode 100644 index 0000000..d583959 --- /dev/null +++ b/web/package.json @@ -0,0 +1,171 @@ +{ + "name": "hotgo", + "type": "module", + "version": "2.18.9", + "author": { + "name": "MengShuai", + "email": "133814250@qq.com", + "url": "https://github.com/bufanyun/hotgo" + }, + "private": true, + "scripts": { + "bootstrap": "pnpm install", + "serve": "pnpm run dev", + "dev": "vite", + "build": "vite build && esno ./build/script/postBuild.ts", + "build:no-cache": "pnpm clean:cache && pnpm run build", + "report": "cross-env REPORT=true pnpm run build", + "preview": "pnpm run build && vite preview", + "preview:dist": "vite preview", + "clean:cache": "rimraf node_modules/.cache/ && rimraf node_modules/.vite", + "clean:lib": "rimraf node_modules", + "deploy": "gh-pages -d dist", + "lint:eslint": "eslint \"{src,mock}/**/*.{vue,ts,tsx}\" --fix", + "lint:prettier": "prettier --write --loglevel warn \"src/**/*.{js,json,tsx,css,less,scss,vue,html,md}\"", + "lint:stylelint": "stylelint --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/", + "lint:lint-staged": "lint-staged -c ./.husky/lintstagedrc.js", + "lint:pretty": "pretty-quick --staged", + "build typecheck": "vuedx-typecheck . && vite build", + "test prod gzip": "http-server dist --cors --gzip -c-1" + }, + "dependencies": { + "@codemirror/basic-setup": "^0.20.0", + "@codemirror/lang-yaml": "^6.1.2", + "@codemirror/state": "^6.5.2", + "@codemirror/theme-one-dark": "^6.1.3", + "@codemirror/view": "^6.38.2", + "@vicons/antd": "^0.12.0", + "@vicons/ionicons5": "^0.12.0", + "@vue/runtime-core": "^3.4.38", + "@vueup/vue-quill": "^1.2.0", + "@vueuse/core": "^11.0.3", + "axios": "^1.7.7", + "blueimp-md5": "^2.19.0", + "codemirror": "^6.0.2", + "date-fns": "^3.6.0", + "echarts": "^5.5.1", + "element-resize-detector": "^1.2.4", + "fingerprintjs2": "^2.1.4", + "highlight.js": "^11.10.0", + "js-yaml": "^4.1.0", + "lodash-es": "^4.17.21", + "mint-filter": "^4.0.3", + "mitt": "^3.0.1", + "naive-ui": "^2.44.1", + "pinia": "^2.2.2", + "pinyin-pro": "^3.24.2", + "print-js": "^1.6.0", + "qrcode.vue": "3.4.1", + "qs": "^6.13.0", + "quill-image-uploader": "^1.3.0", + "quill-magic-url": "^4.2.0", + "spark-md5": "^3.0.2", + "throttle-debounce": "^5.0.2", + "vfonts": "^0.0.3", + "vue": "^3.4.38", + "vue-i18n": "^11.1.11", + "vue-router": "^4.4.3", + "vue-types": "^5.1.3", + "vue-waterfall-plugin-next": "^2.6.0", + "vue3-json-viewer": "^2.4.1", + "vuedraggable": "^4.1.0", + "weixin-js-sdk": "^1.6.5" + }, + "devDependencies": { + "@commitlint/cli": "^19.4.1", + "@commitlint/config-conventional": "^19.4.1", + "@eslint/eslintrc": "^3.1.0", + "@types/fs-extra": "^11.0.4", + "@types/js-yaml": "^4.0.9", + "@types/lodash-es": "^4.17.12", + "@types/node": "^22.5.2", + "@typescript-eslint/eslint-plugin": "^8.4.0", + "@typescript-eslint/parser": "^8.4.0", + "@vitejs/plugin-vue": "^5.1.3", + "@vitejs/plugin-vue-jsx": "^4.0.1", + "@vue/compiler-sfc": "^3.4.38", + "@vue/eslint-config-typescript": "^13.0.0", + "autoprefixer": "^10.4.20", + "chalk": "^5.3.0", + "commitizen": "^4.3.0", + "core-js": "^3.38.1", + "cross-env": "^7.0.3", + "crypto-js": "^4.2.0", + "dotenv": "^16.4.5", + "eslint": "^9.9.1", + "eslint-config-prettier": "^9.1.0", + "eslint-define-config": "2.1.0", + "eslint-plugin-jest": "^28.8.2", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-vue": "^9.28.0", + "esno": "^4.7.0", + "fs-extra": "^11.2.0", + "gh-pages": "^6.1.1", + "husky": "^9.1.5", + "jest": "^29.7.0", + "less": "^4.2.0", + "less-loader": "^12.2.0", + "lint-staged": "^15.2.10", + "mockjs": "^1.1.0", + "npm-check-updates": "^17.1.1", + "postcss": "^8.4.44", + "prettier": "^3.3.3", + "pretty-quick": "^4.0.0", + "rimraf": "^6.0.1", + "stylelint": "^16.9.0", + "stylelint-config-prettier": "^9.0.5", + "stylelint-config-standard": "^36.0.1", + "stylelint-order": "^6.0.4", + "stylelint-scss": "^6.5.1", + "tailwindcss": "^3.4.10", + "typescript": "^5.5.4", + "unplugin-auto-import": "^20.2.0", + "unplugin-vue-components": "^0.27.4", + "vite": "^5.4.2", + "vite-plugin-compression": "^0.5.1", + "vite-plugin-html": "^3.2.2", + "vite-plugin-mock": "^3.0.2", + "vite-plugin-require-transform": "^1.0.21", + "vite-plugin-style-import": "^2.0.0", + "vite-plugin-top-level-await": "^1.4.4", + "vite-plugin-vue-setup-extend": "^0.4.0", + "vue-demi": "^0.14.10", + "vue-draggable-next": "^2.2.1", + "vue-eslint-parser": "^9.4.3", + "vuedraggable": "^4.1.0" + }, + "lint-staged": { + "*.{vue,js,ts,tsx}": "eslint --fix" + }, + "config": { + "commitizen": { + "path": "./node_modules/cz-customizable" + } + }, + "keywords": [ + "hotgo", + "hg", + "gf", + "goframe", + "vue", + "naive-ui", + "naive-ui-admin", + "vue3", + "ts", + "tsx", + "admin", + "typescript" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/bufanyun/hotgo.git" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/bufanyun/hotgo/issues" + }, + "homepage": "https://github.com/bufanyun/hotgo", + "engines": { + "node": ">=16" + } +} diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml new file mode 100644 index 0000000..d280104 --- /dev/null +++ b/web/pnpm-lock.yaml @@ -0,0 +1,10111 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@codemirror/basic-setup': + specifier: ^0.20.0 + version: 0.20.0 + '@codemirror/lang-yaml': + specifier: ^6.1.2 + version: 6.1.2 + '@codemirror/state': + specifier: ^6.5.2 + version: 6.5.2 + '@codemirror/theme-one-dark': + specifier: ^6.1.3 + version: 6.1.3 + '@codemirror/view': + specifier: ^6.38.2 + version: 6.38.2 + '@vicons/antd': + specifier: ^0.12.0 + version: 0.12.0 + '@vicons/ionicons5': + specifier: ^0.12.0 + version: 0.12.0 + '@vue/runtime-core': + specifier: ^3.4.38 + version: 3.4.38 + '@vueup/vue-quill': + specifier: ^1.2.0 + version: 1.2.0(vue@3.4.38(typescript@5.5.4)) + '@vueuse/core': + specifier: ^11.0.3 + version: 11.0.3(vue@3.4.38(typescript@5.5.4)) + axios: + specifier: ^1.7.7 + version: 1.7.7(debug@4.3.6(supports-color@8.1.1)) + blueimp-md5: + specifier: ^2.19.0 + version: 2.19.0 + codemirror: + specifier: ^6.0.2 + version: 6.0.2 + date-fns: + specifier: ^3.6.0 + version: 3.6.0 + echarts: + specifier: ^5.5.1 + version: 5.5.1 + element-resize-detector: + specifier: ^1.2.4 + version: 1.2.4 + fingerprintjs2: + specifier: ^2.1.4 + version: 2.1.4 + highlight.js: + specifier: ^11.10.0 + version: 11.10.0 + js-yaml: + specifier: ^4.1.0 + version: 4.1.0 + lodash-es: + specifier: ^4.17.21 + version: 4.17.21 + mint-filter: + specifier: ^4.0.3 + version: 4.0.3 + mitt: + specifier: ^3.0.1 + version: 3.0.1 + naive-ui: + specifier: ^2.44.1 + version: 2.45.3(vue@3.4.38(typescript@5.5.4)) + pinia: + specifier: ^2.2.2 + version: 2.2.2(typescript@5.5.4)(vue@3.4.38(typescript@5.5.4)) + pinyin-pro: + specifier: ^3.24.2 + version: 3.24.2 + print-js: + specifier: ^1.6.0 + version: 1.6.0 + qrcode.vue: + specifier: 3.4.1 + version: 3.4.1(vue@3.4.38(typescript@5.5.4)) + qs: + specifier: ^6.13.0 + version: 6.13.0 + quill-image-uploader: + specifier: ^1.3.0 + version: 1.3.0(quill@1.3.7) + quill-magic-url: + specifier: ^4.2.0 + version: 4.2.0 + spark-md5: + specifier: ^3.0.2 + version: 3.0.2 + throttle-debounce: + specifier: ^5.0.2 + version: 5.0.2 + vfonts: + specifier: ^0.0.3 + version: 0.0.3 + vue: + specifier: ^3.4.38 + version: 3.4.38(typescript@5.5.4) + vue-i18n: + specifier: ^11.1.11 + version: 11.4.13(vue@3.4.38(typescript@5.5.4)) + vue-router: + specifier: ^4.4.3 + version: 4.4.3(vue@3.4.38(typescript@5.5.4)) + vue-types: + specifier: ^5.1.3 + version: 5.1.3(vue@3.4.38(typescript@5.5.4)) + vue-waterfall-plugin-next: + specifier: ^2.6.0 + version: 2.6.0 + vue3-json-viewer: + specifier: ^2.4.1 + version: 2.4.1(vue@3.4.38(typescript@5.5.4)) + vuedraggable: + specifier: ^4.1.0 + version: 4.1.0(vue@3.4.38(typescript@5.5.4)) + weixin-js-sdk: + specifier: ^1.6.5 + version: 1.6.5 + devDependencies: + '@commitlint/cli': + specifier: ^19.4.1 + version: 19.4.1(@types/node@22.5.2)(typescript@5.5.4) + '@commitlint/config-conventional': + specifier: ^19.4.1 + version: 19.4.1 + '@eslint/eslintrc': + specifier: ^3.1.0 + version: 3.1.0(supports-color@8.1.1) + '@types/fs-extra': + specifier: ^11.0.4 + version: 11.0.4 + '@types/js-yaml': + specifier: ^4.0.9 + version: 4.0.9 + '@types/lodash-es': + specifier: ^4.17.12 + version: 4.17.12 + '@types/node': + specifier: ^22.5.2 + version: 22.5.2 + '@typescript-eslint/eslint-plugin': + specifier: ^8.4.0 + version: 8.4.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4) + '@typescript-eslint/parser': + specifier: ^8.4.0 + version: 8.4.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4) + '@vitejs/plugin-vue': + specifier: ^5.1.3 + version: 5.1.3(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(terser@5.31.6))(vue@3.4.38(typescript@5.5.4)) + '@vitejs/plugin-vue-jsx': + specifier: ^4.0.1 + version: 4.0.1(supports-color@8.1.1)(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(terser@5.31.6))(vue@3.4.38(typescript@5.5.4)) + '@vue/compiler-sfc': + specifier: ^3.4.38 + version: 3.4.38 + '@vue/eslint-config-typescript': + specifier: ^13.0.0 + version: 13.0.0(eslint-plugin-vue@9.28.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1))(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4) + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.44) + chalk: + specifier: ^5.3.0 + version: 5.3.0 + commitizen: + specifier: ^4.3.0 + version: 4.3.0(@types/node@22.5.2)(typescript@5.5.4) + core-js: + specifier: ^3.38.1 + version: 3.38.1 + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + crypto-js: + specifier: ^4.2.0 + version: 4.2.0 + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + eslint: + specifier: ^9.9.1 + version: 9.9.1(jiti@1.21.6)(supports-color@8.1.1) + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1)) + eslint-define-config: + specifier: 2.1.0 + version: 2.1.0 + eslint-plugin-jest: + specifier: ^28.8.2 + version: 28.8.2(@typescript-eslint/eslint-plugin@8.4.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(jest@29.7.0(@types/node@22.5.2)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4)))(supports-color@8.1.1)(typescript@5.5.4) + eslint-plugin-prettier: + specifier: ^5.2.1 + version: 5.2.1(eslint-config-prettier@9.1.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1)))(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(prettier@3.3.3) + eslint-plugin-vue: + specifier: ^9.28.0 + version: 9.28.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1) + esno: + specifier: ^4.7.0 + version: 4.7.0 + fs-extra: + specifier: ^11.2.0 + version: 11.2.0 + gh-pages: + specifier: ^6.1.1 + version: 6.1.1 + husky: + specifier: ^9.1.5 + version: 9.1.5 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.5.2)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4)) + less: + specifier: ^4.2.0 + version: 4.2.0 + less-loader: + specifier: ^12.2.0 + version: 12.2.0(less@4.2.0)(webpack@5.94.0(@swc/core@1.7.23)(esbuild@0.23.1)) + lint-staged: + specifier: ^15.2.10 + version: 15.2.10(supports-color@8.1.1) + mockjs: + specifier: ^1.1.0 + version: 1.1.0 + npm-check-updates: + specifier: ^17.1.1 + version: 17.1.1 + postcss: + specifier: ^8.4.44 + version: 8.4.44 + prettier: + specifier: ^3.3.3 + version: 3.3.3 + pretty-quick: + specifier: ^4.0.0 + version: 4.0.0(prettier@3.3.3) + rimraf: + specifier: ^6.0.1 + version: 6.0.1 + stylelint: + specifier: ^16.9.0 + version: 16.9.0(supports-color@8.1.1)(typescript@5.5.4) + stylelint-config-prettier: + specifier: ^9.0.5 + version: 9.0.5(stylelint@16.9.0(supports-color@8.1.1)(typescript@5.5.4)) + stylelint-config-standard: + specifier: ^36.0.1 + version: 36.0.1(stylelint@16.9.0(supports-color@8.1.1)(typescript@5.5.4)) + stylelint-order: + specifier: ^6.0.4 + version: 6.0.4(stylelint@16.9.0(supports-color@8.1.1)(typescript@5.5.4)) + stylelint-scss: + specifier: ^6.5.1 + version: 6.5.1(stylelint@16.9.0(supports-color@8.1.1)(typescript@5.5.4)) + tailwindcss: + specifier: ^3.4.10 + version: 3.4.10(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4)) + typescript: + specifier: ^5.5.4 + version: 5.5.4 + unplugin-auto-import: + specifier: ^20.2.0 + version: 20.3.0(@vueuse/core@11.0.3(vue@3.4.38(typescript@5.5.4))) + unplugin-vue-components: + specifier: ^0.27.4 + version: 0.27.4(@babel/parser@7.25.6)(rollup@4.21.2)(supports-color@8.1.1)(vue@3.4.38(typescript@5.5.4)) + vite: + specifier: ^5.4.2 + version: 5.4.2(@types/node@22.5.2)(less@4.2.0)(terser@5.31.6) + vite-plugin-compression: + specifier: ^0.5.1 + version: 0.5.1(supports-color@8.1.1)(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(terser@5.31.6)) + vite-plugin-html: + specifier: ^3.2.2 + version: 3.2.2(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(terser@5.31.6)) + vite-plugin-mock: + specifier: ^3.0.2 + version: 3.0.2(esbuild@0.23.1)(mockjs@1.1.0)(supports-color@8.1.1)(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(terser@5.31.6)) + vite-plugin-require-transform: + specifier: ^1.0.21 + version: 1.0.21(supports-color@8.1.1) + vite-plugin-style-import: + specifier: ^2.0.0 + version: 2.0.0(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(terser@5.31.6)) + vite-plugin-top-level-await: + specifier: ^1.4.4 + version: 1.4.4(rollup@4.21.2)(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(terser@5.31.6)) + vite-plugin-vue-setup-extend: + specifier: ^0.4.0 + version: 0.4.0(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(terser@5.31.6)) + vue-demi: + specifier: ^0.14.10 + version: 0.14.10(vue@3.4.38(typescript@5.5.4)) + vue-draggable-next: + specifier: ^2.2.1 + version: 2.2.1(sortablejs@1.14.0)(vue@3.4.38(typescript@5.5.4)) + vue-eslint-parser: + specifier: ^9.4.3 + version: 9.4.3(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1) + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@antfu/utils@0.7.10': + resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.25.4': + resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.25.2': + resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.25.6': + resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.24.7': + resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.25.2': + resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.25.4': + resolution: {integrity: sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-member-expression-to-functions@7.24.8': + resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.22.15': + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.7': + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.25.2': + resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.24.7': + resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.24.8': + resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-replace-supers@7.25.0': + resolution: {integrity: sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-simple-access@7.24.7': + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-skip-transparent-expression-wrappers@7.24.7': + resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.24.8': + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.25.6': + resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.25.6': + resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.25.6': + resolution: {integrity: sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.24.7': + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.25.4': + resolution: {integrity: sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.25.2': + resolution: {integrity: sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.25.0': + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.25.6': + resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.25.6': + resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@codemirror/autocomplete@0.20.3': + resolution: {integrity: sha512-lYB+NPGP+LEzAudkWhLfMxhTrxtLILGl938w+RcFrGdrIc54A+UgmCoz+McE3IYRFp4xyQcL4uFJwo+93YdgHw==} + + '@codemirror/autocomplete@6.18.7': + resolution: {integrity: sha512-8EzdeIoWPJDsMBwz3zdzwXnUpCzMiCyz5/A3FIPpriaclFCGDkAzK13sMcnsu5rowqiyeQN2Vs2TsOcoDPZirQ==} + + '@codemirror/basic-setup@0.20.0': + resolution: {integrity: sha512-W/ERKMLErWkrVLyP5I8Yh8PXl4r+WFNkdYVSzkXYPQv2RMPSkWpr2BgggiSJ8AHF/q3GuApncDD8I4BZz65fyg==} + deprecated: In version 6.0, this package has been renamed to just 'codemirror' + + '@codemirror/commands@0.20.0': + resolution: {integrity: sha512-v9L5NNVA+A9R6zaFvaTbxs30kc69F6BkOoiEbeFw4m4I0exmDEKBILN6mK+GksJtvTzGBxvhAPlVFTdQW8GB7Q==} + + '@codemirror/commands@6.8.1': + resolution: {integrity: sha512-KlGVYufHMQzxbdQONiLyGQDUW0itrLZwq3CcY7xpv9ZLRHqzkBSoteocBHtMCoY7/Ci4xhzSrToIeLg7FxHuaw==} + + '@codemirror/lang-yaml@6.1.2': + resolution: {integrity: sha512-dxrfG8w5Ce/QbT7YID7mWZFKhdhsaTNOYjOkSIMt1qmC4VQnXSDSYVHHHn8k6kJUfIhtLo8t1JJgltlxWdsITw==} + + '@codemirror/language@0.20.2': + resolution: {integrity: sha512-WB3Bnuusw0xhVvhBocieYKwJm04SOk5bPoOEYksVHKHcGHFOaYaw+eZVxR4gIqMMcGzOIUil0FsCmFk8yrhHpw==} + + '@codemirror/language@6.11.3': + resolution: {integrity: sha512-9HBM2XnwDj7fnu0551HkGdrUrrqmYq/WC5iv6nbY2WdicXdGbhR/gfbZOH73Aqj4351alY1+aoG9rCNfiwS1RA==} + + '@codemirror/lint@0.20.3': + resolution: {integrity: sha512-06xUScbbspZ8mKoODQCEx6hz1bjaq9m8W8DxdycWARMiiX1wMtfCh/MoHpaL7ws/KUMwlsFFfp2qhm32oaCvVA==} + + '@codemirror/lint@6.8.5': + resolution: {integrity: sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA==} + + '@codemirror/search@0.20.1': + resolution: {integrity: sha512-ROe6gRboQU5E4z6GAkNa2kxhXqsGNbeLEisbvzbOeB7nuDYXUZ70vGIgmqPu0tB+1M3F9yWk6W8k2vrFpJaD4Q==} + + '@codemirror/search@6.5.11': + resolution: {integrity: sha512-KmWepDE6jUdL6n8cAAqIpRmLPBZ5ZKnicE8oGU/s3QrAVID+0VhLFrzUucVKHG5035/BSykhExDL/Xm7dHthiA==} + + '@codemirror/state@0.20.1': + resolution: {integrity: sha512-ms0tlV5A02OK0pFvTtSUGMLkoarzh1F8mr6jy1cD7ucSC2X/VLHtQCxfhdSEGqTYlQF2hoZtmLv+amqhdgbwjQ==} + + '@codemirror/state@6.5.2': + resolution: {integrity: sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==} + + '@codemirror/theme-one-dark@6.1.3': + resolution: {integrity: sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==} + + '@codemirror/view@0.20.7': + resolution: {integrity: sha512-pqEPCb9QFTOtHgAH5XU/oVy9UR/Anj6r+tG5CRmkNVcqSKEPmBU05WtN/jxJCFZBXf6HumzWC9ydE4qstO3TxQ==} + + '@codemirror/view@6.38.2': + resolution: {integrity: sha512-bTWAJxL6EOFLPzTx+O5P5xAO3gTqpatQ2b/ARQ8itfU/v2LlpS3pH2fkL0A3E/Fx8Y2St2KES7ZEV0sHTsSW/A==} + + '@commitlint/cli@19.4.1': + resolution: {integrity: sha512-EerFVII3ZcnhXsDT9VePyIdCJoh3jEzygN1L37MjQXgPfGS6fJTWL/KHClVMod1d8w94lFC3l4Vh/y5ysVAz2A==} + engines: {node: '>=v18'} + hasBin: true + + '@commitlint/config-conventional@19.4.1': + resolution: {integrity: sha512-D5S5T7ilI5roybWGc8X35OBlRXLAwuTseH1ro0XgqkOWrhZU8yOwBOslrNmSDlTXhXLq8cnfhQyC42qaUCzlXA==} + engines: {node: '>=v18'} + + '@commitlint/config-validator@19.0.3': + resolution: {integrity: sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==} + engines: {node: '>=v18'} + + '@commitlint/ensure@19.0.3': + resolution: {integrity: sha512-SZEpa/VvBLoT+EFZVb91YWbmaZ/9rPH3ESrINOl0HD2kMYsjvl0tF7nMHh0EpTcv4+gTtZBAe1y/SS6/OhfZzQ==} + engines: {node: '>=v18'} + + '@commitlint/execute-rule@19.0.0': + resolution: {integrity: sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==} + engines: {node: '>=v18'} + + '@commitlint/format@19.3.0': + resolution: {integrity: sha512-luguk5/aF68HiF4H23ACAfk8qS8AHxl4LLN5oxPc24H+2+JRPsNr1OS3Gaea0CrH7PKhArBMKBz5RX9sA5NtTg==} + engines: {node: '>=v18'} + + '@commitlint/is-ignored@19.2.2': + resolution: {integrity: sha512-eNX54oXMVxncORywF4ZPFtJoBm3Tvp111tg1xf4zWXGfhBPKpfKG6R+G3G4v5CPlRROXpAOpQ3HMhA9n1Tck1g==} + engines: {node: '>=v18'} + + '@commitlint/lint@19.4.1': + resolution: {integrity: sha512-Ws4YVAZ0jACTv6VThumITC1I5AG0UyXMGua3qcf55JmXIXm/ejfaVKykrqx7RyZOACKVAs8uDRIsEsi87JZ3+Q==} + engines: {node: '>=v18'} + + '@commitlint/load@19.4.0': + resolution: {integrity: sha512-I4lCWaEZYQJ1y+Y+gdvbGAx9pYPavqZAZ3/7/8BpWh+QjscAn8AjsUpLV2PycBsEx7gupq5gM4BViV9xwTIJuw==} + engines: {node: '>=v18'} + + '@commitlint/message@19.0.0': + resolution: {integrity: sha512-c9czf6lU+9oF9gVVa2lmKaOARJvt4soRsVmbR7Njwp9FpbBgste5i7l/2l5o8MmbwGh4yE1snfnsy2qyA2r/Fw==} + engines: {node: '>=v18'} + + '@commitlint/parse@19.0.3': + resolution: {integrity: sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==} + engines: {node: '>=v18'} + + '@commitlint/read@19.4.0': + resolution: {integrity: sha512-r95jLOEZzKDakXtnQub+zR3xjdnrl2XzerPwm7ch1/cc5JGq04tyaNpa6ty0CRCWdVrk4CZHhqHozb8yZwy2+g==} + engines: {node: '>=v18'} + + '@commitlint/resolve-extends@19.1.0': + resolution: {integrity: sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg==} + engines: {node: '>=v18'} + + '@commitlint/rules@19.4.1': + resolution: {integrity: sha512-AgctfzAONoVxmxOXRyxXIq7xEPrd7lK/60h2egp9bgGUMZK9v0+YqLOA+TH+KqCa63ZoCr8owP2YxoSSu7IgnQ==} + engines: {node: '>=v18'} + + '@commitlint/to-lines@19.0.0': + resolution: {integrity: sha512-vkxWo+VQU5wFhiP9Ub9Sre0FYe019JxFikrALVoD5UGa8/t3yOJEpEhxC5xKiENKKhUkTpEItMTRAjHw2SCpZw==} + engines: {node: '>=v18'} + + '@commitlint/top-level@19.0.0': + resolution: {integrity: sha512-KKjShd6u1aMGNkCkaX4aG1jOGdn7f8ZI8TR1VEuNqUOjWTOdcDSsmglinglJ18JTjuBX5I1PtjrhQCRcixRVFQ==} + engines: {node: '>=v18'} + + '@commitlint/types@19.0.3': + resolution: {integrity: sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==} + engines: {node: '>=v18'} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@css-render/plugin-bem@0.15.14': + resolution: {integrity: sha512-QK513CJ7yEQxm/P3EwsI+d+ha8kSOcjGvD6SevM41neEMxdULE+18iuQK6tEChAWMOQNQPLG/Rw3Khb69r5neg==} + peerDependencies: + css-render: ~0.15.14 + + '@css-render/vue3-ssr@0.15.14': + resolution: {integrity: sha512-//8027GSbxE9n3QlD73xFY6z4ZbHbvrOVB7AO6hsmrEzGbg+h2A09HboUyDgu+xsmj7JnvJD39Irt+2D0+iV8g==} + peerDependencies: + vue: ^3.0.11 + + '@csstools/css-parser-algorithms@3.0.1': + resolution: {integrity: sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.1 + + '@csstools/css-tokenizer@3.0.1': + resolution: {integrity: sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==} + engines: {node: '>=18'} + + '@csstools/media-query-list-parser@3.0.1': + resolution: {integrity: sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.1 + '@csstools/css-tokenizer': ^3.0.1 + + '@csstools/selector-specificity@4.0.0': + resolution: {integrity: sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==} + engines: {node: '>=18'} + peerDependencies: + postcss-selector-parser: ^6.1.0 + + '@dual-bundle/import-meta-resolve@4.1.0': + resolution: {integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==} + + '@emotion/hash@0.8.0': + resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.18.0': + resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.1.0': + resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.9.1': + resolution: {integrity: sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.4': + resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.0': + resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} + engines: {node: '>=18.18'} + + '@intlify/core-base@11.4.13': + resolution: {integrity: sha512-3qGv1/j0fl6ZSeehGaznE78A4i3hCaOeOyDh7jq7SV6ch/XGoy96xIrYuALTV3xhIqj2rktsIKcwlLZ3CbOhkA==} + engines: {node: '>= 22'} + + '@intlify/devtools-types@11.4.13': + resolution: {integrity: sha512-f38d2yvjNc1/c+BnTLsxTB0729clTtyy7kTxHu4FFlvI6FpmBOp7b9sLYtsKJpXSZ70kIEexvNwDSzLkIlYnlQ==} + engines: {node: '>= 22'} + + '@intlify/message-compiler@11.4.13': + resolution: {integrity: sha512-cjKsDeWUD/i3mj0QtC8hydLCFP5mgZtTU1xZZaN9/O3FG94EXc0rTbecYpifglp26rpoJoIjSlW137VejLKsZw==} + engines: {node: '>= 22'} + + '@intlify/shared@11.4.13': + resolution: {integrity: sha512-ZjcNgEED1FtTCFb+ohWBdR21k5kvleKtM9peobQtLB83mNIfEhJK86dEbhfk+OcUrybrEbc4eDeE9UbFUVHsjQ==} + engines: {node: '>= 22'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@29.7.0': + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/core@29.7.0': + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect@29.7.0': + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/globals@29.7.0': + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/reporters@29.7.0': + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/source-map@29.6.3': + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-result@29.7.0': + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-sequencer@29.7.0': + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/transform@29.7.0': + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@juggle/resize-observer@3.4.0': + resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} + + '@lezer/common@0.16.1': + resolution: {integrity: sha512-qPmG7YTZ6lATyTOAWf8vXE+iRrt1NJd4cm2nJHK+v7X9TsOF6+HtuU/ctaZy2RCrluxDb89hI6KWQ5LfQGQWuA==} + + '@lezer/common@1.2.3': + resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==} + + '@lezer/highlight@0.16.0': + resolution: {integrity: sha512-iE5f4flHlJ1g1clOStvXNLbORJoiW4Kytso6ubfYzHnaNo/eo5SKhxs4wv/rtvwZQeZrK3we8S9SyA7OGOoRKQ==} + + '@lezer/highlight@1.2.1': + resolution: {integrity: sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==} + + '@lezer/lr@0.16.3': + resolution: {integrity: sha512-pau7um4eAw94BEuuShUIeQDTf3k4Wt6oIUOYxMmkZgDHdqtIcxWND4LRxi8nI9KuT4I1bXQv67BCapkxt7Ywqw==} + + '@lezer/lr@1.4.2': + resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==} + + '@lezer/yaml@1.0.3': + resolution: {integrity: sha512-GuBLekbw9jDBDhGur82nuwkxKQ+a3W5H0GfaAthDXcAu+XdpS43VlnxA9E9hllkpSP5ellRDKjLLj7Lu9Wr6xA==} + + '@marijn/find-cluster-break@1.0.2': + resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@rollup/plugin-virtual@3.0.2': + resolution: {integrity: sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@4.2.1': + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + + '@rollup/pluginutils@5.1.0': + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.21.2': + resolution: {integrity: sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.21.2': + resolution: {integrity: sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.21.2': + resolution: {integrity: sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.21.2': + resolution: {integrity: sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.21.2': + resolution: {integrity: sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.21.2': + resolution: {integrity: sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.21.2': + resolution: {integrity: sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.21.2': + resolution: {integrity: sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': + resolution: {integrity: sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-gnu@4.21.2': + resolution: {integrity: sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-s390x-gnu@4.21.2': + resolution: {integrity: sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.21.2': + resolution: {integrity: sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.21.2': + resolution: {integrity: sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-win32-arm64-msvc@4.21.2': + resolution: {integrity: sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.21.2': + resolution: {integrity: sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.21.2': + resolution: {integrity: sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==} + cpu: [x64] + os: [win32] + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + + '@swc/core-darwin-arm64@1.7.23': + resolution: {integrity: sha512-yyOHPfti6yKlQulfVWMt7BVKst+SyEZYCWuQSGMn1KgmNCH/bYufRWfQXIhkGSj44ZkEepJmsJ8tDyIb4k5WyA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.7.23': + resolution: {integrity: sha512-GzqHwQ0Y1VyjdI/bBKFX2GKm5HD3PIB6OhuAQtWZMTtEr2yIrlT0YK2T+XKh7oIg31JwxGBeQdBk3KTI7DARmQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.7.23': + resolution: {integrity: sha512-qwX4gB41OS6/OZkHcpTqLFGsdmvoZyffnJIlgB/kZKwH3lfeJWzv6vx57zXtNpM/t7GoQEe0VZUVdmNjxSxBZw==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.7.23': + resolution: {integrity: sha512-TsrbUZdMaUwzI7+g/8rHPLWbntMKYSu5Bn5IBSqVKPeyqaXxNnlIUnWXgXcUcRAc+T+Y8ADfr7EiFz9iz5DuSA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@swc/core-linux-arm64-musl@1.7.23': + resolution: {integrity: sha512-JEdtwdthazKq4PBz53KSubwwK8MvqODAihGSAzc8u3Unq4ojcvaS8b0CwLBeD+kTQ78HpxOXTt3DsFIxpgaCAA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@swc/core-linux-x64-gnu@1.7.23': + resolution: {integrity: sha512-V51gFPWaVAHbI1yg9ahsoya3aB4uawye3SZ5uQWgcP7wdCdiv60dw4F5nuPJf5Z1oXD3U/BslXuamv8Oh9vXqQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@swc/core-linux-x64-musl@1.7.23': + resolution: {integrity: sha512-BBqQi4+UdeRqag3yM4IJjaHG4yc1o3l9ksENHToE0o/u2DT0FY5+K/DiYGZLC1JHbSFzNqRCYsa7DIzRtZ0A1A==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@swc/core-win32-arm64-msvc@1.7.23': + resolution: {integrity: sha512-JPk6pvCKncL6bXG7p+NLZf8PWx4FakVvKNdwGeMrYunb+yk1IZf7qf9LJk8+GDGF5QviDXPs8opZrTrfsW80fA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.7.23': + resolution: {integrity: sha512-2Whxi8d+bLQBzJcQ5qYPHlk02YYVGsMVav0fWk+FnX2z1QRREIu1L1xvrpi7gBpjXp6BIU40ya8GiKeekNT2bg==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.7.23': + resolution: {integrity: sha512-82fARk4/yJ40kwWKY/gdKDisPdtgJE9jgpl/vkNG3alyJxrCzuNM7+CtiKoYbXLeqM8GQTS3wlvCaJu9oQ8dag==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.7.23': + resolution: {integrity: sha512-VDNkpDvDlreGh2E3tlDj8B3piiuLhhQA/7rIVZpiLUvG1YpucAa6N7iDXA7Gc/+Hah8spaCg/qvEaBkCmcIYCQ==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '*' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/types@0.1.12': + resolution: {integrity: sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==} + + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + + '@types/conventional-commits-parser@5.0.0': + resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/fs-extra@11.0.4': + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/js-yaml@4.0.9': + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/jsonfile@6.1.4': + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.17.25': + resolution: {integrity: sha512-+K1NIO8I+F9/wNulfVvu23QYd0Pe9/OCqRrim4NoYIf1VoEDL90Ve4ClzpyqBLc7NpGGWRvYNCKZ1BE/Jpf8dQ==} + + '@types/lodash@4.17.7': + resolution: {integrity: sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==} + + '@types/node@22.5.2': + resolution: {integrity: sha512-acJsPTEqYqulZS/Yp/S3GgeE6GZ0qYODUR8aVr/DkhHQ8l9nd4j5x1/ZJy9/gHrRlFMqkO6i0I3E27Alu4jjPg==} + + '@types/quill@2.0.14': + resolution: {integrity: sha512-zvoXCRnc2Dl8g+7/9VSAmRWPN6oH+MVhTPizmCR+GJCITplZ5VRVzMs4+a/nOE3yzNwEZqylJJrMB07bwbM1/g==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/web-bluetooth@0.0.20': + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + + '@typescript-eslint/eslint-plugin@7.18.0': + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/eslint-plugin@8.4.0': + resolution: {integrity: sha512-rg8LGdv7ri3oAlenMACk9e+AR4wUV0yrrG+XKsGKOK0EVgeEDqurkXMPILG2836fW4ibokTB5v4b6Z9+GYQDEw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.18.0': + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@8.4.0': + resolution: {integrity: sha512-NHgWmKSgJk5K9N16GIhQ4jSobBoJwrmURaLErad0qlLjrpP5bECYg+wxVTGlGZmJbU03jj/dfnb6V9bw+5icsA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@7.18.0': + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/scope-manager@8.4.0': + resolution: {integrity: sha512-n2jFxLeY0JmKfUqy3P70rs6vdoPjHK8P/w+zJcV3fk0b0BwRXC/zxRTEnAsgYT7MwdQDt/ZEbtdzdVC+hcpF0A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@7.18.0': + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/type-utils@8.4.0': + resolution: {integrity: sha512-pu2PAmNrl9KX6TtirVOrbLPLwDmASpZhK/XU7WvoKoCUkdtq9zF7qQ7gna0GBZFN0hci0vHaSusiL2WpsQk37A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@7.18.0': + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/types@8.4.0': + resolution: {integrity: sha512-T1RB3KQdskh9t3v/qv7niK6P8yvn7ja1mS7QK7XfRVL6wtZ8/mFs/FHf4fKvTA0rKnqnYxl/uHFNbnEt0phgbw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@7.18.0': + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@8.4.0': + resolution: {integrity: sha512-kJ2OIP4dQw5gdI4uXsaxUZHRwWAGpREJ9Zq6D5L0BweyOrWsL6Sz0YcAZGWhvKnH7fm1J5YFE1JrQL0c9dd53A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@7.18.0': + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/utils@8.4.0': + resolution: {integrity: sha512-swULW8n1IKLjRAgciCkTCafyTHHfwVQFt8DovmaF69sKbOxTSFMmIZaSHjqO9i/RV0wIblaawhzvtva8Nmm7lQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + + '@typescript-eslint/visitor-keys@7.18.0': + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/visitor-keys@8.4.0': + resolution: {integrity: sha512-zTQD6WLNTre1hj5wp09nBIDiOc2U5r/qmzo7wxPn4ZgAjHql09EofqhF9WF+fZHzL5aCyaIpPcT2hyxl73kr9A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vicons/antd@0.12.0': + resolution: {integrity: sha512-C0p6aO1EmGG1QHrqgUWQS1No20934OdWSRQshM5NIDK5H1On6tC26U0hT6Rmp40KfUsvhvX5YW8BoWJdNFifPg==} + + '@vicons/ionicons5@0.12.0': + resolution: {integrity: sha512-Iy1EUVRpX0WWxeu1VIReR1zsZLMc4fqpt223czR+Rpnrwu7pt46nbnC2ycO7ItI/uqDLJxnbcMC7FujKs9IfFA==} + + '@vitejs/plugin-vue-jsx@4.0.1': + resolution: {integrity: sha512-7mg9HFGnFHMEwCdB6AY83cVK4A6sCqnrjFYF4WIlebYAQVVJ/sC/CiTruVdrRlhrFoeZ8rlMxY9wYpPTIRhhAg==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 + vue: ^3.0.0 + + '@vitejs/plugin-vue@5.1.3': + resolution: {integrity: sha512-3xbWsKEKXYlmX82aOHufFQVnkbMC/v8fLpWwh6hWOUrK5fbbtBh9Q/WWse27BFgSy2/e2c0fz5Scgya9h2GLhw==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 + vue: ^3.2.25 + + '@vue/babel-helper-vue-transform-on@1.2.2': + resolution: {integrity: sha512-nOttamHUR3YzdEqdM/XXDyCSdxMA9VizUKoroLX6yTyRtggzQMHXcmwh8a7ZErcJttIBIc9s68a1B8GZ+Dmvsw==} + + '@vue/babel-plugin-jsx@1.2.2': + resolution: {integrity: sha512-nYTkZUVTu4nhP199UoORePsql0l+wj7v/oyQjtThUVhJl1U+6qHuoVhIvR3bf7eVKjbCK+Cs2AWd7mi9Mpz9rA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + peerDependenciesMeta: + '@babel/core': + optional: true + + '@vue/babel-plugin-resolve-type@1.2.2': + resolution: {integrity: sha512-EntyroPwNg5IPVdUJupqs0CFzuf6lUrVvCspmv2J1FITLeGnUCuoGNNk78dgCusxEiYj6RMkTJflGSxk5aIC4A==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@vue/compiler-core@3.4.38': + resolution: {integrity: sha512-8IQOTCWnLFqfHzOGm9+P8OPSEDukgg3Huc92qSG49if/xI2SAwLHQO2qaPQbjCWPBcQoO1WYfXfTACUrWV3c5A==} + + '@vue/compiler-dom@3.4.38': + resolution: {integrity: sha512-Osc/c7ABsHXTsETLgykcOwIxFktHfGSUDkb05V61rocEfsFDcjDLH/IHJSNJP+/Sv9KeN2Lx1V6McZzlSb9EhQ==} + + '@vue/compiler-sfc@3.4.38': + resolution: {integrity: sha512-s5QfZ+9PzPh3T5H4hsQDJtI8x7zdJaew/dCGgqZ2630XdzaZ3AD8xGZfBqpT8oaD/p2eedd+pL8tD5vvt5ZYJQ==} + + '@vue/compiler-ssr@3.4.38': + resolution: {integrity: sha512-YXznKFQ8dxYpAz9zLuVvfcXhc31FSPFDcqr0kyujbOwNhlmaNvL2QfIy+RZeJgSn5Fk54CWoEUeW+NVBAogGaw==} + + '@vue/devtools-api@6.6.3': + resolution: {integrity: sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==} + + '@vue/eslint-config-typescript@13.0.0': + resolution: {integrity: sha512-MHh9SncG/sfqjVqjcuFLOLD6Ed4dRAis4HNt0dXASeAuLqIAx4YMB1/m2o4pUKK1vCt8fUvYG8KKX2Ot3BVZTg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + eslint-plugin-vue: ^9.0.0 + typescript: '>=4.7.4' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/reactivity@3.4.38': + resolution: {integrity: sha512-4vl4wMMVniLsSYYeldAKzbk72+D3hUnkw9z8lDeJacTxAkXeDAP1uE9xr2+aKIN0ipOL8EG2GPouVTH6yF7Gnw==} + + '@vue/runtime-core@3.4.38': + resolution: {integrity: sha512-21z3wA99EABtuf+O3IhdxP0iHgkBs1vuoCAsCKLVJPEjpVqvblwBnTj42vzHRlWDCyxu9ptDm7sI2ZMcWrQqlA==} + + '@vue/runtime-dom@3.4.38': + resolution: {integrity: sha512-afZzmUreU7vKwKsV17H1NDThEEmdYI+GCAK/KY1U957Ig2NATPVjCROv61R19fjZNzMmiU03n79OMnXyJVN0UA==} + + '@vue/server-renderer@3.4.38': + resolution: {integrity: sha512-NggOTr82FbPEkkUvBm4fTGcwUY8UuTsnWC/L2YZBmvaQ4C4Jl/Ao4HHTB+l7WnFCt5M/dN3l0XLuyjzswGYVCA==} + peerDependencies: + vue: 3.4.38 + + '@vue/shared@3.4.38': + resolution: {integrity: sha512-q0xCiLkuWWQLzVrecPb0RMsNWyxICOjPrcrwxTUEHb1fsnvni4dcuyG7RT/Ie7VPTvnjzIaWzRMUBsrqNj/hhw==} + + '@vueup/vue-quill@1.2.0': + resolution: {integrity: sha512-kd5QPSHMDpycklojPXno2Kw2JSiKMYduKYQckTm1RJoVDA557MnyUXgcuuDpry4HY/Rny9nGNcK+m3AHk94wag==} + peerDependencies: + vue: ^3.2.41 + + '@vueuse/core@11.0.3': + resolution: {integrity: sha512-RENlh64+SYA9XMExmmH1a3TPqeIuJBNNB/63GT35MZI+zpru3oMRUA6cEFr9HmGqEgUisurwGwnIieF6qu3aXw==} + + '@vueuse/metadata@11.0.3': + resolution: {integrity: sha512-+FtbO4SD5WpsOcQTcC0hAhNlOid6QNLzqedtquTtQ+CRNBoAt9GuV07c6KNHK1wCmlq8DFPwgiLF2rXwgSHX5Q==} + + '@vueuse/shared@11.0.3': + resolution: {integrity: sha512-0rY2m6HS5t27n/Vp5cTDsKTlNnimCqsbh/fmT2LgE+aaU42EMfXo8+bNX91W9I7DDmxfuACXMmrd7d79JxkqWA==} + + '@webassemblyjs/ast@1.12.1': + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + + '@webassemblyjs/floating-point-hex-parser@1.11.6': + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + '@webassemblyjs/helper-api-error@1.11.6': + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + '@webassemblyjs/helper-buffer@1.12.1': + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + + '@webassemblyjs/helper-numbers@1.11.6': + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + '@webassemblyjs/helper-wasm-section@1.12.1': + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + + '@webassemblyjs/ieee754@1.11.6': + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + + '@webassemblyjs/leb128@1.11.6': + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + + '@webassemblyjs/utf8@1.11.6': + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + '@webassemblyjs/wasm-edit@1.12.1': + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + + '@webassemblyjs/wasm-gen@1.12.1': + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + + '@webassemblyjs/wasm-opt@1.12.1': + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + + '@webassemblyjs/wasm-parser@1.12.1': + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + + '@webassemblyjs/wast-printer@1.12.1': + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} + engines: {node: '>=0.4.0'} + + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.19.0: + resolution: {integrity: sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + + array-union@1.0.2: + resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} + engines: {node: '>=0.10.0'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array-uniq@1.0.3: + resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} + engines: {node: '>=0.10.0'} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + autoprefixer@10.4.20: + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + axios@1.7.7: + resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} + + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + babel-preset-current-node-syntax@1.1.0: + resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} + peerDependencies: + '@babel/core': ^7.0.0 + + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@2.0.0: + resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + batch-processor@1.0.0: + resolution: {integrity: sha512-xoLQD8gmmR32MeuBHgH0Tzd5PuSZx71ZsbhVxOCRbgktZEPe4SQy7s9Z50uPp0F/f7iw2XmkHN2xkgbMfckMDA==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + blueimp-md5@2.19.0: + resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + bundle-require@4.2.1: + resolution: {integrity: sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.17' + + cachedir@2.3.0: + resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} + engines: {node: '>=6'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001655: + resolution: {integrity: sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==} + + capital-case@1.0.4: + resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + change-case@4.1.2: + resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cjs-module-lexer@1.4.0: + resolution: {integrity: sha512-N1NGmowPlGBLsOZLPvm48StN04V4YvQRL0i6b7ctrVY3epjP/ct7hFLOItz6pDIvRjwpfPxi52a2UWV2ziir8g==} + + clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + + cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + + clipboard@2.0.11: + resolution: {integrity: sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + codemirror@6.0.2: + resolution: {integrity: sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==} + + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@11.0.0: + resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} + engines: {node: '>=16'} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + commitizen@4.3.0: + resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} + engines: {node: '>= 12'} + hasBin: true + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.7: + resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.3.1: + resolution: {integrity: sha512-cKUSoKa8YxFZZSmraVi7onONx3amu77ngK3kGpsYHDH7drPwCRkQE1RYMPlLRrMtnciRj274XNRxcHxnKmDSnA==} + + connect-history-api-fallback@1.6.0: + resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} + engines: {node: '>=0.8'} + + connect@3.7.0: + resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} + engines: {node: '>= 0.10.0'} + + consola@2.15.3: + resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + + console@0.7.2: + resolution: {integrity: sha512-+JSDwGunA4MTEgAV/4VBKwUHonP8CzJ/6GIuwPi6acKFqFfHUdSGCm89ZxZ5FfGWdZfkdgAroy5bJ5FSeN/t4g==} + + constant-case@3.0.4: + resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} + + conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} + + conventional-changelog-conventionalcommits@7.0.2: + resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} + engines: {node: '>=16'} + + conventional-commit-types@3.0.0: + resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} + + conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} + engines: {node: '>=16'} + hasBin: true + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + copy-anything@2.0.6: + resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + + core-js@3.38.1: + resolution: {integrity: sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==} + + cosmiconfig-typescript-loader@5.0.0: + resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} + engines: {node: '>=v16'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=8.2' + typescript: '>=4' + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + create-jest@29.7.0: + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + + cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + deprecated: Active development of CryptoJS has been discontinued. This library is no longer maintained. + + css-functions-list@3.2.2: + resolution: {integrity: sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==} + engines: {node: '>=12 || >=16'} + + css-render@0.15.14: + resolution: {integrity: sha512-9nF4PdUle+5ta4W5SyZdLCCmFd37uVimSjg1evcTqKJCyvCEEj12WKzOSBNak6r4im4J4iYXKH1OWpUV5LBYFg==} + + css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.0.11: + resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + cz-conventional-changelog@3.3.0: + resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} + engines: {node: '>= 10'} + + dargs@8.1.0: + resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} + engines: {node: '>=12'} + + date-fns-tz@3.2.0: + resolution: {integrity: sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==} + peerDependencies: + date-fns: ^3.0.0 || ^4.0.0 + + date-fns@3.6.0: + resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} + + date-fns@4.4.0: + resolution: {integrity: sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + + dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-equal@1.1.2: + resolution: {integrity: sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==} + engines: {node: '>= 0.4'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + delegate@3.2.0: + resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==} + + detect-file@1.0.0: + resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} + engines: {node: '>=0.10.0'} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + dotenv-expand@8.0.3: + resolution: {integrity: sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg==} + engines: {node: '>=12'} + + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + echarts@5.5.1: + resolution: {integrity: sha512-Fce8upazaAXUVUVsjgV6mBnGuqgO+JNDlcgF79Dksy4+wgGpQB2lmYoO4TSweFg/mZITdpGHomw/cNBJZj1icA==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-to-chromium@1.5.13: + resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} + + element-resize-detector@1.2.4: + resolution: {integrity: sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==} + + email-addresses@5.0.0: + resolution: {integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==} + + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + enhanced-resolve@5.17.1: + resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + engines: {node: '>=10.13.0'} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + + errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@0.9.3: + resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} + + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-define-config@2.1.0: + resolution: {integrity: sha512-QUp6pM9pjKEVannNAbSJNeRuYwW3LshejfyBBpjeMGaJjaDUpVps4C6KVR8R7dWZnD3i0synmrE36znjTkJvdQ==} + engines: {node: '>=18.0.0', npm: '>=9.0.0', pnpm: '>=8.6.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + eslint-plugin-jest@28.8.2: + resolution: {integrity: sha512-mC3OyklHmS5i7wYU1rGId9EnxRI8TVlnFG56AE+8U9iRy6zwaNygZR+DsdZuCL0gRG0wVeyzq+uWcPt6yJrrMA==} + engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + + eslint-plugin-prettier@5.2.1: + resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-plugin-vue@9.28.0: + resolution: {integrity: sha512-ShrihdjIhOTxs+MfWun6oJWuk+g/LAhN+CiuOl/jjkG3l0F2AuK5NMTaWqyvBgkFtpYmyks6P4603mLmhNJW8g==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-scope@8.0.2: + resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.0.0: + resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.9.1: + resolution: {integrity: sha512-dHvhrbfr4xFQ9/dq+jcVneZMyRYLjggWjk6RVsIiHsP8Rz6yZ8LvZ//iU4TrZF+SXWG+JkNF2OyiZRvzgRDqMg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + esno@4.7.0: + resolution: {integrity: sha512-81owrjxIxOwqcABt20U09Wn8lpBo9K6ttqbGvQcB3VYNLJyaV1fvKkDtpZd3Rj5BX3WXiGiJCjUevKQGNICzJg==} + hasBin: true + + espree@10.1.0: + resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + eventemitter3@2.0.3: + resolution: {integrity: sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + evtd@0.2.4: + resolution: {integrity: sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + + expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} + + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + exsolve@1.1.3: + resolution: {integrity: sha512-kuzL9zherLQoqDeQaS55AiiIg1kb4KYXaSusTtgZTPlvKP2gGCI82LNmBNh5RjDVUXIcmgx+/Mx7vPwRzBbhJA==} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.1.2: + resolution: {integrity: sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==} + + fast-diff@1.2.0: + resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.0.1: + resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==} + + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + file-entry-cache@9.1.0: + resolution: {integrity: sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==} + engines: {node: '>=18'} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + filename-reserved-regex@2.0.0: + resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==} + engines: {node: '>=4'} + + filenamify@4.3.0: + resolution: {integrity: sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==} + engines: {node: '>=8'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.1.2: + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} + engines: {node: '>= 0.8'} + + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + + find-node-modules@2.1.3: + resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} + + findup-sync@4.0.0: + resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} + engines: {node: '>= 8'} + + fingerprintjs2@2.1.4: + resolution: {integrity: sha512-veP2yVsnYvjDVkzZMyIEwpqCAQfsBLH+U4PK5MlFAnLjZrttbdRqEArE1fPcnJFz5oS5CrdONbsV7J6FGpIJEQ==} + deprecated: Package has been renamed to @fingerprintjs/fingerprintjs. Install @fingerprintjs/fingerprintjs to get updates. + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flat-cache@5.0.0: + resolution: {integrity: sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==} + engines: {node: '>=18'} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-tsconfig@4.8.0: + resolution: {integrity: sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw==} + + gh-pages@6.1.1: + resolution: {integrity: sha512-upnohfjBwN5hBP9w2dPE7HO5JJTHzSGMV1JrLrHvNuqmjoYHg6TBrCcnEoorjG/e0ejbuvnwyKMdTyM40PEByw==} + engines: {node: '>=10'} + hasBin: true + + git-raw-commits@4.0.0: + resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} + engines: {node: '>=16'} + deprecated: Deprecated and no longer maintained. Use @conventional-changelog/git-client instead. + hasBin: true + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + + glob@11.0.0: + resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} + engines: {node: 20 || >=22} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + + global-modules@1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} + + global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + + global-prefix@1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} + engines: {node: '>=0.10.0'} + + global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globby@6.1.0: + resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==} + engines: {node: '>=0.10.0'} + + globjoin@0.1.4: + resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} + + good-listener@1.2.2: + resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + header-case@2.0.4: + resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + + highlight.js@11.10.0: + resolution: {integrity: sha512-SYVnVFswQER+zu1laSya563s+F8VDGt7o35d4utbamowvUNLLMovFqwCLSocpZTz3MgaSRA1IbqRWZv97dtErQ==} + engines: {node: '>=12.0.0'} + + homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + html-minifier-terser@6.1.0: + resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} + engines: {node: '>=12'} + hasBin: true + + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + husky@9.1.5: + resolution: {integrity: sha512-rowAVRUBfI0b4+niA4SJMhfQwc107VLkBUgEYYAOQAbqDCnra1nYh83hF/MDmhYs9t9n1E3DuKOrs2LYNC+0Ag==} + engines: {node: '>=18'} + hasBin: true + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + inquirer@8.2.5: + resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} + engines: {node: '>=12.0.0'} + + is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-text-path@2.0.0: + resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} + engines: {node: '>=8'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + + is-what@3.14.1: + resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jackspeak@4.0.1: + resolution: {integrity: sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==} + engines: {node: 20 || >=22} + + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + + jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-cli@29.7.0: + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@29.7.0: + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest@29.7.0: + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + known-css-properties@0.34.0: + resolution: {integrity: sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==} + + less-loader@12.2.0: + resolution: {integrity: sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + less: ^3.5.0 || ^4.0.0 + webpack: ^5.0.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + less@4.2.0: + resolution: {integrity: sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==} + engines: {node: '>=6'} + hasBin: true + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lint-staged@15.2.10: + resolution: {integrity: sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==} + engines: {node: '>=18.12.0'} + hasBin: true + + listr2@8.2.4: + resolution: {integrity: sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==} + engines: {node: '>=18.0.0'} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + + local-pkg@1.2.1: + resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==} + engines: {node: '>=14'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + + lodash.map@4.6.0: + resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + + lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + + longest@2.0.1: + resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==} + engines: {node: '>=0.10.0'} + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.0.0: + resolution: {integrity: sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + + magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + mathml-tag-names@2.1.3: + resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + + meow@12.1.1: + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} + + meow@13.2.0: + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + merge@2.1.1: + resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.7: + resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mint-filter@4.0.3: + resolution: {integrity: sha512-CKh2zKv9oFHEmYCXFk5REG2480FBNYixK+hw0mlRd/TgDJVhPpRhHPNhWa3Q6zF1tpE2q7w7y+Ylu1YJusXDpA==} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + mlly@1.7.1: + resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} + + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + + mockjs@1.1.0: + resolution: {integrity: sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==} + hasBin: true + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + naive-ui@2.45.3: + resolution: {integrity: sha512-D83gJ+6zUdkQ5DuUbmlfyaM1t8pV5WMPa6KmL9mByqQuiL12qBdA0n/iEIth4dQw1x/duNGpOS2anpt5FKO1kw==} + engines: {node: '>=20'} + peerDependencies: + vue: ^3.0.0 + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + needle@3.3.1: + resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} + engines: {node: '>= 4.4.x'} + hasBin: true + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-html-parser@5.4.2: + resolution: {integrity: sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==} + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + normalize-url@4.5.1: + resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} + engines: {node: '>=8'} + + npm-check-updates@17.1.1: + resolution: {integrity: sha512-2aqIzGAEWB7xPf0hKHTkNmUM5jHbn2S5r2/z/7dA5Ij2h/sVYAg9R/uVkaUC3VORPAfBm7pKkCWo6E9clEVQ9A==} + engines: {node: ^18.18.0 || >=20.0.0, npm: '>=8.12.1'} + hasBin: true + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} + + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + + parchment@1.1.4: + resolution: {integrity: sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-node-version@1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + + parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + path-case@3.0.4: + resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + + path-to-regexp@6.2.2: + resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@0.2.0: + resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@3.0.1: + resolution: {integrity: sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==} + engines: {node: '>=10'} + + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pinia@2.2.2: + resolution: {integrity: sha512-ja2XqFWZC36mupU4z1ZzxeTApV7DOw44cV4dhQ9sGwun+N89v/XP7+j7q6TanS1u1tdbK4r+1BUx7heMaIdagA==} + peerDependencies: + '@vue/composition-api': ^1.4.0 + typescript: '>=4.4.4' + vue: ^2.6.14 || ^3.3.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + typescript: + optional: true + + pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + + pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + + pinyin-pro@3.24.2: + resolution: {integrity: sha512-5tPyLhxT4CZ9dWqQRqm3X5ADdS18Sb2w0ranNBgr6jCrqO4O8gtfuyqG7Y6+1Mre+0n2VlhKDz+3P5oqSLrkOw==} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-types@1.2.0: + resolution: {integrity: sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.3: + resolution: {integrity: sha512-j/lCFdcppV0JxWpCEITdbDltBxPP6cHT+yNJ6Go2OgoSA9518X847X9z0p6LtA4Nc16+eQzCZjRrWanTGvHJ5w==} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-media-query-parser@0.2.3: + resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-resolve-nested-selector@0.1.6: + resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==} + + postcss-safe-parser@7.0.0: + resolution: {integrity: sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.4.31 + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-sorting@8.0.2: + resolution: {integrity: sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==} + peerDependencies: + postcss: ^8.4.20 + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.44: + resolution: {integrity: sha512-Aweb9unOEpQ3ezu4Q00DPvvM2ZTUitJdNKeP/+uQgr1IBIqu574IaZoURId7BKtWMREwzKa9OgzPzezWGPWFQw==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + pretty-quick@4.0.0: + resolution: {integrity: sha512-M+2MmeufXb/M7Xw3Afh1gxcYpj+sK0AxEfnfF958ktFeAyi5MsKY5brymVURQLgPLV1QaF5P4pb2oFJ54H3yzQ==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + prettier: ^3.0.0 + + print-js@1.6.0: + resolution: {integrity: sha512-BfnOIzSKbqGRtO4o0rnj/K3681BSd2QUrsIZy/+WdCIugjIswjmx3lDEZpXB2ruGf9d4b3YNINri81+J0FsBWg==} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + + qrcode.vue@3.4.1: + resolution: {integrity: sha512-wq/zHsifH4FJ1GXQi8/wNxD1KfQkckIpjK1KPTc/qwYU5/Bkd4me0w4xZSg6EXk6xLBkVDE0zxVagewv5EMAVA==} + peerDependencies: + vue: ^3.0.0 + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quill-delta@3.6.3: + resolution: {integrity: sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==} + engines: {node: '>=0.10'} + + quill-delta@4.2.2: + resolution: {integrity: sha512-qjbn82b/yJzOjstBgkhtBjN2TNK+ZHP/BgUQO+j6bRhWQQdmj2lH6hXG7+nwwLF41Xgn//7/83lxs9n2BkTtTg==} + + quill-delta@5.1.0: + resolution: {integrity: sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==} + engines: {node: '>= 12.0.0'} + + quill-image-uploader@1.3.0: + resolution: {integrity: sha512-vO43GEn93rGThje/MlotkQE9OV5nOKBZ4oKhn71L/EjrM/J2P/8iDDVd9GEwlsGsbskeJqPLopsSQ4HlVVIn6A==} + peerDependencies: + quill: ^1.3.7 + + quill-magic-url@4.2.0: + resolution: {integrity: sha512-u1tHwsQjrTczhECNtXK5EUkWwAMb8raLpsU3llqiLu344kPlA9ldoenHvY3XW+yI+2IZ9WgKgRmcy+cKGN3gnQ==} + + quill@1.3.7: + resolution: {integrity: sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + + relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-dir@1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rimraf@6.0.1: + resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} + engines: {node: 20 || >=22} + hasBin: true + + rollup@4.21.2: + resolution: {integrity: sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + + seemly@0.3.10: + resolution: {integrity: sha512-2+SMxtG1PcsL0uyhkumlOU6Qo9TAQ/WyH7tthnPIOQB05/12jz9naq6GZ6iZ6ApVsO3rr2gsnTf3++OV63kE1Q==} + + seemly@0.3.8: + resolution: {integrity: sha512-MW8Qs6vbzo0pHmDpFSYPna+lwpZ6Zk1ancbajw/7E8TKtHdV+1DfZZD+kKJEhG/cAoB/i+LiT+5msZOqj0DwRA==} + + select@1.1.2: + resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + sentence-case@3.0.4: + resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + + sortablejs@1.14.0: + resolution: {integrity: sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + + spark-md5@3.0.2: + resolution: {integrity: sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + + strip-outer@1.0.1: + resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} + engines: {node: '>=0.10.0'} + + style-mod@4.1.2: + resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} + + stylelint-config-prettier@9.0.5: + resolution: {integrity: sha512-U44lELgLZhbAD/xy/vncZ2Pq8sh2TnpiPvo38Ifg9+zeioR+LAkHu0i6YORIOxFafZoVg0xqQwex6e6F25S5XA==} + engines: {node: '>= 12'} + hasBin: true + peerDependencies: + stylelint: '>= 11.x < 15' + + stylelint-config-recommended@14.0.1: + resolution: {integrity: sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.1.0 + + stylelint-config-standard@36.0.1: + resolution: {integrity: sha512-8aX8mTzJ6cuO8mmD5yon61CWuIM4UD8Q5aBcWKGSf6kg+EC3uhB+iOywpTK4ca6ZL7B49en8yanOFtUW0qNzyw==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.1.0 + + stylelint-order@6.0.4: + resolution: {integrity: sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA==} + peerDependencies: + stylelint: ^14.0.0 || ^15.0.0 || ^16.0.1 + + stylelint-scss@6.5.1: + resolution: {integrity: sha512-ZLqdqihm6uDYkrsOeD6YWb+stZI8Wn92kUNDhE4M+g9g1aCnRv0JlOrttFiAJJwaNzpdQgX3YJb5vDQXVuO9Ww==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.0.2 + + stylelint@16.9.0: + resolution: {integrity: sha512-31Nm3WjxGOBGpQqF43o3wO9L5AC36TPIe6030Lnm13H3vDMTcS21DrLh69bMX+DBilKqMMVLian4iG6ybBoNRQ==} + engines: {node: '>=18.12.0'} + hasBin: true + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-hyperlinks@3.1.0: + resolution: {integrity: sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==} + engines: {node: '>=14.18'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + + synckit@0.9.1: + resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==} + engines: {node: ^14.18.0 || >=16.0.0} + + table@6.8.2: + resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} + engines: {node: '>=10.0.0'} + + tailwindcss@3.4.10: + resolution: {integrity: sha512-KWZkVPm7yJRhdu4SRSl9d4AK2wM3a50UsvgHZO7xY77NQr2V+fIrEuoDGQcbvswWvFGbS2f6e+jC/6WJm1Dl0w==} + engines: {node: '>=14.0.0'} + hasBin: true + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + terser-webpack-plugin@5.3.10: + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.31.6: + resolution: {integrity: sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==} + engines: {node: '>=10'} + hasBin: true + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + text-extensions@2.4.0: + resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} + engines: {node: '>=8'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + throttle-debounce@5.0.2: + resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} + engines: {node: '>=12.22'} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tiny-emitter@2.1.0: + resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + treemate@0.3.11: + resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==} + + trim-repeated@1.0.0: + resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==} + engines: {node: '>=0.10.0'} + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + tslib@2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} + + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + + tsx@4.19.0: + resolution: {integrity: sha512-bV30kM7bsLZKZIOCHeMNVMJ32/LuJzLVajkQI/qf92J2Qr08ueLQvW00PUZGiuLPP760UINwupgUj8qrSCPUKg==} + engines: {node: '>=18.0.0'} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + unimport@5.7.0: + resolution: {integrity: sha512-njnL6sp8lEA8QQbZrt+52p/g4X0rw3bnGGmUcJnt1jeG8+iiqO779aGz0PirCtydAIVcuTBRlJ52F0u46z309Q==} + engines: {node: '>=18.12.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + unplugin-auto-import@20.3.0: + resolution: {integrity: sha512-RcSEQiVv7g0mLMMXibYVKk8mpteKxvyffGuDKqZZiFr7Oq3PB1HwgHdK5O7H4AzbhzHoVKG0NnMnsk/1HIVYzQ==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': ^4.0.0 + '@vueuse/core': '*' + peerDependenciesMeta: + '@nuxt/kit': + optional: true + '@vueuse/core': + optional: true + + unplugin-utils@0.3.2: + resolution: {integrity: sha512-xVToRh2CTmLk2HnEG7ac4rl1MJTT3RFkpS8B++/SnB0kXvuaavD+n3m/vrzyWQOdJNSZQACnbz01pnppbwV5BA==} + engines: {node: '>=20.19.0'} + + unplugin-vue-components@0.27.4: + resolution: {integrity: sha512-1XVl5iXG7P1UrOMnaj2ogYa5YTq8aoh5jwDPQhemwO/OrXW+lPQKDXd1hMz15qxQPxgb/XXlbgo3HQ2rLEbmXQ==} + engines: {node: '>=14'} + peerDependencies: + '@babel/parser': ^7.15.8 + '@nuxt/kit': ^3.2.2 + vue: 2 || 3 + peerDependenciesMeta: + '@babel/parser': + optional: true + '@nuxt/kit': + optional: true + + unplugin@1.12.3: + resolution: {integrity: sha512-my8DH0/T/Kx33KO+6QXAqdeMYgyy0GktlOpdQjpagfHKw5DrD0ctPr7SHUyOT3g4ZVpzCQGt/qcpuoKJ/pniHA==} + engines: {node: '>=14.0.0'} + + unplugin@2.3.11: + resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} + engines: {node: '>=18.12.0'} + + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + upper-case-first@2.0.2: + resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} + + upper-case@2.0.2: + resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} + + vdirs@0.1.8: + resolution: {integrity: sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==} + peerDependencies: + vue: ^3.0.11 + + vfonts@0.0.3: + resolution: {integrity: sha512-nguyw8L6Un8eelg1vQ31vIU2ESxqid7EYmy8V+MDeMaHBqaRSkg3dTBToC1PR00D89UzS/SLkfYPnx0Wf23IQQ==} + + vite-plugin-compression@0.5.1: + resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==} + peerDependencies: + vite: '>=2.0.0' + + vite-plugin-html@3.2.2: + resolution: {integrity: sha512-vb9C9kcdzcIo/Oc3CLZVS03dL5pDlOFuhGlZYDCJ840BhWl/0nGeZWf3Qy7NlOayscY4Cm/QRgULCQkEZige5Q==} + peerDependencies: + vite: '>=2.0.0' + + vite-plugin-mock@3.0.2: + resolution: {integrity: sha512-bD//HvkTygGmk+LsIAdf0jGNlCv4iWv0kZlH9UEgWT6QYoUwfjQAE4SKxHRw2tfLgVhbPQVv/+X3YlNWvueGUA==} + engines: {node: '>=16.0.0'} + peerDependencies: + esbuild: '>=0.17' + mockjs: '>=1.1.0' + vite: '>=4.0.0' + + vite-plugin-require-transform@1.0.21: + resolution: {integrity: sha512-A3SrHhVg9tCW35O7E8kcuB71YTEdVd3EaM1zh6gbH4zxy4WzXSfcNf0UiWmaHHhr6wdFhiiAGdpR6S0SUxXkGQ==} + + vite-plugin-style-import@2.0.0: + resolution: {integrity: sha512-qtoHQae5dSUQPo/rYz/8p190VU5y19rtBaeV7ryLa/AYAU/e9CG89NrN/3+k7MR8mJy/GPIu91iJ3zk9foUOSA==} + peerDependencies: + vite: '>=2.0.0' + + vite-plugin-top-level-await@1.4.4: + resolution: {integrity: sha512-QyxQbvcMkgt+kDb12m2P8Ed35Sp6nXP+l8ptGrnHV9zgYDUpraO0CPdlqLSeBqvY2DToR52nutDG7mIHuysdiw==} + peerDependencies: + vite: '>=2.8' + + vite-plugin-vue-setup-extend@0.4.0: + resolution: {integrity: sha512-WMbjPCui75fboFoUTHhdbXzu4Y/bJMv5N9QT9a7do3wNMNHHqrk+Tn2jrSJU0LS5fGl/EG+FEDBYVUeWIkDqXQ==} + peerDependencies: + vite: '>=2.0.0' + + vite@5.4.2: + resolution: {integrity: sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vooks@0.2.12: + resolution: {integrity: sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==} + peerDependencies: + vue: ^3.0.0 + + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-draggable-next@2.2.1: + resolution: {integrity: sha512-EAMS1IRHF0kZO0o5PMOinsQsXIqsrKT1hKmbICxG3UEtn7zLFkLxlAtajcCcUTisNvQ6TtCB5COjD9a1raNADw==} + peerDependencies: + sortablejs: ^1.14.0 + vue: ^3.2.2 + + vue-eslint-parser@9.4.3: + resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + vue-i18n@11.4.13: + resolution: {integrity: sha512-2G7LC9XcdZ0IljFib7lKGHNiBBOTv6HO+2bnBaOiQgDYZ+uUnqSpuED5DbBo1t7su50o/WRGn+ZfDQTGd26xEw==} + engines: {node: '>= 22'} + peerDependencies: + vue: ^3.0.0 + + vue-router@4.4.3: + resolution: {integrity: sha512-sv6wmNKx2j3aqJQDMxLFzs/u/mjA9Z5LCgy6BE0f7yFWMjrPLnS/sPNn8ARY/FXw6byV18EFutn5lTO6+UsV5A==} + peerDependencies: + vue: ^3.2.0 + + vue-types@5.1.3: + resolution: {integrity: sha512-3Wy6QcZl0VusCCHX3vYrWSILFlrOB2EQDoySnuYmASM5cUp1FivJGfkS5lp1CutDgyRb41g32r/1QCmiBj5i1Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + vue: ^2.0.0 || ^3.0.0 + peerDependenciesMeta: + vue: + optional: true + + vue-waterfall-plugin-next@2.6.0: + resolution: {integrity: sha512-GgovHXWkEP0flI/60GPeTC9vQAnYXLfhohAe8BudIljlcpBS+UCFXOS+S7FCsoujhvdcUY1heKxZglf13KGl9g==} + + vue3-json-viewer@2.4.1: + resolution: {integrity: sha512-Z1sunvS58lJ3ZcpNhl3jYQapBVw2wjnXbemigfMWm3QnjCeg3CPMq8R6pxHUYahxMfPKLvrbGve6mUXqhWyLaQ==} + peerDependencies: + vue: ^3.5.16 + + vue@3.4.38: + resolution: {integrity: sha512-f0ZgN+mZ5KFgVv9wz0f4OgVKukoXtS3nwET4c2vLBGQR50aI8G0cqbFtLlX9Yiyg3LFGBitruPHt2PxwTduJEw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + vuedraggable@4.1.0: + resolution: {integrity: sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==} + peerDependencies: + vue: ^3.0.1 + + vueuc@0.4.66: + resolution: {integrity: sha512-hHrZl+0AsrUvqYPBXSXQ2QaSrO3razjeUseLAhJWlOS/Hdfw/Y2MU05fOTP1qn1A3121gMxsHLaEz2V6CkWdTg==} + peerDependencies: + vue: ^3.0.11 + + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + watchpack@2.4.2: + resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} + engines: {node: '>=10.13.0'} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + webpack@5.94.0: + resolution: {integrity: sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + weixin-js-sdk@1.6.5: + resolution: {integrity: sha512-Gph1WAWB2YN/lMOFB/ymb+hbU/wYazzJgu6PMMktCy9cSCeW5wA6Zwt0dpahJbJ+RJEwtTv2x9iIu0U4enuVSQ==} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@2.5.0: + resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} + + zrender@5.6.0: + resolution: {integrity: sha512-uzgraf4njmmHAbEUxMJ8Oxg+P3fT04O+9p7gY+wJRVxo8Ge+KmYv0WJev945EH4wFuc4OY2NLXz46FZrWS9xJg==} + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@antfu/utils@0.7.10': {} + + '@babel/code-frame@7.24.7': + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.1.0 + + '@babel/compat-data@7.25.4': {} + + '@babel/core@7.25.2(supports-color@8.1.1)': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.6 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/helpers': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.6(supports-color@8.1.1) + '@babel/types': 7.25.6 + convert-source-map: 2.0.0 + debug: 4.3.6(supports-color@8.1.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.25.6': + dependencies: + '@babel/types': 7.25.6 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-annotate-as-pure@7.24.7': + dependencies: + '@babel/types': 7.25.6 + + '@babel/helper-compilation-targets@7.25.2': + dependencies: + '@babel/compat-data': 7.25.4 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.3 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.25.4(@babel/core@7.25.2(supports-color@8.1.1))(supports-color@8.1.1)': + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-member-expression-to-functions': 7.24.8(supports-color@8.1.1) + '@babel/helper-optimise-call-expression': 7.24.7 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7(supports-color@8.1.1) + '@babel/traverse': 7.25.6(supports-color@8.1.1) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-member-expression-to-functions@7.24.8(supports-color@8.1.1)': + dependencies: + '@babel/traverse': 7.25.6(supports-color@8.1.1) + '@babel/types': 7.25.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.22.15': + dependencies: + '@babel/types': 7.25.6 + + '@babel/helper-module-imports@7.24.7(supports-color@8.1.1)': + dependencies: + '@babel/traverse': 7.25.6(supports-color@8.1.1) + '@babel/types': 7.25.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2(supports-color@8.1.1))(supports-color@8.1.1)': + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/helper-module-imports': 7.24.7(supports-color@8.1.1) + '@babel/helper-simple-access': 7.24.7(supports-color@8.1.1) + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.6(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.24.7': + dependencies: + '@babel/types': 7.25.6 + + '@babel/helper-plugin-utils@7.24.8': {} + + '@babel/helper-replace-supers@7.25.0(@babel/core@7.25.2(supports-color@8.1.1))(supports-color@8.1.1)': + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/helper-member-expression-to-functions': 7.24.8(supports-color@8.1.1) + '@babel/helper-optimise-call-expression': 7.24.7 + '@babel/traverse': 7.25.6(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + '@babel/helper-simple-access@7.24.7(supports-color@8.1.1)': + dependencies: + '@babel/traverse': 7.25.6(supports-color@8.1.1) + '@babel/types': 7.25.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.24.7(supports-color@8.1.1)': + dependencies: + '@babel/traverse': 7.25.6(supports-color@8.1.1) + '@babel/types': 7.25.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.24.8': {} + + '@babel/helper-validator-identifier@7.24.7': {} + + '@babel/helper-validator-option@7.24.8': {} + + '@babel/helpers@7.25.6': + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 + + '@babel/highlight@7.24.7': + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.1.0 + + '@babel/parser@7.25.6': + dependencies: + '@babel/types': 7.25.6 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.25.2(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-import-attributes@7.25.6(@babel/core@7.25.2(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-typescript@7.25.4(@babel/core@7.25.2(supports-color@8.1.1))': + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-typescript@7.25.2(@babel/core@7.25.2(supports-color@8.1.1))(supports-color@8.1.1)': + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7(supports-color@8.1.1) + '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.25.2(supports-color@8.1.1)) + transitivePeerDependencies: + - supports-color + + '@babel/template@7.25.0': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 + + '@babel/traverse@7.25.6(supports-color@8.1.1)': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 + debug: 4.3.6(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.25.6': + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + + '@bcoe/v8-coverage@0.2.3': {} + + '@codemirror/autocomplete@0.20.3': + dependencies: + '@codemirror/language': 0.20.2 + '@codemirror/state': 0.20.1 + '@codemirror/view': 0.20.7 + '@lezer/common': 0.16.1 + + '@codemirror/autocomplete@6.18.7': + dependencies: + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.2 + '@lezer/common': 1.2.3 + + '@codemirror/basic-setup@0.20.0': + dependencies: + '@codemirror/autocomplete': 0.20.3 + '@codemirror/commands': 0.20.0 + '@codemirror/language': 0.20.2 + '@codemirror/lint': 0.20.3 + '@codemirror/search': 0.20.1 + '@codemirror/state': 0.20.1 + '@codemirror/view': 0.20.7 + + '@codemirror/commands@0.20.0': + dependencies: + '@codemirror/language': 0.20.2 + '@codemirror/state': 0.20.1 + '@codemirror/view': 0.20.7 + '@lezer/common': 0.16.1 + + '@codemirror/commands@6.8.1': + dependencies: + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.2 + '@lezer/common': 1.2.3 + + '@codemirror/lang-yaml@6.1.2': + dependencies: + '@codemirror/autocomplete': 6.18.7 + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + '@lezer/yaml': 1.0.3 + + '@codemirror/language@0.20.2': + dependencies: + '@codemirror/state': 0.20.1 + '@codemirror/view': 0.20.7 + '@lezer/common': 0.16.1 + '@lezer/highlight': 0.16.0 + '@lezer/lr': 0.16.3 + style-mod: 4.1.2 + + '@codemirror/language@6.11.3': + dependencies: + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.2 + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + style-mod: 4.1.2 + + '@codemirror/lint@0.20.3': + dependencies: + '@codemirror/state': 0.20.1 + '@codemirror/view': 0.20.7 + crelt: 1.0.6 + + '@codemirror/lint@6.8.5': + dependencies: + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.2 + crelt: 1.0.6 + + '@codemirror/search@0.20.1': + dependencies: + '@codemirror/state': 0.20.1 + '@codemirror/view': 0.20.7 + crelt: 1.0.6 + + '@codemirror/search@6.5.11': + dependencies: + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.2 + crelt: 1.0.6 + + '@codemirror/state@0.20.1': {} + + '@codemirror/state@6.5.2': + dependencies: + '@marijn/find-cluster-break': 1.0.2 + + '@codemirror/theme-one-dark@6.1.3': + dependencies: + '@codemirror/language': 6.11.3 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.2 + '@lezer/highlight': 1.2.1 + + '@codemirror/view@0.20.7': + dependencies: + '@codemirror/state': 0.20.1 + style-mod: 4.1.2 + w3c-keyname: 2.2.8 + + '@codemirror/view@6.38.2': + dependencies: + '@codemirror/state': 6.5.2 + crelt: 1.0.6 + style-mod: 4.1.2 + w3c-keyname: 2.2.8 + + '@commitlint/cli@19.4.1(@types/node@22.5.2)(typescript@5.5.4)': + dependencies: + '@commitlint/format': 19.3.0 + '@commitlint/lint': 19.4.1 + '@commitlint/load': 19.4.0(@types/node@22.5.2)(typescript@5.5.4) + '@commitlint/read': 19.4.0 + '@commitlint/types': 19.0.3 + execa: 8.0.1 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - typescript + + '@commitlint/config-conventional@19.4.1': + dependencies: + '@commitlint/types': 19.0.3 + conventional-changelog-conventionalcommits: 7.0.2 + + '@commitlint/config-validator@19.0.3': + dependencies: + '@commitlint/types': 19.0.3 + ajv: 8.17.1 + + '@commitlint/ensure@19.0.3': + dependencies: + '@commitlint/types': 19.0.3 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 + + '@commitlint/execute-rule@19.0.0': {} + + '@commitlint/format@19.3.0': + dependencies: + '@commitlint/types': 19.0.3 + chalk: 5.3.0 + + '@commitlint/is-ignored@19.2.2': + dependencies: + '@commitlint/types': 19.0.3 + semver: 7.6.3 + + '@commitlint/lint@19.4.1': + dependencies: + '@commitlint/is-ignored': 19.2.2 + '@commitlint/parse': 19.0.3 + '@commitlint/rules': 19.4.1 + '@commitlint/types': 19.0.3 + + '@commitlint/load@19.4.0(@types/node@22.5.2)(typescript@5.5.4)': + dependencies: + '@commitlint/config-validator': 19.0.3 + '@commitlint/execute-rule': 19.0.0 + '@commitlint/resolve-extends': 19.1.0 + '@commitlint/types': 19.0.3 + chalk: 5.3.0 + cosmiconfig: 9.0.0(typescript@5.5.4) + cosmiconfig-typescript-loader: 5.0.0(@types/node@22.5.2)(cosmiconfig@9.0.0(typescript@5.5.4))(typescript@5.5.4) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + transitivePeerDependencies: + - '@types/node' + - typescript + + '@commitlint/message@19.0.0': {} + + '@commitlint/parse@19.0.3': + dependencies: + '@commitlint/types': 19.0.3 + conventional-changelog-angular: 7.0.0 + conventional-commits-parser: 5.0.0 + + '@commitlint/read@19.4.0': + dependencies: + '@commitlint/top-level': 19.0.0 + '@commitlint/types': 19.0.3 + execa: 8.0.1 + git-raw-commits: 4.0.0 + minimist: 1.2.8 + + '@commitlint/resolve-extends@19.1.0': + dependencies: + '@commitlint/config-validator': 19.0.3 + '@commitlint/types': 19.0.3 + global-directory: 4.0.1 + import-meta-resolve: 4.1.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + + '@commitlint/rules@19.4.1': + dependencies: + '@commitlint/ensure': 19.0.3 + '@commitlint/message': 19.0.0 + '@commitlint/to-lines': 19.0.0 + '@commitlint/types': 19.0.3 + execa: 8.0.1 + + '@commitlint/to-lines@19.0.0': {} + + '@commitlint/top-level@19.0.0': + dependencies: + find-up: 7.0.0 + + '@commitlint/types@19.0.3': + dependencies: + '@types/conventional-commits-parser': 5.0.0 + chalk: 5.3.0 + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + optional: true + + '@css-render/plugin-bem@0.15.14(css-render@0.15.14)': + dependencies: + css-render: 0.15.14 + + '@css-render/vue3-ssr@0.15.14(vue@3.4.38(typescript@5.5.4))': + dependencies: + vue: 3.4.38(typescript@5.5.4) + + '@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1)': + dependencies: + '@csstools/css-tokenizer': 3.0.1 + + '@csstools/css-tokenizer@3.0.1': {} + + '@csstools/media-query-list-parser@3.0.1(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.1(@csstools/css-tokenizer@3.0.1) + '@csstools/css-tokenizer': 3.0.1 + + '@csstools/selector-specificity@4.0.0(postcss-selector-parser@6.1.2)': + dependencies: + postcss-selector-parser: 6.1.2 + + '@dual-bundle/import-meta-resolve@4.1.0': {} + + '@emotion/hash@0.8.0': {} + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.23.1': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.23.1': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.23.1': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.23.1': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.23.1': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.23.1': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.23.1': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.23.1': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.23.1': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.23.1': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.23.1': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.23.1': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.23.1': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.23.1': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.23.1': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.23.1': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.23.1': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.23.1': + optional: true + + '@esbuild/openbsd-arm64@0.23.1': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.23.1': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.23.1': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.23.1': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.23.1': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.23.1': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))': + dependencies: + eslint: 9.9.1(jiti@1.21.6)(supports-color@8.1.1) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.11.0': {} + + '@eslint/config-array@0.18.0(supports-color@8.1.1)': + dependencies: + '@eslint/object-schema': 2.1.4 + debug: 4.3.6(supports-color@8.1.1) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/eslintrc@3.1.0(supports-color@8.1.1)': + dependencies: + ajv: 6.12.6 + debug: 4.3.6(supports-color@8.1.1) + espree: 10.1.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.9.1': {} + + '@eslint/object-schema@2.1.4': {} + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.0': {} + + '@intlify/core-base@11.4.13': + dependencies: + '@intlify/devtools-types': 11.4.13 + '@intlify/message-compiler': 11.4.13 + '@intlify/shared': 11.4.13 + + '@intlify/devtools-types@11.4.13': + dependencies: + '@intlify/core-base': 11.4.13 + '@intlify/shared': 11.4.13 + + '@intlify/message-compiler@11.4.13': + dependencies: + '@intlify/shared': 11.4.13 + source-map-js: 1.2.0 + + '@intlify/shared@11.4.13': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@istanbuljs/load-nyc-config@1.1.0': + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jest/console@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@types/node': 22.5.2 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + + '@jest/core@29.7.0(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4))': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0(supports-color@8.1.1) + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0(supports-color@8.1.1) + '@jest/types': 29.6.3 + '@types/node': 22.5.2 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@22.5.2)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0(supports-color@8.1.1) + jest-runner: 29.7.0(supports-color@8.1.1) + jest-runtime: 29.7.0(supports-color@8.1.1) + jest-snapshot: 29.7.0(supports-color@8.1.1) + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + '@jest/environment@29.7.0': + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.5.2 + jest-mock: 29.7.0 + + '@jest/expect-utils@29.7.0': + dependencies: + jest-get-type: 29.6.3 + + '@jest/expect@29.7.0(supports-color@8.1.1)': + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + '@jest/fake-timers@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 22.5.2 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + '@jest/globals@29.7.0(supports-color@8.1.1)': + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0(supports-color@8.1.1) + '@jest/types': 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/reporters@29.7.0(supports-color@8.1.1)': + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0(supports-color@8.1.1) + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + '@types/node': 22.5.2 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3(supports-color@8.1.1) + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1(supports-color@8.1.1) + istanbul-reports: 3.1.7 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.3.0 + transitivePeerDependencies: + - supports-color + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jest/source-map@29.6.3': + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + callsites: 3.1.0 + graceful-fs: 4.2.11 + + '@jest/test-result@29.7.0': + dependencies: + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + + '@jest/test-sequencer@29.7.0': + dependencies: + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 + + '@jest/transform@29.7.0(supports-color@8.1.1)': + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + babel-plugin-istanbul: 6.1.1(supports-color@8.1.1) + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.8 + pirates: 4.0.6 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 22.5.2 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/sourcemap-codec@1.6.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + optional: true + + '@juggle/resize-observer@3.4.0': {} + + '@lezer/common@0.16.1': {} + + '@lezer/common@1.2.3': {} + + '@lezer/highlight@0.16.0': + dependencies: + '@lezer/common': 0.16.1 + + '@lezer/highlight@1.2.1': + dependencies: + '@lezer/common': 1.2.3 + + '@lezer/lr@0.16.3': + dependencies: + '@lezer/common': 0.16.1 + + '@lezer/lr@1.4.2': + dependencies: + '@lezer/common': 1.2.3 + + '@lezer/yaml@1.0.3': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/highlight': 1.2.1 + '@lezer/lr': 1.4.2 + + '@marijn/find-cluster-break@1.0.2': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.1.1': {} + + '@rollup/plugin-virtual@3.0.2(rollup@4.21.2)': + optionalDependencies: + rollup: 4.21.2 + + '@rollup/pluginutils@4.2.1': + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + + '@rollup/pluginutils@5.1.0(rollup@4.21.2)': + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + optionalDependencies: + rollup: 4.21.2 + + '@rollup/rollup-android-arm-eabi@4.21.2': + optional: true + + '@rollup/rollup-android-arm64@4.21.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.21.2': + optional: true + + '@rollup/rollup-darwin-x64@4.21.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.21.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.21.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.21.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.21.2': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.21.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.21.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.21.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.21.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.21.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.21.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.21.2': + optional: true + + '@sinclair/typebox@0.27.8': {} + + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@10.3.0': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@swc/core-darwin-arm64@1.7.23': + optional: true + + '@swc/core-darwin-x64@1.7.23': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.7.23': + optional: true + + '@swc/core-linux-arm64-gnu@1.7.23': + optional: true + + '@swc/core-linux-arm64-musl@1.7.23': + optional: true + + '@swc/core-linux-x64-gnu@1.7.23': + optional: true + + '@swc/core-linux-x64-musl@1.7.23': + optional: true + + '@swc/core-win32-arm64-msvc@1.7.23': + optional: true + + '@swc/core-win32-ia32-msvc@1.7.23': + optional: true + + '@swc/core-win32-x64-msvc@1.7.23': + optional: true + + '@swc/core@1.7.23': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.12 + optionalDependencies: + '@swc/core-darwin-arm64': 1.7.23 + '@swc/core-darwin-x64': 1.7.23 + '@swc/core-linux-arm-gnueabihf': 1.7.23 + '@swc/core-linux-arm64-gnu': 1.7.23 + '@swc/core-linux-arm64-musl': 1.7.23 + '@swc/core-linux-x64-gnu': 1.7.23 + '@swc/core-linux-x64-musl': 1.7.23 + '@swc/core-win32-arm64-msvc': 1.7.23 + '@swc/core-win32-ia32-msvc': 1.7.23 + '@swc/core-win32-x64-msvc': 1.7.23 + + '@swc/counter@0.1.3': {} + + '@swc/types@0.1.12': + dependencies: + '@swc/counter': 0.1.3 + + '@tsconfig/node10@1.0.11': + optional: true + + '@tsconfig/node12@1.0.11': + optional: true + + '@tsconfig/node14@1.0.3': + optional: true + + '@tsconfig/node16@1.0.4': + optional: true + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.25.6 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.25.6 + + '@types/conventional-commits-parser@5.0.0': + dependencies: + '@types/node': 22.5.2 + + '@types/estree@1.0.5': {} + + '@types/fs-extra@11.0.4': + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 22.5.2 + + '@types/graceful-fs@4.1.9': + dependencies: + '@types/node': 22.5.2 + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/js-yaml@4.0.9': {} + + '@types/json-schema@7.0.15': + optional: true + + '@types/jsonfile@6.1.4': + dependencies: + '@types/node': 22.5.2 + + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.7 + + '@types/lodash@4.17.25': {} + + '@types/lodash@4.17.7': {} + + '@types/node@22.5.2': + dependencies: + undici-types: 6.19.8 + + '@types/quill@2.0.14': + dependencies: + parchment: 1.1.4 + quill-delta: 5.1.0 + + '@types/stack-utils@2.0.3': {} + + '@types/web-bluetooth@0.0.20': {} + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.33': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4)': + dependencies: + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 7.18.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4) + '@typescript-eslint/utils': 7.18.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 7.18.0 + eslint: 9.9.1(jiti@1.21.6)(supports-color@8.1.1) + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/eslint-plugin@8.4.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4)': + dependencies: + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 8.4.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 8.4.0 + '@typescript-eslint/type-utils': 8.4.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4) + '@typescript-eslint/utils': 8.4.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.4.0 + eslint: 9.9.1(jiti@1.21.6)(supports-color@8.1.1) + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.18.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(supports-color@8.1.1)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.3.6(supports-color@8.1.1) + eslint: 9.9.1(jiti@1.21.6)(supports-color@8.1.1) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/scope-manager': 8.4.0 + '@typescript-eslint/types': 8.4.0 + '@typescript-eslint/typescript-estree': 8.4.0(supports-color@8.1.1)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.4.0 + debug: 4.3.6(supports-color@8.1.1) + eslint: 9.9.1(jiti@1.21.6)(supports-color@8.1.1) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + + '@typescript-eslint/scope-manager@8.4.0': + dependencies: + '@typescript-eslint/types': 8.4.0 + '@typescript-eslint/visitor-keys': 8.4.0 + + '@typescript-eslint/type-utils@7.18.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/typescript-estree': 7.18.0(supports-color@8.1.1)(typescript@5.5.4) + '@typescript-eslint/utils': 7.18.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4) + debug: 4.3.6(supports-color@8.1.1) + eslint: 9.9.1(jiti@1.21.6)(supports-color@8.1.1) + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/type-utils@8.4.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/typescript-estree': 8.4.0(supports-color@8.1.1)(typescript@5.5.4) + '@typescript-eslint/utils': 8.4.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4) + debug: 4.3.6(supports-color@8.1.1) + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - eslint + - supports-color + + '@typescript-eslint/types@7.18.0': {} + + '@typescript-eslint/types@8.4.0': {} + + '@typescript-eslint/typescript-estree@7.18.0(supports-color@8.1.1)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.3.6(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@8.4.0(supports-color@8.1.1)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/types': 8.4.0 + '@typescript-eslint/visitor-keys': 8.4.0 + debug: 4.3.6(supports-color@8.1.1) + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@7.18.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1)) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(supports-color@8.1.1)(typescript@5.5.4) + eslint: 9.9.1(jiti@1.21.6)(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/utils@8.4.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1)) + '@typescript-eslint/scope-manager': 8.4.0 + '@typescript-eslint/types': 8.4.0 + '@typescript-eslint/typescript-estree': 8.4.0(supports-color@8.1.1)(typescript@5.5.4) + eslint: 9.9.1(jiti@1.21.6)(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + eslint-visitor-keys: 3.4.3 + + '@typescript-eslint/visitor-keys@8.4.0': + dependencies: + '@typescript-eslint/types': 8.4.0 + eslint-visitor-keys: 3.4.3 + + '@vicons/antd@0.12.0': {} + + '@vicons/ionicons5@0.12.0': {} + + '@vitejs/plugin-vue-jsx@4.0.1(supports-color@8.1.1)(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(terser@5.31.6))(vue@3.4.38(typescript@5.5.4))': + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.25.2(supports-color@8.1.1))(supports-color@8.1.1) + '@vue/babel-plugin-jsx': 1.2.2(@babel/core@7.25.2(supports-color@8.1.1))(supports-color@8.1.1) + vite: 5.4.2(@types/node@22.5.2)(less@4.2.0)(terser@5.31.6) + vue: 3.4.38(typescript@5.5.4) + transitivePeerDependencies: + - supports-color + + '@vitejs/plugin-vue@5.1.3(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(terser@5.31.6))(vue@3.4.38(typescript@5.5.4))': + dependencies: + vite: 5.4.2(@types/node@22.5.2)(less@4.2.0)(terser@5.31.6) + vue: 3.4.38(typescript@5.5.4) + + '@vue/babel-helper-vue-transform-on@1.2.2': {} + + '@vue/babel-plugin-jsx@1.2.2(@babel/core@7.25.2(supports-color@8.1.1))(supports-color@8.1.1)': + dependencies: + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2(supports-color@8.1.1)) + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.6(supports-color@8.1.1) + '@babel/types': 7.25.6 + '@vue/babel-helper-vue-transform-on': 1.2.2 + '@vue/babel-plugin-resolve-type': 1.2.2(@babel/core@7.25.2(supports-color@8.1.1)) + camelcase: 6.3.0 + html-tags: 3.3.1 + svg-tags: 1.0.0 + optionalDependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + '@vue/babel-plugin-resolve-type@1.2.2(@babel/core@7.25.2(supports-color@8.1.1))': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/parser': 7.25.6 + '@vue/compiler-sfc': 3.4.38 + + '@vue/compiler-core@3.4.38': + dependencies: + '@babel/parser': 7.25.6 + '@vue/shared': 3.4.38 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.0 + + '@vue/compiler-dom@3.4.38': + dependencies: + '@vue/compiler-core': 3.4.38 + '@vue/shared': 3.4.38 + + '@vue/compiler-sfc@3.4.38': + dependencies: + '@babel/parser': 7.25.6 + '@vue/compiler-core': 3.4.38 + '@vue/compiler-dom': 3.4.38 + '@vue/compiler-ssr': 3.4.38 + '@vue/shared': 3.4.38 + estree-walker: 2.0.2 + magic-string: 0.30.11 + postcss: 8.4.44 + source-map-js: 1.2.0 + + '@vue/compiler-ssr@3.4.38': + dependencies: + '@vue/compiler-dom': 3.4.38 + '@vue/shared': 3.4.38 + + '@vue/devtools-api@6.6.3': {} + + '@vue/eslint-config-typescript@13.0.0(eslint-plugin-vue@9.28.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1))(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4) + '@typescript-eslint/parser': 7.18.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4) + eslint: 9.9.1(jiti@1.21.6)(supports-color@8.1.1) + eslint-plugin-vue: 9.28.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1) + vue-eslint-parser: 9.4.3(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@vue/reactivity@3.4.38': + dependencies: + '@vue/shared': 3.4.38 + + '@vue/runtime-core@3.4.38': + dependencies: + '@vue/reactivity': 3.4.38 + '@vue/shared': 3.4.38 + + '@vue/runtime-dom@3.4.38': + dependencies: + '@vue/reactivity': 3.4.38 + '@vue/runtime-core': 3.4.38 + '@vue/shared': 3.4.38 + csstype: 3.1.3 + + '@vue/server-renderer@3.4.38(vue@3.4.38(typescript@5.5.4))': + dependencies: + '@vue/compiler-ssr': 3.4.38 + '@vue/shared': 3.4.38 + vue: 3.4.38(typescript@5.5.4) + + '@vue/shared@3.4.38': {} + + '@vueup/vue-quill@1.2.0(vue@3.4.38(typescript@5.5.4))': + dependencies: + quill: 1.3.7 + quill-delta: 4.2.2 + vue: 3.4.38(typescript@5.5.4) + + '@vueuse/core@11.0.3(vue@3.4.38(typescript@5.5.4))': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 11.0.3 + '@vueuse/shared': 11.0.3(vue@3.4.38(typescript@5.5.4)) + vue-demi: 0.14.10(vue@3.4.38(typescript@5.5.4)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/metadata@11.0.3': {} + + '@vueuse/shared@11.0.3(vue@3.4.38(typescript@5.5.4))': + dependencies: + vue-demi: 0.14.10(vue@3.4.38(typescript@5.5.4)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@webassemblyjs/ast@1.12.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + optional: true + + '@webassemblyjs/floating-point-hex-parser@1.11.6': + optional: true + + '@webassemblyjs/helper-api-error@1.11.6': + optional: true + + '@webassemblyjs/helper-buffer@1.12.1': + optional: true + + '@webassemblyjs/helper-numbers@1.11.6': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + optional: true + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': + optional: true + + '@webassemblyjs/helper-wasm-section@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.12.1 + optional: true + + '@webassemblyjs/ieee754@1.11.6': + dependencies: + '@xtuc/ieee754': 1.2.0 + optional: true + + '@webassemblyjs/leb128@1.11.6': + dependencies: + '@xtuc/long': 4.2.2 + optional: true + + '@webassemblyjs/utf8@1.11.6': + optional: true + + '@webassemblyjs/wasm-edit@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-opt': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/wast-printer': 1.12.1 + optional: true + + '@webassemblyjs/wasm-gen@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + optional: true + + '@webassemblyjs/wasm-opt@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + optional: true + + '@webassemblyjs/wasm-parser@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + optional: true + + '@webassemblyjs/wast-printer@1.12.1': + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@xtuc/long': 4.2.2 + optional: true + + '@xtuc/ieee754@1.2.0': + optional: true + + '@xtuc/long@4.2.2': + optional: true + + JSONStream@1.3.5: + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + + acorn-import-attributes@1.9.5(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + optional: true + + acorn-jsx@5.3.2(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + + acorn-walk@8.3.3: + dependencies: + acorn: 8.12.1 + optional: true + + acorn@8.12.1: {} + + acorn@8.19.0: {} + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + optional: true + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.1 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-escapes@7.0.0: + dependencies: + environment: 1.1.0 + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@4.1.3: + optional: true + + arg@5.0.2: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-ify@1.0.0: {} + + array-union@1.0.2: + dependencies: + array-uniq: 1.0.3 + + array-union@2.1.0: {} + + array-uniq@1.0.3: {} + + astral-regex@2.0.0: {} + + async-validator@4.2.5: {} + + async@3.2.6: {} + + asynckit@0.4.0: {} + + at-least-node@1.0.0: {} + + autoprefixer@10.4.20(postcss@8.4.44): + dependencies: + browserslist: 4.23.3 + caniuse-lite: 1.0.30001655 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.0 + postcss: 8.4.44 + postcss-value-parser: 4.2.0 + + axios@1.7.7(debug@4.3.6(supports-color@8.1.1)): + dependencies: + follow-redirects: 1.15.6(debug@4.3.6(supports-color@8.1.1)) + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + babel-jest@29.7.0(@babel/core@7.25.2(supports-color@8.1.1))(supports-color@8.1.1): + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@jest/transform': 29.7.0(supports-color@8.1.1) + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1(supports-color@8.1.1) + babel-preset-jest: 29.6.3(@babel/core@7.25.2(supports-color@8.1.1)) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-istanbul@6.1.1(supports-color@8.1.1): + dependencies: + '@babel/helper-plugin-utils': 7.24.8 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1(supports-color@8.1.1) + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-jest-hoist@29.6.3: + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.6 + + babel-preset-current-node-syntax@1.1.0(@babel/core@7.25.2(supports-color@8.1.1)): + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2(supports-color@8.1.1)) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.25.2(supports-color@8.1.1)) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2(supports-color@8.1.1)) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2(supports-color@8.1.1)) + '@babel/plugin-syntax-import-attributes': 7.25.6(@babel/core@7.25.2(supports-color@8.1.1)) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2(supports-color@8.1.1)) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2(supports-color@8.1.1)) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2(supports-color@8.1.1)) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2(supports-color@8.1.1)) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2(supports-color@8.1.1)) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2(supports-color@8.1.1)) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2(supports-color@8.1.1)) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2(supports-color@8.1.1)) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2(supports-color@8.1.1)) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2(supports-color@8.1.1)) + + babel-preset-jest@29.6.3(@babel/core@7.25.2(supports-color@8.1.1)): + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.2(supports-color@8.1.1)) + + balanced-match@1.0.2: {} + + balanced-match@2.0.0: {} + + base64-js@1.5.1: {} + + batch-processor@1.0.0: {} + + binary-extensions@2.3.0: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + blueimp-md5@2.19.0: {} + + boolbase@1.0.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.23.3: + dependencies: + caniuse-lite: 1.0.30001655 + electron-to-chromium: 1.5.13 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) + + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bundle-require@4.2.1(esbuild@0.23.1): + dependencies: + esbuild: 0.23.1 + load-tsconfig: 0.2.5 + + cachedir@2.3.0: {} + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + callsites@3.1.0: {} + + camel-case@4.1.2: + dependencies: + pascal-case: 3.1.2 + tslib: 2.7.0 + + camelcase-css@2.0.1: {} + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001655: {} + + capital-case@1.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.7.0 + upper-case-first: 2.0.2 + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.3.0: {} + + change-case@4.1.2: + dependencies: + camel-case: 4.1.2 + capital-case: 1.0.4 + constant-case: 3.0.4 + dot-case: 3.0.4 + header-case: 2.0.4 + no-case: 3.0.4 + param-case: 3.0.4 + pascal-case: 3.1.2 + path-case: 3.0.4 + sentence-case: 3.0.4 + snake-case: 3.0.4 + tslib: 2.7.0 + + char-regex@1.0.2: {} + + chardet@0.7.0: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chrome-trace-event@1.0.4: + optional: true + + ci-info@3.9.0: {} + + cjs-module-lexer@1.4.0: {} + + clean-css@5.3.3: + dependencies: + source-map: 0.6.1 + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-spinners@2.9.2: {} + + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.2.0 + + cli-width@3.0.0: {} + + clipboard@2.0.11: + dependencies: + good-listener: 1.2.2 + select: 1.1.2 + tiny-emitter: 2.1.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone@1.0.4: {} + + clone@2.1.2: {} + + co@4.6.0: {} + + codemirror@6.0.2: + dependencies: + '@codemirror/autocomplete': 6.18.7 + '@codemirror/commands': 6.8.1 + '@codemirror/language': 6.11.3 + '@codemirror/lint': 6.8.5 + '@codemirror/search': 6.5.11 + '@codemirror/state': 6.5.2 + '@codemirror/view': 6.38.2 + + collect-v8-coverage@1.0.2: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + colord@2.9.3: {} + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@11.0.0: {} + + commander@12.1.0: {} + + commander@2.20.3: {} + + commander@4.1.1: {} + + commander@8.3.0: {} + + commitizen@4.3.0(@types/node@22.5.2)(typescript@5.5.4): + dependencies: + cachedir: 2.3.0 + cz-conventional-changelog: 3.3.0(@types/node@22.5.2)(typescript@5.5.4) + dedent: 0.7.0 + detect-indent: 6.1.0 + find-node-modules: 2.1.3 + find-root: 1.1.0 + fs-extra: 9.1.0 + glob: 7.2.3 + inquirer: 8.2.5 + is-utf8: 0.2.1 + lodash: 4.17.21 + minimist: 1.2.7 + strip-bom: 4.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - '@types/node' + - typescript + + commondir@1.0.1: {} + + compare-func@2.0.0: + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + + concat-map@0.0.1: {} + + confbox@0.1.7: {} + + confbox@0.1.8: {} + + confbox@0.3.1: {} + + connect-history-api-fallback@1.6.0: {} + + connect@3.7.0(supports-color@8.1.1): + dependencies: + debug: 2.6.9(supports-color@8.1.1) + finalhandler: 1.1.2(supports-color@8.1.1) + parseurl: 1.3.3 + utils-merge: 1.0.1 + transitivePeerDependencies: + - supports-color + + consola@2.15.3: {} + + console@0.7.2: {} + + constant-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.7.0 + upper-case: 2.0.2 + + conventional-changelog-angular@7.0.0: + dependencies: + compare-func: 2.0.0 + + conventional-changelog-conventionalcommits@7.0.2: + dependencies: + compare-func: 2.0.0 + + conventional-commit-types@3.0.0: {} + + conventional-commits-parser@5.0.0: + dependencies: + JSONStream: 1.3.5 + is-text-path: 2.0.0 + meow: 12.1.1 + split2: 4.2.0 + + convert-source-map@2.0.0: {} + + copy-anything@2.0.6: + dependencies: + is-what: 3.14.1 + + core-js@3.38.1: {} + + cosmiconfig-typescript-loader@5.0.0(@types/node@22.5.2)(cosmiconfig@9.0.0(typescript@5.5.4))(typescript@5.5.4): + dependencies: + '@types/node': 22.5.2 + cosmiconfig: 9.0.0(typescript@5.5.4) + jiti: 1.21.6 + typescript: 5.5.4 + + cosmiconfig@9.0.0(typescript@5.5.4): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.5.4 + + create-jest@29.7.0(@types/node@22.5.2)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4)): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@22.5.2)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + create-require@1.1.1: + optional: true + + crelt@1.0.6: {} + + cross-env@7.0.3: + dependencies: + cross-spawn: 7.0.3 + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-js@4.2.0: {} + + css-functions-list@3.2.2: {} + + css-render@0.15.14: + dependencies: + '@emotion/hash': 0.8.0 + csstype: 3.0.11 + + css-select@4.3.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.0 + + css-what@6.1.0: {} + + cssesc@3.0.0: {} + + csstype@3.0.11: {} + + csstype@3.1.3: {} + + cz-conventional-changelog@3.3.0(@types/node@22.5.2)(typescript@5.5.4): + dependencies: + chalk: 2.4.2 + commitizen: 4.3.0(@types/node@22.5.2)(typescript@5.5.4) + conventional-commit-types: 3.0.0 + lodash.map: 4.6.0 + longest: 2.0.1 + word-wrap: 1.2.5 + optionalDependencies: + '@commitlint/load': 19.4.0(@types/node@22.5.2)(typescript@5.5.4) + transitivePeerDependencies: + - '@types/node' + - typescript + + dargs@8.1.0: {} + + date-fns-tz@3.2.0(date-fns@4.4.0): + dependencies: + date-fns: 4.4.0 + + date-fns@3.6.0: {} + + date-fns@4.4.0: {} + + debug@2.6.9(supports-color@8.1.1): + dependencies: + ms: 2.0.0 + optionalDependencies: + supports-color: 8.1.1 + + debug@4.3.6(supports-color@8.1.1): + dependencies: + ms: 2.1.2 + optionalDependencies: + supports-color: 8.1.1 + + dedent@0.7.0: {} + + dedent@1.5.3: {} + + deep-equal@1.1.2: + dependencies: + is-arguments: 1.1.1 + is-date-object: 1.0.5 + is-regex: 1.1.4 + object-is: 1.1.6 + object-keys: 1.1.1 + regexp.prototype.flags: 1.5.2 + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + delayed-stream@1.0.0: {} + + delegate@3.2.0: {} + + detect-file@1.0.0: {} + + detect-indent@6.1.0: {} + + detect-newline@3.1.0: {} + + didyoumean@1.2.2: {} + + diff-sequences@29.6.3: {} + + diff@4.0.2: + optional: true + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dlv@1.1.3: {} + + dom-serializer@1.4.1: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + domelementtype@2.3.0: {} + + domhandler@4.3.1: + dependencies: + domelementtype: 2.3.0 + + domutils@2.8.0: + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.7.0 + + dot-prop@5.3.0: + dependencies: + is-obj: 2.0.0 + + dotenv-expand@8.0.3: {} + + dotenv@16.4.5: {} + + eastasianwidth@0.2.0: {} + + echarts@5.5.1: + dependencies: + tslib: 2.3.0 + zrender: 5.6.0 + + ee-first@1.1.1: {} + + ejs@3.1.10: + dependencies: + jake: 10.9.2 + + electron-to-chromium@1.5.13: {} + + element-resize-detector@1.2.4: + dependencies: + batch-processor: 1.0.0 + + email-addresses@5.0.0: {} + + emittery@0.13.1: {} + + emoji-regex@10.4.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encodeurl@1.0.2: {} + + enhanced-resolve@5.17.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + optional: true + + entities@2.2.0: {} + + entities@4.5.0: {} + + env-paths@2.2.1: {} + + environment@1.1.0: {} + + errno@0.1.8: + dependencies: + prr: 1.0.1 + optional: true + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + es-module-lexer@0.9.3: {} + + es-module-lexer@1.5.4: + optional: true + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.23.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@2.0.0: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-config-prettier@9.1.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1)): + dependencies: + eslint: 9.9.1(jiti@1.21.6)(supports-color@8.1.1) + + eslint-define-config@2.1.0: {} + + eslint-plugin-jest@28.8.2(@typescript-eslint/eslint-plugin@8.4.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(jest@29.7.0(@types/node@22.5.2)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4)))(supports-color@8.1.1)(typescript@5.5.4): + dependencies: + '@typescript-eslint/utils': 8.4.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4) + eslint: 9.9.1(jiti@1.21.6)(supports-color@8.1.1) + optionalDependencies: + '@typescript-eslint/eslint-plugin': 8.4.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1)(typescript@5.5.4) + jest: 29.7.0(@types/node@22.5.2)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4)) + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1)))(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(prettier@3.3.3): + dependencies: + eslint: 9.9.1(jiti@1.21.6)(supports-color@8.1.1) + prettier: 3.3.3 + prettier-linter-helpers: 1.0.0 + synckit: 0.9.1 + optionalDependencies: + eslint-config-prettier: 9.1.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1)) + + eslint-plugin-vue@9.28.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1): + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1)) + eslint: 9.9.1(jiti@1.21.6)(supports-color@8.1.1) + globals: 13.24.0 + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.1.2 + semver: 7.6.3 + vue-eslint-parser: 9.4.3(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1) + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - supports-color + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + optional: true + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-scope@8.0.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.0.0: {} + + eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1): + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1)) + '@eslint-community/regexpp': 4.11.0 + '@eslint/config-array': 0.18.0(supports-color@8.1.1) + '@eslint/eslintrc': 3.1.0(supports-color@8.1.1) + '@eslint/js': 9.9.1 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.3.0 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.6(supports-color@8.1.1) + escape-string-regexp: 4.0.0 + eslint-scope: 8.0.2 + eslint-visitor-keys: 4.0.0 + espree: 10.1.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + optionalDependencies: + jiti: 1.21.6 + transitivePeerDependencies: + - supports-color + + esno@4.7.0: + dependencies: + tsx: 4.19.0 + + espree@10.1.0: + dependencies: + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 4.0.0 + + espree@9.6.1: + dependencies: + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 3.4.3 + + esprima@4.0.1: {} + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: + optional: true + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.5 + + esutils@2.0.3: {} + + eventemitter3@2.0.3: {} + + eventemitter3@5.0.1: {} + + events@3.3.0: + optional: true + + evtd@0.2.4: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + exit@0.1.2: {} + + expand-tilde@2.0.2: + dependencies: + homedir-polyfill: 1.0.3 + + expect@29.7.0: + dependencies: + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + + exsolve@1.1.3: {} + + extend@3.0.2: {} + + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + fast-deep-equal@3.1.3: {} + + fast-diff@1.1.2: {} + + fast-diff@1.2.0: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.0.1: {} + + fastest-levenshtein@1.0.16: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + + fdir@6.5.0(picomatch@4.0.7): + optionalDependencies: + picomatch: 4.0.7 + + figures@3.2.0: + dependencies: + escape-string-regexp: 1.0.5 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + file-entry-cache@9.1.0: + dependencies: + flat-cache: 5.0.0 + + filelist@1.0.4: + dependencies: + minimatch: 5.1.6 + + filename-reserved-regex@2.0.0: {} + + filenamify@4.3.0: + dependencies: + filename-reserved-regex: 2.0.0 + strip-outer: 1.0.1 + trim-repeated: 1.0.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.1.2(supports-color@8.1.1): + dependencies: + debug: 2.6.9(supports-color@8.1.1) + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.5.0 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-cache-dir@3.3.2: + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + + find-node-modules@2.1.3: + dependencies: + findup-sync: 4.0.0 + merge: 2.1.1 + + find-root@1.1.0: {} + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + find-up@7.0.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 + + findup-sync@4.0.0: + dependencies: + detect-file: 1.0.0 + is-glob: 4.0.3 + micromatch: 4.0.8 + resolve-dir: 1.0.1 + + fingerprintjs2@2.1.4: {} + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + + flat-cache@5.0.0: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + + flatted@3.3.1: {} + + follow-redirects@1.15.6(debug@4.3.6(supports-color@8.1.1)): + optionalDependencies: + debug: 4.3.6(supports-color@8.1.1) + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + fraction.js@4.3.7: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-extra@11.2.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-extra@9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + functions-have-names@1.2.3: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.2.0: {} + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + get-package-type@0.1.0: {} + + get-stream@6.0.1: {} + + get-stream@8.0.1: {} + + get-tsconfig@4.8.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + gh-pages@6.1.1: + dependencies: + async: 3.2.6 + commander: 11.0.0 + email-addresses: 5.0.0 + filenamify: 4.3.0 + find-cache-dir: 3.3.2 + fs-extra: 11.2.0 + globby: 6.1.0 + + git-raw-commits@4.0.0: + dependencies: + dargs: 8.1.0 + meow: 12.1.1 + split2: 4.2.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob-to-regexp@0.4.1: + optional: true + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 + + glob@11.0.0: + dependencies: + foreground-child: 3.3.0 + jackspeak: 4.0.1 + minimatch: 10.0.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 2.0.0 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global-directory@4.0.1: + dependencies: + ini: 4.1.1 + + global-modules@1.0.0: + dependencies: + global-prefix: 1.0.2 + is-windows: 1.0.2 + resolve-dir: 1.0.1 + + global-modules@2.0.0: + dependencies: + global-prefix: 3.0.0 + + global-prefix@1.0.2: + dependencies: + expand-tilde: 2.0.2 + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 1.0.2 + which: 1.3.1 + + global-prefix@3.0.0: + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + + globals@11.12.0: {} + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globals@14.0.0: {} + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + globby@6.1.0: + dependencies: + array-union: 1.0.2 + glob: 7.2.3 + object-assign: 4.1.1 + pify: 2.3.0 + pinkie-promise: 2.0.1 + + globjoin@0.1.4: {} + + good-listener@1.2.2: + dependencies: + delegate: 3.2.0 + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.0.3 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + header-case@2.0.4: + dependencies: + capital-case: 1.0.4 + tslib: 2.7.0 + + highlight.js@11.10.0: {} + + homedir-polyfill@1.0.3: + dependencies: + parse-passwd: 1.0.0 + + html-escaper@2.0.2: {} + + html-minifier-terser@6.1.0: + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 8.3.0 + he: 1.2.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.31.6 + + html-tags@3.3.1: {} + + human-signals@2.1.0: {} + + human-signals@5.0.0: {} + + husky@9.1.5: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + optional: true + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + image-size@0.5.5: + optional: true + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + import-meta-resolve@4.1.0: {} + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + ini@4.1.1: {} + + inquirer@8.2.5: + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + wrap-ansi: 7.0.0 + + is-arguments@1.1.1: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-arrayish@0.2.1: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-core-module@2.15.1: + dependencies: + hasown: 2.0.2 + + is-date-object@1.0.5: + dependencies: + has-tostringtag: 1.0.2 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-fullwidth-code-point@4.0.0: {} + + is-fullwidth-code-point@5.0.0: + dependencies: + get-east-asian-width: 1.2.0 + + is-generator-fn@2.1.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-interactive@1.0.0: {} + + is-number@7.0.0: {} + + is-obj@2.0.0: {} + + is-path-inside@3.0.3: {} + + is-plain-object@5.0.0: {} + + is-regex@1.1.4: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + + is-text-path@2.0.0: + dependencies: + text-extensions: 2.4.0 + + is-unicode-supported@0.1.0: {} + + is-utf8@0.2.1: {} + + is-what@3.14.1: {} + + is-windows@1.0.2: {} + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-instrument@5.2.1(supports-color@8.1.1): + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/parser': 7.25.6 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + istanbul-lib-instrument@6.0.3(supports-color@8.1.1): + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/parser': 7.25.6 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@4.0.1(supports-color@8.1.1): + dependencies: + debug: 4.3.6(supports-color@8.1.1) + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jackspeak@4.0.1: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jake@10.9.2: + dependencies: + async: 3.2.6 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + + jest-changed-files@29.7.0: + dependencies: + execa: 5.1.1 + jest-util: 29.7.0 + p-limit: 3.1.0 + + jest-circus@29.7.0(supports-color@8.1.1): + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0(supports-color@8.1.1) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.5.2 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.5.3 + is-generator-fn: 2.1.0 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0(supports-color@8.1.1) + jest-snapshot: 29.7.0(supports-color@8.1.1) + jest-util: 29.7.0 + p-limit: 3.1.0 + pretty-format: 29.7.0 + pure-rand: 6.1.0 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-cli@29.7.0(@types/node@22.5.2)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4)): + dependencies: + '@jest/core': 29.7.0(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4)) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@22.5.2)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4)) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@22.5.2)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest-config@29.7.0(@types/node@22.5.2)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4)): + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.25.2(supports-color@8.1.1))(supports-color@8.1.1) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0(supports-color@8.1.1) + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0(supports-color@8.1.1) + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 22.5.2 + ts-node: 10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-docblock@29.7.0: + dependencies: + detect-newline: 3.1.0 + + jest-each@29.7.0: + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 + + jest-environment-node@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.5.2 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + jest-get-type@29.6.3: {} + + jest-haste-map@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 22.5.2 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.8 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + + jest-leak-detector@29.7.0: + dependencies: + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-matcher-utils@29.7.0: + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-message-util@29.7.0: + dependencies: + '@babel/code-frame': 7.24.7 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-mock@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 22.5.2 + jest-util: 29.7.0 + + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + optionalDependencies: + jest-resolve: 29.7.0 + + jest-regex-util@29.6.3: {} + + jest-resolve-dependencies@29.7.0(supports-color@8.1.1): + dependencies: + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + jest-resolve@29.7.0: + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.8 + resolve.exports: 2.0.2 + slash: 3.0.0 + + jest-runner@29.7.0(supports-color@8.1.1): + dependencies: + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0(supports-color@8.1.1) + '@jest/types': 29.6.3 + '@types/node': 22.5.2 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0(supports-color@8.1.1) + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + + jest-runtime@29.7.0(supports-color@8.1.1): + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0(supports-color@8.1.1) + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0(supports-color@8.1.1) + '@jest/types': 29.6.3 + '@types/node': 22.5.2 + chalk: 4.1.2 + cjs-module-lexer: 1.4.0 + collect-v8-coverage: 1.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0(supports-color@8.1.1) + jest-util: 29.7.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + + jest-snapshot@29.7.0(supports-color@8.1.1): + dependencies: + '@babel/core': 7.25.2(supports-color@8.1.1) + '@babel/generator': 7.25.6 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2(supports-color@8.1.1)) + '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.25.2(supports-color@8.1.1)) + '@babel/types': 7.25.6 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0(supports-color@8.1.1) + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.2(supports-color@8.1.1)) + chalk: 4.1.2 + expect: 29.7.0 + graceful-fs: 4.2.11 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + natural-compare: 1.4.0 + pretty-format: 29.7.0 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 22.5.2 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + + jest-validate@29.7.0: + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + + jest-watcher@29.7.0: + dependencies: + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.5.2 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.7.0 + string-length: 4.0.2 + + jest-worker@27.5.1: + dependencies: + '@types/node': 22.5.2 + merge-stream: 2.0.0 + supports-color: 8.1.1 + optional: true + + jest-worker@29.7.0: + dependencies: + '@types/node': 22.5.2 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest@29.7.0(@types/node@22.5.2)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4)): + dependencies: + '@jest/core': 29.7.0(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4)) + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@22.5.2)(supports-color@8.1.1)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4)) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jiti@1.21.6: {} + + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@2.5.2: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonparse@1.3.1: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@6.0.3: {} + + kleur@3.0.3: {} + + known-css-properties@0.34.0: {} + + less-loader@12.2.0(less@4.2.0)(webpack@5.94.0(@swc/core@1.7.23)(esbuild@0.23.1)): + dependencies: + less: 4.2.0 + optionalDependencies: + webpack: 5.94.0(@swc/core@1.7.23)(esbuild@0.23.1) + + less@4.2.0: + dependencies: + copy-anything: 2.0.6 + parse-node-version: 1.0.1 + tslib: 2.7.0 + optionalDependencies: + errno: 0.1.8 + graceful-fs: 4.2.11 + image-size: 0.5.5 + make-dir: 2.1.0 + mime: 1.6.0 + needle: 3.3.1 + source-map: 0.6.1 + + leven@3.1.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lilconfig@2.1.0: {} + + lilconfig@3.1.2: {} + + lines-and-columns@1.2.4: {} + + lint-staged@15.2.10(supports-color@8.1.1): + dependencies: + chalk: 5.3.0 + commander: 12.1.0 + debug: 4.3.6(supports-color@8.1.1) + execa: 8.0.1 + lilconfig: 3.1.2 + listr2: 8.2.4 + micromatch: 4.0.8 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.5.0 + transitivePeerDependencies: + - supports-color + + listr2@8.2.4: + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.0 + + load-tsconfig@0.2.5: {} + + loader-runner@4.3.0: + optional: true + + local-pkg@0.5.0: + dependencies: + mlly: 1.7.1 + pkg-types: 1.2.0 + + local-pkg@1.2.1: + dependencies: + mlly: 1.8.2 + pkg-types: 2.3.3 + quansync: 0.2.11 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + + lodash-es@4.17.21: {} + + lodash.camelcase@4.3.0: {} + + lodash.clonedeep@4.5.0: {} + + lodash.isequal@4.5.0: {} + + lodash.isplainobject@4.0.6: {} + + lodash.kebabcase@4.1.1: {} + + lodash.map@4.6.0: {} + + lodash.merge@4.6.2: {} + + lodash.mergewith@4.6.2: {} + + lodash.snakecase@4.1.1: {} + + lodash.startcase@4.4.0: {} + + lodash.truncate@4.4.2: {} + + lodash.uniq@4.5.0: {} + + lodash.upperfirst@4.3.1: {} + + lodash@4.17.21: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + log-update@6.1.0: + dependencies: + ansi-escapes: 7.0.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + + longest@2.0.1: {} + + lower-case@2.0.2: + dependencies: + tslib: 2.7.0 + + lru-cache@10.4.3: {} + + lru-cache@11.0.0: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.25.9: + dependencies: + sourcemap-codec: 1.4.8 + + magic-string@0.30.11: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + + make-dir@2.1.0: + dependencies: + pify: 4.0.1 + semver: 5.7.2 + optional: true + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + + make-dir@4.0.0: + dependencies: + semver: 7.6.3 + + make-error@1.3.6: + optional: true + + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + + mathml-tag-names@2.1.3: {} + + mdn-data@2.0.30: {} + + meow@12.1.1: {} + + meow@13.2.0: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + merge@2.1.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: + optional: true + + mimic-fn@2.1.0: {} + + mimic-fn@4.0.0: {} + + mimic-function@5.0.1: {} + + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.7: {} + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + mint-filter@4.0.3: {} + + mitt@3.0.1: {} + + mlly@1.7.1: + dependencies: + acorn: 8.12.1 + pathe: 1.1.2 + pkg-types: 1.2.0 + ufo: 1.5.4 + + mlly@1.8.2: + dependencies: + acorn: 8.19.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 + + mockjs@1.1.0: + dependencies: + commander: 12.1.0 + + mri@1.2.0: {} + + ms@2.0.0: {} + + ms@2.1.2: {} + + mute-stream@0.0.8: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + naive-ui@2.45.3(vue@3.4.38(typescript@5.5.4)): + dependencies: + '@css-render/plugin-bem': 0.15.14(css-render@0.15.14) + '@css-render/vue3-ssr': 0.15.14(vue@3.4.38(typescript@5.5.4)) + '@types/lodash': 4.17.25 + '@types/lodash-es': 4.17.12 + async-validator: 4.2.5 + css-render: 0.15.14 + csstype: 3.1.3 + date-fns: 4.4.0 + date-fns-tz: 3.2.0(date-fns@4.4.0) + evtd: 0.2.4 + highlight.js: 11.10.0 + lodash: 4.17.21 + lodash-es: 4.17.21 + seemly: 0.3.10 + treemate: 0.3.11 + vdirs: 0.1.8(vue@3.4.38(typescript@5.5.4)) + vooks: 0.2.12(vue@3.4.38(typescript@5.5.4)) + vue: 3.4.38(typescript@5.5.4) + vueuc: 0.4.66(vue@3.4.38(typescript@5.5.4)) + + nanoid@3.3.7: {} + + natural-compare@1.4.0: {} + + needle@3.3.1: + dependencies: + iconv-lite: 0.6.3 + sax: 1.4.1 + optional: true + + neo-async@2.6.2: + optional: true + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.7.0 + + node-html-parser@5.4.2: + dependencies: + css-select: 4.3.0 + he: 1.2.0 + + node-int64@0.4.0: {} + + node-releases@2.0.18: {} + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + normalize-url@4.5.1: {} + + npm-check-updates@17.1.1: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + object-inspect@1.13.2: {} + + object-is@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + + object-keys@1.1.1: {} + + on-finished@2.3.0: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + + os-tmpdir@1.0.2: {} + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-limit@4.0.0: + dependencies: + yocto-queue: 1.1.1 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + + p-try@2.2.0: {} + + package-json-from-dist@1.0.0: {} + + param-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.7.0 + + parchment@1.1.4: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.24.7 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-node-version@1.0.1: {} + + parse-passwd@1.0.0: {} + + parseurl@1.3.3: {} + + pascal-case@3.1.2: + dependencies: + no-case: 3.0.4 + tslib: 2.7.0 + + path-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.7.0 + + path-exists@4.0.0: {} + + path-exists@5.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-scurry@2.0.0: + dependencies: + lru-cache: 11.0.0 + minipass: 7.1.2 + + path-to-regexp@6.2.2: {} + + path-type@4.0.0: {} + + pathe@0.2.0: {} + + pathe@1.1.2: {} + + pathe@2.0.3: {} + + picocolors@1.1.0: {} + + picomatch@2.3.1: {} + + picomatch@3.0.1: {} + + picomatch@4.0.7: {} + + pidtree@0.6.0: {} + + pify@2.3.0: {} + + pify@4.0.1: + optional: true + + pinia@2.2.2(typescript@5.5.4)(vue@3.4.38(typescript@5.5.4)): + dependencies: + '@vue/devtools-api': 6.6.3 + vue: 3.4.38(typescript@5.5.4) + vue-demi: 0.14.10(vue@3.4.38(typescript@5.5.4)) + optionalDependencies: + typescript: 5.5.4 + + pinkie-promise@2.0.1: + dependencies: + pinkie: 2.0.4 + + pinkie@2.0.4: {} + + pinyin-pro@3.24.2: {} + + pirates@4.0.6: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + pkg-types@1.2.0: + dependencies: + confbox: 0.1.7 + mlly: 1.7.1 + pathe: 1.1.2 + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 + + pkg-types@2.3.3: + dependencies: + confbox: 0.3.1 + exsolve: 1.1.3 + pathe: 2.0.3 + + postcss-import@15.1.0(postcss@8.4.44): + dependencies: + postcss: 8.4.44 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + + postcss-js@4.0.1(postcss@8.4.44): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.44 + + postcss-load-config@4.0.2(postcss@8.4.44)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4)): + dependencies: + lilconfig: 3.1.2 + yaml: 2.5.0 + optionalDependencies: + postcss: 8.4.44 + ts-node: 10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4) + + postcss-media-query-parser@0.2.3: {} + + postcss-nested@6.2.0(postcss@8.4.44): + dependencies: + postcss: 8.4.44 + postcss-selector-parser: 6.1.2 + + postcss-resolve-nested-selector@0.1.6: {} + + postcss-safe-parser@7.0.0(postcss@8.4.44): + dependencies: + postcss: 8.4.44 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-sorting@8.0.2(postcss@8.4.44): + dependencies: + postcss: 8.4.44 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.44: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.0 + source-map-js: 1.2.0 + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier@3.3.3: {} + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + pretty-quick@4.0.0(prettier@3.3.3): + dependencies: + execa: 5.1.1 + find-up: 5.0.0 + ignore: 5.3.2 + mri: 1.2.0 + picocolors: 1.1.0 + picomatch: 3.0.1 + prettier: 3.3.3 + tslib: 2.7.0 + + print-js@1.6.0: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + proxy-from-env@1.1.0: {} + + prr@1.0.1: + optional: true + + punycode@2.3.1: {} + + pure-rand@6.1.0: {} + + qrcode.vue@3.4.1(vue@3.4.38(typescript@5.5.4)): + dependencies: + vue: 3.4.38(typescript@5.5.4) + + qs@6.13.0: + dependencies: + side-channel: 1.0.6 + + quansync@0.2.11: {} + + queue-microtask@1.2.3: {} + + quill-delta@3.6.3: + dependencies: + deep-equal: 1.1.2 + extend: 3.0.2 + fast-diff: 1.1.2 + + quill-delta@4.2.2: + dependencies: + fast-diff: 1.2.0 + lodash.clonedeep: 4.5.0 + lodash.isequal: 4.5.0 + + quill-delta@5.1.0: + dependencies: + fast-diff: 1.3.0 + lodash.clonedeep: 4.5.0 + lodash.isequal: 4.5.0 + + quill-image-uploader@1.3.0(quill@1.3.7): + dependencies: + quill: 1.3.7 + + quill-magic-url@4.2.0: + dependencies: + '@types/quill': 2.0.14 + normalize-url: 4.5.1 + quill-delta: 3.6.3 + + quill@1.3.7: + dependencies: + clone: 2.1.2 + deep-equal: 1.1.2 + eventemitter3: 2.0.3 + extend: 3.0.2 + parchment: 1.1.4 + quill-delta: 3.6.3 + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + optional: true + + react-is@18.3.1: {} + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + regexp.prototype.flags@1.5.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + + relateurl@0.2.7: {} + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-dir@1.0.1: + dependencies: + expand-tilde: 2.0.2 + global-modules: 1.0.0 + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve.exports@2.0.2: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.15.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + reusify@1.0.4: {} + + rfdc@1.4.1: {} + + rimraf@6.0.1: + dependencies: + glob: 11.0.0 + package-json-from-dist: 1.0.0 + + rollup@4.21.2: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.21.2 + '@rollup/rollup-android-arm64': 4.21.2 + '@rollup/rollup-darwin-arm64': 4.21.2 + '@rollup/rollup-darwin-x64': 4.21.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.2 + '@rollup/rollup-linux-arm-musleabihf': 4.21.2 + '@rollup/rollup-linux-arm64-gnu': 4.21.2 + '@rollup/rollup-linux-arm64-musl': 4.21.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.2 + '@rollup/rollup-linux-riscv64-gnu': 4.21.2 + '@rollup/rollup-linux-s390x-gnu': 4.21.2 + '@rollup/rollup-linux-x64-gnu': 4.21.2 + '@rollup/rollup-linux-x64-musl': 4.21.2 + '@rollup/rollup-win32-arm64-msvc': 4.21.2 + '@rollup/rollup-win32-ia32-msvc': 4.21.2 + '@rollup/rollup-win32-x64-msvc': 4.21.2 + fsevents: 2.3.3 + + run-async@2.4.1: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rxjs@7.8.1: + dependencies: + tslib: 2.7.0 + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + sax@1.4.1: + optional: true + + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + optional: true + + scule@1.3.0: {} + + seemly@0.3.10: {} + + seemly@0.3.8: {} + + select@1.1.2: {} + + semver@5.7.2: + optional: true + + semver@6.3.1: {} + + semver@7.6.3: {} + + sentence-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.7.0 + upper-case-first: 2.0.2 + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + optional: true + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel@1.0.6: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + sisteransi@1.0.5: {} + + slash@3.0.0: {} + + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + slice-ansi@5.0.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + + slice-ansi@7.1.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + + snake-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.7.0 + + sortablejs@1.14.0: {} + + source-map-js@1.2.0: {} + + source-map-support@0.5.13: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + sourcemap-codec@1.4.8: {} + + spark-md5@3.0.2: {} + + split2@4.2.0: {} + + sprintf-js@1.0.3: {} + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + + statuses@1.5.0: {} + + string-argv@0.3.2: {} + + string-length@4.0.2: + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.4.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-bom@4.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-final-newline@3.0.0: {} + + strip-json-comments@3.1.1: {} + + strip-literal@3.1.0: + dependencies: + js-tokens: 9.0.1 + + strip-outer@1.0.1: + dependencies: + escape-string-regexp: 1.0.5 + + style-mod@4.1.2: {} + + stylelint-config-prettier@9.0.5(stylelint@16.9.0(supports-color@8.1.1)(typescript@5.5.4)): + dependencies: + stylelint: 16.9.0(supports-color@8.1.1)(typescript@5.5.4) + + stylelint-config-recommended@14.0.1(stylelint@16.9.0(supports-color@8.1.1)(typescript@5.5.4)): + dependencies: + stylelint: 16.9.0(supports-color@8.1.1)(typescript@5.5.4) + + stylelint-config-standard@36.0.1(stylelint@16.9.0(supports-color@8.1.1)(typescript@5.5.4)): + dependencies: + stylelint: 16.9.0(supports-color@8.1.1)(typescript@5.5.4) + stylelint-config-recommended: 14.0.1(stylelint@16.9.0(supports-color@8.1.1)(typescript@5.5.4)) + + stylelint-order@6.0.4(stylelint@16.9.0(supports-color@8.1.1)(typescript@5.5.4)): + dependencies: + postcss: 8.4.44 + postcss-sorting: 8.0.2(postcss@8.4.44) + stylelint: 16.9.0(supports-color@8.1.1)(typescript@5.5.4) + + stylelint-scss@6.5.1(stylelint@16.9.0(supports-color@8.1.1)(typescript@5.5.4)): + dependencies: + css-tree: 2.3.1 + is-plain-object: 5.0.0 + known-css-properties: 0.34.0 + postcss-media-query-parser: 0.2.3 + postcss-resolve-nested-selector: 0.1.6 + postcss-selector-parser: 6.1.2 + postcss-value-parser: 4.2.0 + stylelint: 16.9.0(supports-color@8.1.1)(typescript@5.5.4) + + stylelint@16.9.0(supports-color@8.1.1)(typescript@5.5.4): + dependencies: + '@csstools/css-parser-algorithms': 3.0.1(@csstools/css-tokenizer@3.0.1) + '@csstools/css-tokenizer': 3.0.1 + '@csstools/media-query-list-parser': 3.0.1(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1) + '@csstools/selector-specificity': 4.0.0(postcss-selector-parser@6.1.2) + '@dual-bundle/import-meta-resolve': 4.1.0 + balanced-match: 2.0.0 + colord: 2.9.3 + cosmiconfig: 9.0.0(typescript@5.5.4) + css-functions-list: 3.2.2 + css-tree: 2.3.1 + debug: 4.3.6(supports-color@8.1.1) + fast-glob: 3.3.2 + fastest-levenshtein: 1.0.16 + file-entry-cache: 9.1.0 + global-modules: 2.0.0 + globby: 11.1.0 + globjoin: 0.1.4 + html-tags: 3.3.1 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-plain-object: 5.0.0 + known-css-properties: 0.34.0 + mathml-tag-names: 2.1.3 + meow: 13.2.0 + micromatch: 4.0.8 + normalize-path: 3.0.0 + picocolors: 1.1.0 + postcss: 8.4.44 + postcss-resolve-nested-selector: 0.1.6 + postcss-safe-parser: 7.0.0(postcss@8.4.44) + postcss-selector-parser: 6.1.2 + postcss-value-parser: 4.2.0 + resolve-from: 5.0.0 + string-width: 4.2.3 + strip-ansi: 7.1.0 + supports-hyperlinks: 3.1.0 + svg-tags: 1.0.0 + table: 6.8.2 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + - typescript + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-hyperlinks@3.1.0: + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svg-tags@1.0.0: {} + + synckit@0.9.1: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.7.0 + + table@6.8.2: + dependencies: + ajv: 8.17.1 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + tailwindcss@3.4.10(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4)): + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.6 + lilconfig: 2.1.0 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.0 + postcss: 8.4.44 + postcss-import: 15.1.0(postcss@8.4.44) + postcss-js: 4.0.1(postcss@8.4.44) + postcss-load-config: 4.0.2(postcss@8.4.44)(ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4)) + postcss-nested: 6.2.0(postcss@8.4.44) + postcss-selector-parser: 6.1.2 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + tapable@2.2.1: + optional: true + + terser-webpack-plugin@5.3.10(@swc/core@1.7.23)(esbuild@0.23.1)(webpack@5.94.0(@swc/core@1.7.23)(esbuild@0.23.1)): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.31.6 + webpack: 5.94.0(@swc/core@1.7.23)(esbuild@0.23.1) + optionalDependencies: + '@swc/core': 1.7.23 + esbuild: 0.23.1 + optional: true + + terser@5.31.6: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.12.1 + commander: 2.20.3 + source-map-support: 0.5.21 + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + + text-extensions@2.4.0: {} + + text-table@0.2.0: {} + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + throttle-debounce@5.0.2: {} + + through@2.3.8: {} + + tiny-emitter@2.1.0: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + tmpl@1.0.5: {} + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + treemate@0.3.11: {} + + trim-repeated@1.0.0: + dependencies: + escape-string-regexp: 1.0.5 + + ts-api-utils@1.3.0(typescript@5.5.4): + dependencies: + typescript: 5.5.4 + + ts-interface-checker@0.1.13: {} + + ts-node@10.9.2(@swc/core@1.7.23)(@types/node@22.5.2)(typescript@5.5.4): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.5.2 + acorn: 8.12.1 + acorn-walk: 8.3.3 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.5.4 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.7.23 + optional: true + + tslib@2.3.0: {} + + tslib@2.7.0: {} + + tsx@4.19.0: + dependencies: + esbuild: 0.23.1 + get-tsconfig: 4.8.0 + optionalDependencies: + fsevents: 2.3.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-detect@4.0.8: {} + + type-fest@0.20.2: {} + + type-fest@0.21.3: {} + + typescript@5.5.4: {} + + ufo@1.5.4: {} + + ufo@1.6.4: {} + + undici-types@6.19.8: {} + + unicorn-magic@0.1.0: {} + + unimport@5.7.0: + dependencies: + acorn: 8.19.0 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + local-pkg: 1.2.1 + magic-string: 0.30.21 + mlly: 1.8.2 + pathe: 2.0.3 + picomatch: 4.0.7 + pkg-types: 2.3.3 + scule: 1.3.0 + strip-literal: 3.1.0 + tinyglobby: 0.2.17 + unplugin: 2.3.11 + unplugin-utils: 0.3.2 + + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + unplugin-auto-import@20.3.0(@vueuse/core@11.0.3(vue@3.4.38(typescript@5.5.4))): + dependencies: + local-pkg: 1.2.1 + magic-string: 0.30.21 + picomatch: 4.0.7 + unimport: 5.7.0 + unplugin: 2.3.11 + unplugin-utils: 0.3.2 + optionalDependencies: + '@vueuse/core': 11.0.3(vue@3.4.38(typescript@5.5.4)) + + unplugin-utils@0.3.2: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.7 + + unplugin-vue-components@0.27.4(@babel/parser@7.25.6)(rollup@4.21.2)(supports-color@8.1.1)(vue@3.4.38(typescript@5.5.4)): + dependencies: + '@antfu/utils': 0.7.10 + '@rollup/pluginutils': 5.1.0(rollup@4.21.2) + chokidar: 3.6.0 + debug: 4.3.6(supports-color@8.1.1) + fast-glob: 3.3.2 + local-pkg: 0.5.0 + magic-string: 0.30.11 + minimatch: 9.0.5 + mlly: 1.7.1 + unplugin: 1.12.3 + vue: 3.4.38(typescript@5.5.4) + optionalDependencies: + '@babel/parser': 7.25.6 + transitivePeerDependencies: + - rollup + - supports-color + + unplugin@1.12.3: + dependencies: + acorn: 8.12.1 + webpack-sources: 3.2.3 + webpack-virtual-modules: 0.6.2 + + unplugin@2.3.11: + dependencies: + '@jridgewell/remapping': 2.3.5 + acorn: 8.19.0 + picomatch: 4.0.7 + webpack-virtual-modules: 0.6.2 + + update-browserslist-db@1.1.0(browserslist@4.23.3): + dependencies: + browserslist: 4.23.3 + escalade: 3.2.0 + picocolors: 1.1.0 + + upper-case-first@2.0.2: + dependencies: + tslib: 2.7.0 + + upper-case@2.0.2: + dependencies: + tslib: 2.7.0 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + utils-merge@1.0.1: {} + + uuid@10.0.0: {} + + v8-compile-cache-lib@3.0.1: + optional: true + + v8-to-istanbul@9.3.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + + vdirs@0.1.8(vue@3.4.38(typescript@5.5.4)): + dependencies: + evtd: 0.2.4 + vue: 3.4.38(typescript@5.5.4) + + vfonts@0.0.3: {} + + vite-plugin-compression@0.5.1(supports-color@8.1.1)(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(terser@5.31.6)): + dependencies: + chalk: 4.1.2 + debug: 4.3.6(supports-color@8.1.1) + fs-extra: 10.1.0 + vite: 5.4.2(@types/node@22.5.2)(less@4.2.0)(terser@5.31.6) + transitivePeerDependencies: + - supports-color + + vite-plugin-html@3.2.2(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(terser@5.31.6)): + dependencies: + '@rollup/pluginutils': 4.2.1 + colorette: 2.0.20 + connect-history-api-fallback: 1.6.0 + consola: 2.15.3 + dotenv: 16.4.5 + dotenv-expand: 8.0.3 + ejs: 3.1.10 + fast-glob: 3.3.2 + fs-extra: 10.1.0 + html-minifier-terser: 6.1.0 + node-html-parser: 5.4.2 + pathe: 0.2.0 + vite: 5.4.2(@types/node@22.5.2)(less@4.2.0)(terser@5.31.6) + + vite-plugin-mock@3.0.2(esbuild@0.23.1)(mockjs@1.1.0)(supports-color@8.1.1)(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(terser@5.31.6)): + dependencies: + bundle-require: 4.2.1(esbuild@0.23.1) + chokidar: 3.6.0 + connect: 3.7.0(supports-color@8.1.1) + debug: 4.3.6(supports-color@8.1.1) + esbuild: 0.23.1 + fast-glob: 3.3.2 + mockjs: 1.1.0 + path-to-regexp: 6.2.2 + picocolors: 1.1.0 + vite: 5.4.2(@types/node@22.5.2)(less@4.2.0)(terser@5.31.6) + transitivePeerDependencies: + - supports-color + + vite-plugin-require-transform@1.0.21(supports-color@8.1.1): + dependencies: + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/traverse': 7.25.6(supports-color@8.1.1) + '@babel/types': 7.25.6 + transitivePeerDependencies: + - supports-color + + vite-plugin-style-import@2.0.0(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(terser@5.31.6)): + dependencies: + '@rollup/pluginutils': 4.2.1 + change-case: 4.1.2 + console: 0.7.2 + es-module-lexer: 0.9.3 + fs-extra: 10.1.0 + magic-string: 0.25.9 + pathe: 0.2.0 + vite: 5.4.2(@types/node@22.5.2)(less@4.2.0)(terser@5.31.6) + + vite-plugin-top-level-await@1.4.4(rollup@4.21.2)(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(terser@5.31.6)): + dependencies: + '@rollup/plugin-virtual': 3.0.2(rollup@4.21.2) + '@swc/core': 1.7.23 + uuid: 10.0.0 + vite: 5.4.2(@types/node@22.5.2)(less@4.2.0)(terser@5.31.6) + transitivePeerDependencies: + - '@swc/helpers' + - rollup + + vite-plugin-vue-setup-extend@0.4.0(vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(terser@5.31.6)): + dependencies: + '@vue/compiler-sfc': 3.4.38 + magic-string: 0.25.9 + vite: 5.4.2(@types/node@22.5.2)(less@4.2.0)(terser@5.31.6) + + vite@5.4.2(@types/node@22.5.2)(less@4.2.0)(terser@5.31.6): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.44 + rollup: 4.21.2 + optionalDependencies: + '@types/node': 22.5.2 + fsevents: 2.3.3 + less: 4.2.0 + terser: 5.31.6 + + vooks@0.2.12(vue@3.4.38(typescript@5.5.4)): + dependencies: + evtd: 0.2.4 + vue: 3.4.38(typescript@5.5.4) + + vue-demi@0.14.10(vue@3.4.38(typescript@5.5.4)): + dependencies: + vue: 3.4.38(typescript@5.5.4) + + vue-draggable-next@2.2.1(sortablejs@1.14.0)(vue@3.4.38(typescript@5.5.4)): + dependencies: + sortablejs: 1.14.0 + vue: 3.4.38(typescript@5.5.4) + + vue-eslint-parser@9.4.3(eslint@9.9.1(jiti@1.21.6)(supports-color@8.1.1))(supports-color@8.1.1): + dependencies: + debug: 4.3.6(supports-color@8.1.1) + eslint: 9.9.1(jiti@1.21.6)(supports-color@8.1.1) + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + lodash: 4.17.21 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + + vue-i18n@11.4.13(vue@3.4.38(typescript@5.5.4)): + dependencies: + '@intlify/core-base': 11.4.13 + '@intlify/devtools-types': 11.4.13 + '@intlify/shared': 11.4.13 + '@vue/devtools-api': 6.6.3 + vue: 3.4.38(typescript@5.5.4) + + vue-router@4.4.3(vue@3.4.38(typescript@5.5.4)): + dependencies: + '@vue/devtools-api': 6.6.3 + vue: 3.4.38(typescript@5.5.4) + + vue-types@5.1.3(vue@3.4.38(typescript@5.5.4)): + dependencies: + is-plain-object: 5.0.0 + optionalDependencies: + vue: 3.4.38(typescript@5.5.4) + + vue-waterfall-plugin-next@2.6.0: {} + + vue3-json-viewer@2.4.1(vue@3.4.38(typescript@5.5.4)): + dependencies: + clipboard: 2.0.11 + vue: 3.4.38(typescript@5.5.4) + + vue@3.4.38(typescript@5.5.4): + dependencies: + '@vue/compiler-dom': 3.4.38 + '@vue/compiler-sfc': 3.4.38 + '@vue/runtime-dom': 3.4.38 + '@vue/server-renderer': 3.4.38(vue@3.4.38(typescript@5.5.4)) + '@vue/shared': 3.4.38 + optionalDependencies: + typescript: 5.5.4 + + vuedraggable@4.1.0(vue@3.4.38(typescript@5.5.4)): + dependencies: + sortablejs: 1.14.0 + vue: 3.4.38(typescript@5.5.4) + + vueuc@0.4.66(vue@3.4.38(typescript@5.5.4)): + dependencies: + '@css-render/vue3-ssr': 0.15.14(vue@3.4.38(typescript@5.5.4)) + '@juggle/resize-observer': 3.4.0 + css-render: 0.15.14 + evtd: 0.2.4 + seemly: 0.3.8 + vdirs: 0.1.8(vue@3.4.38(typescript@5.5.4)) + vooks: 0.2.12(vue@3.4.38(typescript@5.5.4)) + vue: 3.4.38(typescript@5.5.4) + + w3c-keyname@2.2.8: {} + + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + + watchpack@2.4.2: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + optional: true + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + webpack-sources@3.2.3: {} + + webpack-virtual-modules@0.6.2: {} + + webpack@5.94.0(@swc/core@1.7.23)(esbuild@0.23.1): + dependencies: + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.12.1 + acorn-import-attributes: 1.9.5(acorn@8.12.1) + browserslist: 4.23.3 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.1 + es-module-lexer: 1.5.4 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(@swc/core@1.7.23)(esbuild@0.23.1)(webpack@5.94.0(@swc/core@1.7.23)(esbuild@0.23.1)) + watchpack: 2.4.2 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + optional: true + + weixin-js-sdk@1.6.5: {} + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + write-file-atomic@4.0.2: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + + write-file-atomic@5.0.1: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + + xml-name-validator@4.0.0: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yaml@2.5.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yn@3.1.1: + optional: true + + yocto-queue@0.1.0: {} + + yocto-queue@1.1.1: {} + + zrender@5.6.0: + dependencies: + tslib: 2.3.0 diff --git a/web/pnpm-workspace.yaml b/web/pnpm-workspace.yaml new file mode 100644 index 0000000..2fa1171 --- /dev/null +++ b/web/pnpm-workspace.yaml @@ -0,0 +1,5 @@ +allowBuilds: + '@swc/core': set this to true or false + core-js: set this to true or false + esbuild: set this to true or false + vue-demi: set this to true or false diff --git a/web/postcss.config.cjs b/web/postcss.config.cjs new file mode 100644 index 0000000..12a703d --- /dev/null +++ b/web/postcss.config.cjs @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/web/prettier.config.cjs b/web/prettier.config.cjs new file mode 100644 index 0000000..b4e993a --- /dev/null +++ b/web/prettier.config.cjs @@ -0,0 +1,20 @@ +module.exports = { + printWidth: 100, + tabWidth: 2, + useTabs: false, + semi: true, + vueIndentScriptAndStyle: true, + singleQuote: true, + quoteProps: 'as-needed', + bracketSpacing: true, + trailingComma: 'es5', + jsxBracketSameLine: false, + jsxSingleQuote: false, + arrowParens: 'always', + insertPragma: false, + requirePragma: false, + proseWrap: 'never', + htmlWhitespaceSensitivity: 'strict', + endOfLine: 'auto', + rangeStart: 0, +}; diff --git a/web/public/favicon.ico b/web/public/favicon.ico new file mode 100644 index 0000000..96de823 Binary files /dev/null and b/web/public/favicon.ico differ diff --git a/web/src/App.vue b/web/src/App.vue new file mode 100644 index 0000000..d8e9d32 --- /dev/null +++ b/web/src/App.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/web/src/api/addons/.gitkeep b/web/src/api/addons/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/web/src/api/addons/hgexample/comp/index.ts b/web/src/api/addons/hgexample/comp/index.ts new file mode 100644 index 0000000..f76dfdd --- /dev/null +++ b/web/src/api/addons/hgexample/comp/index.ts @@ -0,0 +1,13 @@ +import { http } from '@/utils/http/axios'; +import type { UploadFileParams } from '@/utils/http/axios/types'; + +// 导入Excel +export function ImportExcel(params: UploadFileParams) { + return http.uploadFile( + { + url: '/hgexample/comp/importExcel', + method: 'post', + }, + params + ); +} diff --git a/web/src/api/addons/hgexample/config/index.ts b/web/src/api/addons/hgexample/config/index.ts new file mode 100644 index 0000000..1a75e20 --- /dev/null +++ b/web/src/api/addons/hgexample/config/index.ts @@ -0,0 +1,17 @@ +import { http } from '@/utils/http/axios'; + +export function getConfig(params) { + return http.request({ + url: '/hgexample/config/get', + method: 'get', + params, + }); +} + +export function updateConfig(params) { + return http.request({ + url: '/hgexample/config/update', + method: 'post', + params, + }); +} diff --git a/web/src/api/addons/hgexample/table/index.ts b/web/src/api/addons/hgexample/table/index.ts new file mode 100644 index 0000000..2234f50 --- /dev/null +++ b/web/src/api/addons/hgexample/table/index.ts @@ -0,0 +1,68 @@ +import { http, jumpExport } from '@/utils/http/axios'; + +// 列表 +export function List(params) { + return http.request({ + url: '/hgexample/table/list', + method: 'get', + params, + }); +} + +// 删除/批量删除 +export function Delete(params) { + return http.request({ + url: '/hgexample/table/delete', + method: 'POST', + params, + }); +} + +// 添加/编辑 +export function Edit(params) { + return http.request({ + url: '/hgexample/table/edit', + method: 'POST', + params, + }); +} + +// 修改状态 +export function Status(params) { + return http.request({ + url: '/hgexample/table/status', + method: 'POST', + params, + }); +} + +// 操作开关 +export function Switch(params) { + return http.request({ + url: '/hgexample/table/switch', + method: 'POST', + params, + }); +} + +// 详情 +export function View(params) { + return http.request({ + url: '/hgexample/table/view', + method: 'GET', + params, + }); +} + +// 获取最大排序 +export function MaxSort() { + return http.request({ + url: '/hgexample/table/maxSort', + method: 'GET', + }); +} + +// 导出 +export function Export(params) { + jumpExport('/hgexample/table/export', params); +} diff --git a/web/src/api/addons/hgexample/tenantOrder/index.ts b/web/src/api/addons/hgexample/tenantOrder/index.ts new file mode 100644 index 0000000..4499ef3 --- /dev/null +++ b/web/src/api/addons/hgexample/tenantOrder/index.ts @@ -0,0 +1,42 @@ +import { http, jumpExport } from '@/utils/http/axios'; + +// 获取多租户功能演示列表 +export function List(params) { + return http.request({ + url: '/hgexample/tenantOrder/list', + method: 'get', + params, + }); +} + +// 删除/批量删除多租户功能演示 +export function Delete(params) { + return http.request({ + url: '/hgexample/tenantOrder/delete', + method: 'POST', + params, + }); +} + +// 添加/编辑多租户功能演示 +export function Edit(params) { + return http.request({ + url: '/hgexample/tenantOrder/edit', + method: 'POST', + params, + }); +} + +// 获取多租户功能演示指定详情 +export function View(params) { + return http.request({ + url: '/hgexample/tenantOrder/view', + method: 'GET', + params, + }); +} + +// 导出多租户功能演示 +export function Export(params) { + jumpExport('/hgexample/tenantOrder/export', params); +} \ No newline at end of file diff --git a/web/src/api/addons/hgexample/treeTable/index.ts b/web/src/api/addons/hgexample/treeTable/index.ts new file mode 100644 index 0000000..cd3e226 --- /dev/null +++ b/web/src/api/addons/hgexample/treeTable/index.ts @@ -0,0 +1,76 @@ +import { http, jumpExport } from '@/utils/http/axios'; + +// 列表 +export function List(params) { + return http.request({ + url: '/hgexample/treeTable/list', + method: 'get', + params, + }); +} + +// 删除/批量删除 +export function Delete(params) { + return http.request({ + url: '/hgexample/treeTable/delete', + method: 'POST', + params, + }); +} + +// 添加/编辑 +export function Edit(params) { + return http.request({ + url: '/hgexample/treeTable/edit', + method: 'POST', + params, + }); +} + +// 修改状态 +export function Status(params) { + return http.request({ + url: '/hgexample/treeTable/status', + method: 'POST', + params, + }); +} + +// 操作开关 +export function Switch(params) { + return http.request({ + url: '/hgexample/treeTable/switch', + method: 'POST', + params, + }); +} + +// 详情 +export function View(params) { + return http.request({ + url: '/hgexample/treeTable/view', + method: 'GET', + params, + }); +} + +// 获取最大排序 +export function MaxSort() { + return http.request({ + url: '/hgexample/treeTable/maxSort', + method: 'GET', + }); +} + +// 树形选项 +export function Select() { + return http.request({ + url: '/hgexample/treeTable/select', + method: 'get', + }); +} + +// 导出 +export function Export(params) { + jumpExport('/hgexample/treeTable/export', params); +} diff --git a/web/src/api/appMember/index.ts b/web/src/api/appMember/index.ts new file mode 100644 index 0000000..9190fd6 --- /dev/null +++ b/web/src/api/appMember/index.ts @@ -0,0 +1,27 @@ +import { http } from '@/utils/http/axios'; + +const request = (url: string, method: 'get' | 'POST', params?: any) => http.request({ url, method, params }); + +export const List = (params) => request('/appMember/list', 'get', params); +export const View = (params) => request('/appMember/view', 'get', params); +export const Edit = (params) => request('/appMember/edit', 'POST', params); +export const Delete = (params) => request('/appMember/delete', 'POST', params); +export const AutoDispatch = (params) => request('/appMember/autoDispatch', 'POST', params); +export const Category = (params) => request('/appMember/category', 'POST', params); +export const PaymentList = (params) => request('/appMember/paymentList', 'get', params); +export const PaymentEdit = (params) => request('/appMember/paymentEdit', 'POST', params); +export const PaymentDelete = (params) => request('/appMember/paymentDelete', 'POST', params); +export const AddressList = (params) => request('/appMember/addressList', 'get', params); +export const AddressEdit = (params) => request('/appMember/addressEdit', 'POST', params); +export const AddressDelete = (params) => request('/appMember/addressDelete', 'POST', params); +export const Sensitive = (params) => request('/appMember/sensitive', 'POST', params); +export const Team = (params) => request('/appMember/team', 'get', params); +export const StatusRequest = (params) => request('/appMember/statusRequest', 'POST', params); +export const StatusExecute = (params) => request('/appMember/statusExecute', 'POST', params); +export const WalletList = (params) => request('/appMember/walletList', 'get', params); +export const LedgerList = (params) => request('/appMember/ledgerList', 'get', params); +export const WalletRequest = (params) => request('/appMember/walletRequest', 'POST', params); +export const WalletExecute = (params) => request('/appMember/walletExecute', 'POST', params); +export const NoticeList = (params) => request('/appMember/noticeList', 'get', params); +export const NoticeEdit = (params) => request('/appMember/noticeEdit', 'POST', params); +export const NoticeRevoke = (params) => request('/appMember/noticeRevoke', 'POST', params); diff --git a/web/src/api/apply/attachment.ts b/web/src/api/apply/attachment.ts new file mode 100644 index 0000000..7a21eef --- /dev/null +++ b/web/src/api/apply/attachment.ts @@ -0,0 +1,58 @@ +import { http } from '@/utils/http/axios'; + +export function List(params) { + return http.request({ + url: '/attachment/list', + method: 'get', + params, + }); +} + +export function Delete(params) { + return http.request({ + url: '/attachment/delete', + method: 'POST', + params, + }); +} + +export function Edit(params) { + return http.request({ + url: '/attachment/edit', + method: 'POST', + params, + }); +} + +export function Status(params) { + return http.request({ + url: '/attachment/status', + method: 'POST', + params, + }); +} + +export function View(params) { + return http.request({ + url: '/attachment/view', + method: 'GET', + params, + }); +} + +export function ClearKind(params) { + return http.request({ + url: '/attachment/clearKind', + method: 'POST', + params, + }); +} + +// 链接图片转存 +export function ImageTransferStorage(params) { + return http.request({ + url: '/upload/imageTransferStorage', + method: 'POST', + params, + }); +} diff --git a/web/src/api/apply/notice.ts b/web/src/api/apply/notice.ts new file mode 100644 index 0000000..dc7851c --- /dev/null +++ b/web/src/api/apply/notice.ts @@ -0,0 +1,104 @@ +import { http } from '@/utils/http/axios'; + +export function List(params) { + return http.request({ + url: '/notice/list', + method: 'get', + params, + }); +} + +export function Delete(params) { + return http.request({ + url: '/notice/delete', + method: 'POST', + params, + }); +} + +export function Edit(params) { + return http.request({ + url: '/notice/edit', + method: 'POST', + params, + }); +} + +export function Status(params) { + return http.request({ + url: '/notice/status', + method: 'POST', + params, + }); +} + +export function View(params) { + return http.request({ + url: '/notice/view', + method: 'GET', + params, + }); +} + +// 获取最大排序 +export function MaxSort() { + return http.request({ + url: '/notice/maxSort', + method: 'GET', + }); +} + +export function EditNotify(params) { + return http.request({ + url: '/notice/editNotify', + method: 'POST', + params, + }); +} + +export function EditNotice(params) { + return http.request({ + url: '/notice/editNotice', + method: 'POST', + params, + }); +} + +export function EditLetter(params) { + return http.request({ + url: '/notice/editLetter', + method: 'POST', + params, + }); +} + +export function ReadAll(params) { + return http.request({ + url: '/notice/readAll', + method: 'POST', + params, + }); +} + +export function PullMessages() { + return http.request({ + url: '/notice/pullMessages', + method: 'get', + }); +} + +export function UpRead(params) { + return http.request({ + url: '/notice/upRead', + method: 'POST', + params, + }); +} + +export function MessageList(params) { + return http.request({ + url: '/notice/messageList', + method: 'get', + params, + }); +} diff --git a/web/src/api/apply/provinces.ts b/web/src/api/apply/provinces.ts new file mode 100644 index 0000000..8a710a0 --- /dev/null +++ b/web/src/api/apply/provinces.ts @@ -0,0 +1,103 @@ +import { http } from '@/utils/http/axios'; + +export function List(params) { + return http.request({ + url: '/provinces/list', + method: 'get', + params, + }); +} + +export function Delete(params) { + return http.request({ + url: '/provinces/delete', + method: 'POST', + params, + }); +} + +export function Edit(params) { + return http.request({ + url: '/provinces/edit', + method: 'POST', + params, + }); +} + +export function Status(params) { + return http.request({ + url: '/provinces/status', + method: 'POST', + params, + }); +} + +export function View(params) { + return http.request({ + url: '/provinces/view', + method: 'GET', + params, + }); +} + +// 获取最大排序 +export function MaxSort() { + return http.request({ + url: '/provinces/maxSort', + method: 'GET', + }); +} + +/** + * 获取省市区关系树选项列表 + */ +export function getProvincesTree() { + return http.request({ + url: '/provinces/tree', + method: 'GET', + }); +} + +/** + * 获取省市区下级列表 + */ +export function getProvincesChildrenList(params) { + return http.request({ + url: '/provinces/childrenList', + method: 'GET', + params, + }); +} + +/** + * 唯一省市区ID + */ +export function CheckProvincesUniqueId(params) { + return http.request({ + url: '/provinces/uniqueId', + method: 'GET', + params, + }); +} + +/** + * 省市区选项 + */ +export function ProvincesSelect(params) { + return http.request({ + url: '/provinces/select', + method: 'GET', + params, + }); +} + +/** + * 获取指定城市标签 + */ +export function GetCityLabel(params) { + return http.request({ + url: '/provinces/cityLabel', + method: 'GET', + params, + }); +} diff --git a/web/src/api/base/index.ts b/web/src/api/base/index.ts new file mode 100644 index 0000000..c1f2982 --- /dev/null +++ b/web/src/api/base/index.ts @@ -0,0 +1,47 @@ +import { http } from '@/utils/http/axios'; +import { useUserStoreWidthOut } from '@/store/modules/user'; +import type { UploadFileParams } from '@/utils/http/axios/types'; + +// 获取验证码 +export function GetCaptcha() { + return http.request({ + url: '/site/captcha', + method: 'get', + }); +} + +// 上传图片 +export function UploadImage(params) { + const useUserStore = useUserStoreWidthOut(); + const headers = { + Authorization: useUserStore.token, + uploadType: 'default', + 'Content-Type': 'multipart/form-data', + }; + return http.request({ + url: '/upload/file', + method: 'post', + params, + headers, + }); +} + +// 检查文件分片 +export function CheckMultipart(params) { + return http.request({ + url: '/upload/checkMultipart', + method: 'post', + params, + }); +} + +// 分片上传 +export function UploadPart(params: UploadFileParams) { + return http.uploadFile( + { + url: '/upload/uploadPart', + method: 'post', + }, + params + ); +} diff --git a/web/src/api/cash/index.ts b/web/src/api/cash/index.ts new file mode 100644 index 0000000..7c45fa4 --- /dev/null +++ b/web/src/api/cash/index.ts @@ -0,0 +1,41 @@ +import { http } from '@/utils/http/axios'; + +export function List(params) { + return http.request({ + url: '/cash/list', + method: 'get', + params, + }); +} + +export function Edit(params) { + return http.request({ + url: '/cash/edit', + method: 'POST', + params, + }); +} + +export function View(params) { + return http.request({ + url: '/cash/view', + method: 'GET', + params, + }); +} + +export function Apply(params) { + return http.request({ + url: '/cash/apply', + method: 'POST', + params, + }); +} + +export function Payment(params) { + return http.request({ + url: '/cash/payment', + method: 'POST', + params, + }); +} diff --git a/web/src/api/creditsLog/index.ts b/web/src/api/creditsLog/index.ts new file mode 100644 index 0000000..5333e6a --- /dev/null +++ b/web/src/api/creditsLog/index.ts @@ -0,0 +1,23 @@ +import { http, jumpExport } from '@/utils/http/axios'; + +// 获取资产变动列表 +export function List(params) { + return http.request({ + url: '/creditsLog/list', + method: 'get', + params, + }); +} + +// 导出资产变动 +export function Export(params) { + jumpExport('/creditsLog/export', params); +} + +// 获取变动状态选项 +export function Option() { + return http.request({ + url: '/creditsLog/option', + method: 'GET', + }); +} diff --git a/web/src/api/curdDemo/index.ts b/web/src/api/curdDemo/index.ts new file mode 100644 index 0000000..7ef3e2d --- /dev/null +++ b/web/src/api/curdDemo/index.ts @@ -0,0 +1,68 @@ +import { http, jumpExport } from '@/utils/http/axios'; + +// 获取CURD列表列表 +export function List(params) { + return http.request({ + url: '/curdDemo/list', + method: 'get', + params, + }); +} + +// 删除/批量删除CURD列表 +export function Delete(params) { + return http.request({ + url: '/curdDemo/delete', + method: 'POST', + params, + }); +} + +// 添加/编辑CURD列表 +export function Edit(params) { + return http.request({ + url: '/curdDemo/edit', + method: 'POST', + params, + }); +} + +// 修改CURD列表状态 +export function Status(params) { + return http.request({ + url: '/curdDemo/status', + method: 'POST', + params, + }); +} + +// 操作CURD列表开关 +export function Switch(params) { + return http.request({ + url: '/curdDemo/switch', + method: 'POST', + params, + }); +} + +// 获取CURD列表指定详情 +export function View(params) { + return http.request({ + url: '/curdDemo/view', + method: 'GET', + params, + }); +} + +// 获取CURD列表最大排序 +export function MaxSort() { + return http.request({ + url: '/curdDemo/maxSort', + method: 'GET', + }); +} + +// 导出CURD列表 +export function Export(params) { + jumpExport('/curdDemo/export', params); +} \ No newline at end of file diff --git a/web/src/api/dashboard/console.ts b/web/src/api/dashboard/console.ts new file mode 100644 index 0000000..bdd66c5 --- /dev/null +++ b/web/src/api/dashboard/console.ts @@ -0,0 +1,17 @@ +import { http } from '@/utils/http/axios'; + +//获取主控台信息 +export function getConsoleInfo() { + return http.request({ + url: '/console/stat', + method: 'get', + }); +} + +export function getDashboardSummary(params) { + return http.request({ + url: '/dashboard/summary', + method: 'get', + params, + }); +} diff --git a/web/src/api/develop/addons.ts b/web/src/api/develop/addons.ts new file mode 100644 index 0000000..e78d8bd --- /dev/null +++ b/web/src/api/develop/addons.ts @@ -0,0 +1,57 @@ +import { http } from '@/utils/http/axios'; + +export function List(params) { + return http.request({ + url: '/addons/list', + method: 'get', + params, + }); +} + +export function View(params) { + return http.request({ + url: '/addons/view', + method: 'GET', + params, + }); +} + +export function Status(params) { + return http.request({ + url: '/addons/status', + method: 'POST', + params, + }); +} + +export function Build(params) { + return http.request({ + url: '/addons/build', + method: 'post', + params, + }); +} + +export function Install(params) { + return http.request({ + url: '/addons/install', + method: 'post', + params, + }); +} + +export function Upgrade(params) { + return http.request({ + url: '/addons/upgrade', + method: 'post', + params, + }); +} + +export function UnInstall(params) { + return http.request({ + url: '/addons/uninstall', + method: 'post', + params, + }); +} diff --git a/web/src/api/develop/code.ts b/web/src/api/develop/code.ts new file mode 100644 index 0000000..e6d5e93 --- /dev/null +++ b/web/src/api/develop/code.ts @@ -0,0 +1,87 @@ +import { http } from '@/utils/http/axios'; + +export function List(params) { + return http.request({ + url: '/genCodes/list', + method: 'get', + params, + }); +} +export function Delete(params) { + return http.request({ + url: '/genCodes/delete', + method: 'POST', + params, + }); +} + +export function View(params) { + return http.request({ + url: '/genCodes/view', + method: 'GET', + params, + }); +} + +export function Edit(params) { + return http.request({ + url: '/genCodes/edit', + method: 'POST', + params, + }); +} + +export function Status(params) { + return http.request({ + url: '/genCodes/status', + method: 'POST', + params, + }); +} +export function Selects(params) { + return http.request({ + url: '/genCodes/selects', + method: 'get', + params, + }); +} + +export function TableSelect(params) { + return http.request({ + url: '/genCodes/tableSelect', + method: 'get', + params, + }); +} + +export function ColumnSelect(params) { + return http.request({ + url: '/genCodes/columnSelect', + method: 'get', + params, + }); +} + +export function ColumnList(params) { + return http.request({ + url: '/genCodes/columnList', + method: 'get', + params, + }); +} + +export function Preview(params) { + return http.request({ + url: '/genCodes/preview', + method: 'post', + params, + }); +} + +export function Build(params) { + return http.request({ + url: '/genCodes/build', + method: 'post', + params, + }); +} diff --git a/web/src/api/dict/dict.ts b/web/src/api/dict/dict.ts new file mode 100644 index 0000000..9f5e1da --- /dev/null +++ b/web/src/api/dict/dict.ts @@ -0,0 +1,110 @@ +import { http } from '@/utils/http/axios'; + +/** + * 获取字典类型tree + * @param params + */ +export function getDictTree(params?) { + return http.request({ + url: '/dictType/tree', + method: 'GET', + params, + }); +} + +/** + * 编辑字典类型 + * @param params + * @constructor + */ +export function EditDict(params?) { + return http.request({ + url: '/dictType/edit', + method: 'POST', + params, + }); +} + +/** + * 删除字典类型 + * @param params + * @constructor + */ +export function DeleteDict(params?) { + return http.request({ + url: '/dictType/delete', + method: 'POST', + params, + }); +} + +/** + * 获取字典类型选项 + * @param params + */ +export function getDictSelect(params?) { + return http.request({ + url: '/dictType/tree', + method: 'GET', + params, + }); +} + +/** + * 编辑字典数据 + * @param params + * @constructor + */ +export function EditData(params?) { + return http.request({ + url: '/dictData/edit', + method: 'POST', + params, + }); +} + +/** + * 删除字典数据 + * @param params + * @constructor + */ +export function DeleteData(params?) { + return http.request({ + url: '/dictData/delete', + method: 'POST', + params, + }); +} + +/** + * 获取字典数据列表 + * @param params + */ +export function getDataList(params?) { + return http.request({ + url: '/dictData/list', + method: 'GET', + params, + }); +} + +/** + * 获取字典数据列表 + */ +export function Dict(type) { + return http.request({ + url: '/dictData/option/' + type, + method: 'GET', + }); +} + +/** + * 获取字典数据列表 + */ +export function Dicts(params) { + return http.request({ + url: '/dictData/options', + method: 'GET', + params, + }); +} diff --git a/web/src/api/governance/approval/index.ts b/web/src/api/governance/approval/index.ts new file mode 100644 index 0000000..7e620ca --- /dev/null +++ b/web/src/api/governance/approval/index.ts @@ -0,0 +1,29 @@ +import { http } from '@/utils/http/axios'; + +export function List(params) { + return http.request({ url: '/approval/list', method: 'get', params }); +} + +export function View(params) { + return http.request({ url: '/approval/view', method: 'get', params }); +} + +export function Create(params) { + return http.request({ url: '/approval/create', method: 'POST', params }); +} + +export function Submit(params) { + return http.request({ url: '/approval/submit', method: 'POST', params }); +} + +export function Approve(params) { + return http.request({ url: '/approval/approve', method: 'POST', params }); +} + +export function Reject(params) { + return http.request({ url: '/approval/reject', method: 'POST', params }); +} + +export function Cancel(params) { + return http.request({ url: '/approval/cancel', method: 'POST', params }); +} diff --git a/web/src/api/governance/bizAudit/index.ts b/web/src/api/governance/bizAudit/index.ts new file mode 100644 index 0000000..e25555b --- /dev/null +++ b/web/src/api/governance/bizAudit/index.ts @@ -0,0 +1,9 @@ +import { http } from '@/utils/http/axios'; + +export function List(params) { + return http.request({ url: '/bizAudit/list', method: 'get', params }); +} + +export function View(params) { + return http.request({ url: '/bizAudit/view', method: 'get', params }); +} diff --git a/web/src/api/log/log.ts b/web/src/api/log/log.ts new file mode 100644 index 0000000..8a15260 --- /dev/null +++ b/web/src/api/log/log.ts @@ -0,0 +1,24 @@ +import { http } from '@/utils/http/axios'; + +export function getLogList(params) { + return http.request({ + url: '/log/list', + method: 'get', + params, + }); +} +export function Delete(params) { + return http.request({ + url: '/log/delete', + method: 'POST', + params, + }); +} + +export function View(params) { + return http.request({ + url: '/log/view', + method: 'GET', + params, + }); +} diff --git a/web/src/api/log/smslog.ts b/web/src/api/log/smslog.ts new file mode 100644 index 0000000..e2ab979 --- /dev/null +++ b/web/src/api/log/smslog.ts @@ -0,0 +1,24 @@ +import { http } from '@/utils/http/axios'; + +export function getLogList(params) { + return http.request({ + url: '/smsLog/list', + method: 'get', + params, + }); +} +export function Delete(params) { + return http.request({ + url: '/smsLog/delete', + method: 'POST', + params, + }); +} + +export function View(params) { + return http.request({ + url: '/smsLog/view', + method: 'GET', + params, + }); +} diff --git a/web/src/api/loginLog/index.ts b/web/src/api/loginLog/index.ts new file mode 100644 index 0000000..3f50101 --- /dev/null +++ b/web/src/api/loginLog/index.ts @@ -0,0 +1,24 @@ +import { http, jumpExport } from '@/utils/http/axios'; + +// 获取登录日志列表 +export function List(params) { + return http.request({ + url: '/loginLog/list', + method: 'get', + params, + }); +} + +// 删除/批量删除登录日志 +export function Delete(params) { + return http.request({ + url: '/loginLog/delete', + method: 'POST', + params, + }); +} + +// 导出登录日志 +export function Export(params) { + jumpExport('/loginLog/export', params); +} diff --git a/web/src/api/memberLevel/index.ts b/web/src/api/memberLevel/index.ts new file mode 100644 index 0000000..2f801f5 --- /dev/null +++ b/web/src/api/memberLevel/index.ts @@ -0,0 +1,11 @@ +import { http } from '@/utils/http/axios'; +const request=(url:string,method:'get'|'POST',params?:any)=>http.request({url,method,params}); +export const List=(params)=>request('/memberLevel/list','get',params); +export const View=(params)=>request('/memberLevel/view','get',params); +export const Save=(params)=>request('/memberLevel/save','POST',params); +export const Submit=(params)=>request('/memberLevel/submit','POST',params); +export const Publish=(params)=>request('/memberLevel/publish','POST',params); +export const Rollback=(params)=>request('/memberLevel/rollback','POST',params); +export const History=(params)=>request('/memberLevel/history','get',params); +export const Status=(params)=>request('/memberLevel/status','POST',params); +export const Delete=(params)=>request('/memberLevel/delete','POST',params); diff --git a/web/src/api/monitor/monitor.ts b/web/src/api/monitor/monitor.ts new file mode 100644 index 0000000..d9333f8 --- /dev/null +++ b/web/src/api/monitor/monitor.ts @@ -0,0 +1,40 @@ +import { http } from '@/utils/http/axios'; + +export function OnlineList(params) { + return http.request({ + url: '/monitor/userOnlineList', + method: 'get', + params, + }); +} + +export function Offline(params) { + return http.request({ + url: '/monitor/userOffline', + method: 'POST', + params, + }); +} + +export function NetOnlineList(params) { + return http.request({ + url: '/monitor/netOnlineList', + method: 'get', + params, + }); +} + +export function NetOffline(params) { + return http.request({ + url: '/monitor/netOffline', + method: 'POST', + params, + }); +} + +export function NetOption() { + return http.request({ + url: '/monitor/netOption', + method: 'get', + }); +} diff --git a/web/src/api/normalTreeDemo/index.ts b/web/src/api/normalTreeDemo/index.ts new file mode 100644 index 0000000..7ed7da8 --- /dev/null +++ b/web/src/api/normalTreeDemo/index.ts @@ -0,0 +1,53 @@ +import { http, jumpExport } from '@/utils/http/axios'; + +// 获取普通树表列表 +export function List(params) { + return http.request({ + url: '/normalTreeDemo/list', + method: 'get', + params, + }); +} + +// 删除/批量删除普通树表 +export function Delete(params) { + return http.request({ + url: '/normalTreeDemo/delete', + method: 'POST', + params, + }); +} + +// 添加/编辑普通树表 +export function Edit(params) { + return http.request({ + url: '/normalTreeDemo/edit', + method: 'POST', + params, + }); +} + +// 获取普通树表指定详情 +export function View(params) { + return http.request({ + url: '/normalTreeDemo/view', + method: 'GET', + params, + }); +} + +// 获取普通树表最大排序 +export function MaxSort() { + return http.request({ + url: '/normalTreeDemo/maxSort', + method: 'GET', + }); +} + +// 获取普通树表关系树选项 +export function TreeOption() { + return http.request({ + url: '/normalTreeDemo/treeOption', + method: 'GET', + }); +} \ No newline at end of file diff --git a/web/src/api/optionTreeDemo/index.ts b/web/src/api/optionTreeDemo/index.ts new file mode 100644 index 0000000..22209fc --- /dev/null +++ b/web/src/api/optionTreeDemo/index.ts @@ -0,0 +1,53 @@ +import { http, jumpExport } from '@/utils/http/axios'; + +// 获取选项树表列表 +export function List(params) { + return http.request({ + url: '/optionTreeDemo/list', + method: 'get', + params, + }); +} + +// 删除/批量删除选项树表 +export function Delete(params) { + return http.request({ + url: '/optionTreeDemo/delete', + method: 'POST', + params, + }); +} + +// 添加/编辑选项树表 +export function Edit(params) { + return http.request({ + url: '/optionTreeDemo/edit', + method: 'POST', + params, + }); +} + +// 获取选项树表指定详情 +export function View(params) { + return http.request({ + url: '/optionTreeDemo/view', + method: 'GET', + params, + }); +} + +// 获取选项树表最大排序 +export function MaxSort() { + return http.request({ + url: '/optionTreeDemo/maxSort', + method: 'GET', + }); +} + +// 获取选项树表关系树选项 +export function TreeOption() { + return http.request({ + url: '/optionTreeDemo/treeOption', + method: 'GET', + }); +} \ No newline at end of file diff --git a/web/src/api/order/index.ts b/web/src/api/order/index.ts new file mode 100644 index 0000000..d5a0d5a --- /dev/null +++ b/web/src/api/order/index.ts @@ -0,0 +1,103 @@ +import { http, jumpExport } from '@/utils/http/axios'; + +// 创建充值订单 +export function Create(params) { + return http.request({ + url: '/order/create', + method: 'post', + params, + }); +} + +// 获取充值订单列表 +export function List(params) { + return http.request({ + url: '/order/list', + method: 'get', + params, + }); +} + +// 删除/批量删除充值订单 +export function Delete(params) { + return http.request({ + url: '/order/delete', + method: 'POST', + params, + }); +} + +// 添加/编辑充值订单 +export function Edit(params) { + return http.request({ + url: '/order/edit', + method: 'POST', + params, + }); +} + +// 修改充值订单状态 +export function Status(params) { + return http.request({ + url: '/order/status', + method: 'POST', + params, + }); +} + +// 操作充值订单开关 +export function Switch(params) { + return http.request({ + url: '/order/switch', + method: 'POST', + params, + }); +} + +// 获取充值订单指定详情 +export function View(params) { + return http.request({ + url: '/order/view', + method: 'GET', + params, + }); +} + +// 获取充值订单最大排序 +export function MaxSort() { + return http.request({ + url: '/order/maxSort', + method: 'GET', + }); +} + +// 获取订单状态选项 +export function Option() { + return http.request({ + url: '/order/option', + method: 'GET', + }); +} + +// 申请订单退款 +export function ApplyRefund(params) { + return http.request({ + url: '/order/applyRefund', + method: 'post', + params, + }); +} + +// 受理订单退款 +export function AcceptRefund(params) { + return http.request({ + url: '/order/acceptRefund', + method: 'post', + params, + }); +} + +// 导出充值订单 +export function Export(params) { + jumpExport('/order/export', params); +} diff --git a/web/src/api/org/dept.ts b/web/src/api/org/dept.ts new file mode 100644 index 0000000..25ed820 --- /dev/null +++ b/web/src/api/org/dept.ts @@ -0,0 +1,68 @@ +import { http } from '@/utils/http/axios'; + +export function getDeptList(params?) { + return http.request({ + url: '/dept/list', + method: 'GET', + params, + }); +} + +export function Edit(params) { + return http.request({ + url: '/dept/edit', + method: 'POST', + params, + }); +} + +// 部门状态 +export function Status(params) { + return http.request({ + url: '/dept/status', + method: 'POST', + params, + }); +} + +// 获取管理员_部门指定详情 +export function View(params) { + return http.request({ + url: '/dept/view', + method: 'GET', + params, + }); +} + +// 获取管理员_部门最大排序 +export function MaxSort() { + return http.request({ + url: '/dept/maxSort', + method: 'GET', + }); +} + +export function Delete(params) { + return http.request({ + url: '/dept/delete', + method: 'POST', + params, + }); +} + +export function getDeptOption() { + const params = { pageSize: 100 }; + return http.request({ + url: '/dept/option', + method: 'GET', + params, + }); +} + +// 部门关系树选项 +export function TreeOption() { + return http.request({ + url: '/dept/treeOption', + method: 'GET', + }); +} diff --git a/web/src/api/org/post.ts b/web/src/api/org/post.ts new file mode 100644 index 0000000..872ccf5 --- /dev/null +++ b/web/src/api/org/post.ts @@ -0,0 +1,29 @@ +import { http } from '@/utils/http/axios'; + +export function getPostList(params?) { + return http.request({ + url: '/post/list', + method: 'GET', + params, + }); +} + +export function getPostOption(params?) { + return getPostList(params); +} + +export function Edit(params) { + return http.request({ + url: '/post/edit', + method: 'POST', + params, + }); +} + +export function Delete(params) { + return http.request({ + url: '/post/delete', + method: 'POST', + params, + }); +} diff --git a/web/src/api/org/user.ts b/web/src/api/org/user.ts new file mode 100644 index 0000000..36aa5c7 --- /dev/null +++ b/web/src/api/org/user.ts @@ -0,0 +1,73 @@ +import { http } from '@/utils/http/axios'; + +export function List(params?) { + return http.request({ + url: '/member/list', + method: 'GET', + params, + }); +} + +export function Edit(params) { + return http.request({ + url: '/member/edit', + method: 'POST', + params, + }); +} + +export function Status(params) { + return http.request({ + url: '/member/status', + method: 'POST', + params, + }); +} + +export function Delete(params) { + return http.request({ + url: '/member/delete', + method: 'POST', + params, + }); +} + +export function ResetPwd(params) { + return http.request({ + url: '/member/resetPwd', + method: 'POST', + params, + }); +} + +// 获取可选的后台用户选项 +export function GetMemberOption() { + return http.request({ + url: '/member/option', + method: 'GET', + }); +} + +export function GetMemberView(params) { + return http.request({ + url: '/member/view', + method: 'GET', + params, + }); +} + +export function AddMemberBalance(params) { + return http.request({ + url: '/member/addBalance', + method: 'POST', + params, + }); +} + +export function AddMemberIntegral(params) { + return http.request({ + url: '/member/addIntegral', + method: 'POST', + params, + }); +} diff --git a/web/src/api/pay/refund.ts b/web/src/api/pay/refund.ts new file mode 100644 index 0000000..b11c8a6 --- /dev/null +++ b/web/src/api/pay/refund.ts @@ -0,0 +1,15 @@ +import { http, jumpExport } from '@/utils/http/axios'; + +// 获取交易退款列表 +export function List(params) { + return http.request({ + url: '/payRefund/list', + method: 'get', + params, + }); +} + +// 导出交易退款 +export function Export(params) { + jumpExport('/payRefund/export', params); +} diff --git a/web/src/api/portal/index.ts b/web/src/api/portal/index.ts new file mode 100644 index 0000000..e458823 --- /dev/null +++ b/web/src/api/portal/index.ts @@ -0,0 +1,29 @@ +import { http } from '@/utils/http/axios'; + +const request = (url: string, method: string, params?: any) => http.request({ url, method, params }); + +export const SiteConfigCurrent = (params = { configGroup: 'portal' }) => request('/siteConfig/current', 'get', params); +export const SiteConfigHistory = (params) => request('/siteConfig/history', 'get', params); +export const SiteConfigSave = (params) => request('/siteConfig/save', 'POST', params); +export const SiteConfigSubmit = (params) => request('/siteConfig/submit', 'POST', params); +export const SiteConfigPublish = (params) => request('/siteConfig/publish', 'POST', params); +export const SiteConfigRollback = (params) => request('/siteConfig/rollback', 'POST', params); + +export const ContentList = (params) => request('/portalContent/list', 'get', params); +export const ContentView = (params) => request('/portalContent/view', 'get', params); +export const ContentEdit = (params) => request('/portalContent/edit', 'POST', params); +export const ContentDelete = (params) => request('/portalContent/delete', 'POST', params); +export const ContentPublish = (params) => request('/portalContent/publish', 'POST', params); +export const ContentOffline = (params) => request('/portalContent/offline', 'POST', params); + +export const BannerList = (params) => request('/banner/list', 'get', params); +export const BannerView = (params) => request('/banner/view', 'get', params); +export const BannerEdit = (params) => request('/banner/edit', 'POST', params); +export const BannerDelete = (params) => request('/banner/delete', 'POST', params); +export const BannerStatus = (params) => request('/banner/status', 'POST', params); + +export const ManualProductList = (params) => request('/manualProduct/list', 'get', params); +export const ManualProductView = (params) => request('/manualProduct/view', 'get', params); +export const ManualProductEdit = (params) => request('/manualProduct/edit', 'POST', params); +export const ManualProductDelete = (params) => request('/manualProduct/delete', 'POST', params); +export const ManualProductStatus = (params) => request('/manualProduct/status', 'POST', params); diff --git a/web/src/api/productTask/index.ts b/web/src/api/productTask/index.ts new file mode 100644 index 0000000..67e6e17 --- /dev/null +++ b/web/src/api/productTask/index.ts @@ -0,0 +1,16 @@ +import { http } from '@/utils/http/axios'; +const request = (url, method, params) => http.request({ url, method, params }); +export const ProductList = (params) => request('/product/list', 'get', params); +export const ProductView = (params) => request('/product/view', 'get', params); +export const ProductEdit = (params) => request('/product/edit', 'POST', params); +export const ProductStatus = (params) => request('/product/status', 'POST', params); +export const ProductRecommend = (params) => request('/product/recommend', 'POST', params); +export const ProductDelete = (params) => request('/product/delete', 'POST', params); +export const TaskList = (params) => request('/task/list', 'get', params); +export const TaskView = (params) => request('/task/view', 'get', params); +export const TaskEdit = (params) => request('/task/edit', 'POST', params); +export const TaskStatus = (params) => request('/task/status', 'POST', params); +export const TaskDelete = (params) => request('/task/delete', 'POST', params); +export const SubmissionList = (params) => request('/taskSubmission/list', 'get', params); +export const SubmissionView = (params) => request('/taskSubmission/view', 'get', params); +export const SubmissionReview = (params) => request('/taskSubmission/review', 'POST', params); diff --git a/web/src/api/serveLicense/index.ts b/web/src/api/serveLicense/index.ts new file mode 100644 index 0000000..63f7351 --- /dev/null +++ b/web/src/api/serveLicense/index.ts @@ -0,0 +1,60 @@ +import { http, jumpExport } from '@/utils/http/axios'; + +// 获取服务许可证列表 +export function List(params) { + return http.request({ + url: '/serveLicense/list', + method: 'get', + params, + }); +} + +// 删除/批量删除服务许可证 +export function Delete(params) { + return http.request({ + url: '/serveLicense/delete', + method: 'POST', + params, + }); +} + +// 添加/编辑服务许可证 +export function Edit(params) { + return http.request({ + url: '/serveLicense/edit', + method: 'POST', + params, + }); +} + +// 修改服务许可证状态 +export function Status(params) { + return http.request({ + url: '/serveLicense/status', + method: 'POST', + params, + }); +} + +// 获取服务许可证指定详情 +export function View(params) { + return http.request({ + url: '/serveLicense/view', + method: 'GET', + params, + }); +} + +// 分配服务许可证路由 +export function AssignRouter(params) { + return http.request({ + url: '/serveLicense/assignRouter', + method: 'POST', + params, + }); +} + +// 导出服务许可证 +export function Export(params) { + jumpExport('/serveLicense/export', params); +} diff --git a/web/src/api/serveLog/index.ts b/web/src/api/serveLog/index.ts new file mode 100644 index 0000000..7b3c4fe --- /dev/null +++ b/web/src/api/serveLog/index.ts @@ -0,0 +1,33 @@ +import { http, jumpExport } from '@/utils/http/axios'; + +// 获取服务日志列表 +export function List(params) { + return http.request({ + url: '/serveLog/list', + method: 'get', + params, + }); +} + +// 删除/批量删除服务日志 +export function Delete(params) { + return http.request({ + url: '/serveLog/delete', + method: 'POST', + params, + }); +} + +// 获取服务日志指定详情 +export function View(params) { + return http.request({ + url: '/serveLog/view', + method: 'GET', + params, + }); +} + +// 导出服务日志 +export function Export(params) { + jumpExport('/serveLog/export', params); +} diff --git a/web/src/api/sys/blacklist.ts b/web/src/api/sys/blacklist.ts new file mode 100644 index 0000000..b8250f7 --- /dev/null +++ b/web/src/api/sys/blacklist.ts @@ -0,0 +1,41 @@ +import { http } from '@/utils/http/axios'; + +export function List(params) { + return http.request({ + url: '/blacklist/list', + method: 'get', + params, + }); +} + +export function Delete(params) { + return http.request({ + url: '/blacklist/delete', + method: 'POST', + params, + }); +} + +export function Edit(params) { + return http.request({ + url: '/blacklist/edit', + method: 'POST', + params, + }); +} + +export function Status(params) { + return http.request({ + url: '/blacklist/status', + method: 'POST', + params, + }); +} + +export function View(params) { + return http.request({ + url: '/blacklist/view', + method: 'GET', + params, + }); +} diff --git a/web/src/api/sys/config.ts b/web/src/api/sys/config.ts new file mode 100644 index 0000000..4bbbdbc --- /dev/null +++ b/web/src/api/sys/config.ts @@ -0,0 +1,46 @@ +import { http } from '@/utils/http/axios'; + +export function getConfig(params) { + return http.request({ + url: '/config/get', + method: 'get', + params, + }); +} +export function updateConfig(params) { + return http.request({ + url: '/config/update', + method: 'post', + params, + }); +} + +export function TypeSelect() { + return http.request({ + url: '/config/typeSelect', + method: 'get', + }); +} + +export function sendTestEmail(params) { + return http.request({ + url: '/ems/sendTest', + method: 'post', + params, + }); +} + +export function sendTestSms(params) { + return http.request({ + url: '/sms/sendTest', + method: 'post', + params, + }); +} + +export function getCashConfig() { + return http.request({ + url: '/config/getCash', + method: 'get', + }); +} diff --git a/web/src/api/sys/cron.ts b/web/src/api/sys/cron.ts new file mode 100644 index 0000000..6a8fd9a --- /dev/null +++ b/web/src/api/sys/cron.ts @@ -0,0 +1,105 @@ +import { http } from '@/utils/http/axios'; + +export function List(params) { + return http.request({ + url: '/cron/list', + method: 'get', + params, + }); +} + +export function Delete(params) { + return http.request({ + url: '/cron/delete', + method: 'POST', + params, + }); +} + +export function Edit(params) { + return http.request({ + url: '/cron/edit', + method: 'POST', + params, + }); +} + +export function Status(params) { + return http.request({ + url: '/cron/status', + method: 'POST', + params, + }); +} + +export function View(params) { + return http.request({ + url: '/cron/view', + method: 'GET', + params, + }); +} + +export function GroupList(params) { + return http.request({ + url: '/cronGroup/list', + method: 'get', + params, + }); +} + +export function GroupDelete(params) { + return http.request({ + url: '/cronGroup/delete', + method: 'POST', + params, + }); +} + +export function GroupEdit(params) { + return http.request({ + url: '/cronGroup/edit', + method: 'POST', + params, + }); +} + +export function GroupStatus(params) { + return http.request({ + url: '/cronGroup/status', + method: 'POST', + params, + }); +} + +export function GroupView(params) { + return http.request({ + url: '/cronGroup/view', + method: 'GET', + params, + }); +} + +export function getSelect(params) { + return http.request({ + url: '/cronGroup/select', + method: 'GET', + params, + }); +} + +export function OnlineExec(params) { + return http.request({ + url: '/cron/onlineExec', + method: 'POST', + params, + }); +} + +export function DispatchLog(params) { + return http.request({ + url: '/cron/dispatchLog', + method: 'POST', + params, + }); +} diff --git a/web/src/api/system/menu.ts b/web/src/api/system/menu.ts new file mode 100644 index 0000000..9ac9bc9 --- /dev/null +++ b/web/src/api/system/menu.ts @@ -0,0 +1,40 @@ +import { http } from '@/utils/http/axios'; +import { ApiEnum } from '@/enums/apiEnum'; + +/** + * @description: 根据用户id获取用户菜单 + */ +export function adminMenus() { + return http.request({ + url: ApiEnum.RoleDynamic, + method: 'GET', + }); +} + +/** + * 获取tree菜单列表 + * @param params + */ +export function getMenuList(params?) { + return http.request({ + url: '/menu/list', + method: 'GET', + params, + }); +} + +export function EditMenu(params?) { + return http.request({ + url: '/menu/edit', + method: 'POST', + params, + }); +} + +export function DeleteMenu(params?) { + return http.request({ + url: '/menu/delete', + method: 'POST', + params, + }); +} diff --git a/web/src/api/system/role.ts b/web/src/api/system/role.ts new file mode 100644 index 0000000..e94966a --- /dev/null +++ b/web/src/api/system/role.ts @@ -0,0 +1,64 @@ +import { http } from '@/utils/http/axios'; + +/** + * @description: 角色列表 + */ +export function getRoleList(params) { + return http.request({ + url: '/role/list', + method: 'GET', + params, + }); +} + +export function getRoleOption() { + const params = { pageSize: 100 }; + return getRoleList(params); +} + +export function Edit(params) { + return http.request({ + url: '/role/edit', + method: 'POST', + params, + }); +} + +export function Delete(params) { + return http.request({ + url: '/role/delete', + method: 'POST', + params, + }); +} + +export function UpdatePermissions(params) { + return http.request({ + url: '/role/updatePermissions', + method: 'POST', + params, + }); +} + +export function GetPermissions(params) { + return http.request({ + url: '/role/getPermissions', + method: 'GET', + params, + }); +} + +export function DataScopeSelect() { + return http.request({ + url: '/role/dataScope/select', + method: 'GET', + }); +} + +export function DataScopeEdit(params) { + return http.request({ + url: '/role/dataScope/edit', + method: 'POST', + params, + }); +} diff --git a/web/src/api/system/user.ts b/web/src/api/system/user.ts new file mode 100644 index 0000000..d26c176 --- /dev/null +++ b/web/src/api/system/user.ts @@ -0,0 +1,183 @@ +import { http } from '@/utils/http/axios'; +import { ApiEnum } from '@/enums/apiEnum'; + +export interface BasicResponseModel { + code: number; + message: string; + data: T; +} + +export interface BasicPageParams { + pageNumber: number; + pageSize: number; + total: number; +} + +export function getConfig() { + return http.request({ + url: ApiEnum.SiteConfig, + method: 'get', + headers: { hostname: location.hostname }, + }); +} + +/** + * @description: 获取用户信息 + */ +export function getUserInfo() { + return http.request({ + url: ApiEnum.MemberInfo, + method: 'get', + }); +} + +export function updateMemberProfile(params) { + return http.request({ + url: '/member/updateProfile', + method: 'post', + params, + }); +} + +export function updateMemberPwd(params) { + return http.request({ + url: '/member/updatePwd', + method: 'post', + params, + }); +} + +export function updateMemberMobile(params) { + return http.request({ + url: '/member/updateMobile', + method: 'post', + params, + }); +} + +export function updateMemberEmail(params) { + return http.request({ + url: '/member/updateEmail', + method: 'post', + params, + }); +} + +export function SendBindEmail() { + return http.request({ + url: '/ems/sendBind', + method: 'post', + }); +} + +export function SendBindSms() { + return http.request({ + url: '/sms/sendBind', + method: 'post', + }); +} + +export function SendSms(params) { + return http.request({ + url: '/sms/send', + method: 'post', + params, + }); +} + +export function updateMemberCash(params) { + return http.request({ + url: '/member/updateCash', + method: 'post', + params, + }); +} + +/** + * @description: 用户登录配置 + */ +export function getLoginConfig() { + return http.request({ + url: ApiEnum.SiteLoginConfig, + method: 'get', + }); +} + +/** + * @description: 用户注册 + */ +export function register(params) { + return http.request( + { + url: ApiEnum.SiteRegister, + method: 'POST', + params, + }, + { + isTransformResponse: false, + } + ); +} + +/** + * @description: 用户登录 + */ +export function login(params) { + return http.request( + { + url: ApiEnum.SiteAccountLogin, + method: 'POST', + params, + }, + { + isTransformResponse: false, + } + ); +} + +/** + * @description: 手机号登录 + */ +export function mobileLogin(params) { + return http.request( + { + url: ApiEnum.SiteMobileLogin, + method: 'POST', + params, + }, + { + isTransformResponse: false, + } + ); +} + +/** + * @description: 用户注销 + */ +export function logout() { + return http.request( + { + url: ApiEnum.SiteLogout, + method: 'POST', + }, + { + isTransformResponse: false, + } + ); +} + +/** + * @description: 用户修改密码 + */ +export function changePassword(params, uid) { + return http.request( + { + url: `/user/u${uid}/changepw`, + method: 'POST', + params, + }, + { + isTransformResponse: false, + } + ); +} diff --git a/web/src/api/taskHall/index.ts b/web/src/api/taskHall/index.ts new file mode 100644 index 0000000..2fa4b12 --- /dev/null +++ b/web/src/api/taskHall/index.ts @@ -0,0 +1,7 @@ +import { http } from '@/utils/http/axios'; +const request=(url:string,method:'get'|'POST',params?:any)=>http.request({url,method,params}); +export const List=(params)=>request('/taskHall/list','get',params); +export const View=(params)=>request('/taskHall/view','get',params); +export const Edit=(params)=>request('/taskHall/edit','POST',params); +export const Status=(params)=>request('/taskHall/status','POST',params); +export const Delete=(params)=>request('/taskHall/delete','POST',params); diff --git a/web/src/api/testCategory/index.ts b/web/src/api/testCategory/index.ts new file mode 100644 index 0000000..5971a48 --- /dev/null +++ b/web/src/api/testCategory/index.ts @@ -0,0 +1,54 @@ +import { http, jumpExport } from '@/utils/http/axios'; + +// 获取测试分类列表 +export function List(params) { + return http.request({ + url: '/testCategory/list', + method: 'get', + params, + }); +} + +// 删除/批量删除测试分类 +export function Delete(params) { + return http.request({ + url: '/testCategory/delete', + method: 'POST', + params, + }); +} + +// 添加/编辑测试分类 +export function Edit(params) { + return http.request({ + url: '/testCategory/edit', + method: 'POST', + params, + }); +} + +// 修改测试分类状态 +export function Status(params) { + return http.request({ + url: '/testCategory/status', + method: 'POST', + params, + }); +} + +// 获取测试分类指定详情 +export function View(params) { + return http.request({ + url: '/testCategory/view', + method: 'GET', + params, + }); +} + +// 获取测试分类最大排序 +export function MaxSort() { + return http.request({ + url: '/testCategory/maxSort', + method: 'GET', + }); +} \ No newline at end of file diff --git a/web/src/api/trade/index.ts b/web/src/api/trade/index.ts new file mode 100644 index 0000000..947e787 --- /dev/null +++ b/web/src/api/trade/index.ts @@ -0,0 +1,26 @@ +import { http } from '@/utils/http/axios'; + +export const TradeOrderList = (params) => http.request({ url: '/tradeOrder/list', method: 'get', params }); +export const TradeOrderView = (params) => http.request({ url: '/tradeOrder/view', method: 'get', params }); +export const TradeOrderMatchProducts = (params) => http.request({ url: '/tradeOrder/matchProducts', method: 'get', params }); +export const TradeOrderMatch = (params) => http.request({ url: '/tradeOrder/match', method: 'POST', params }); +export const TradeOrderApply = (params) => http.request({ url: '/tradeOrder/apply', method: 'POST', params }); +export const TradeOrderExecute = (params) => http.request({ url: '/tradeOrder/execute', method: 'POST', params }); + +export const RechargeList = (params) => http.request({ url: '/rechargeOrder/list', method: 'get', params }); +export const RechargeSummary = (params) => http.request({ url: '/rechargeOrder/summary', method: 'get', params }); +export const RechargeView = (params) => http.request({ url: '/rechargeOrder/view', method: 'get', params }); +export const RechargeReview = (params) => http.request({ url: '/rechargeOrder/review', method: 'POST', params }); +export const RechargeExecute = (params) => http.request({ url: '/rechargeOrder/execute', method: 'POST', params }); + +export const WithdrawalList = (params) => http.request({ url: '/withdrawalOrder/list', method: 'get', params }); +export const WithdrawalView = (params) => http.request({ url: '/withdrawalOrder/view', method: 'get', params }); +export const WithdrawalReview = (params) => http.request({ url: '/withdrawalOrder/review', method: 'POST', params }); +export const WithdrawalExecute = (params) => http.request({ url: '/withdrawalOrder/execute', method: 'POST', params }); +export const WithdrawalComplete = (params) => http.request({ url: '/withdrawalOrder/complete', method: 'POST', params }); + +export const CustomerServiceList = (params) => http.request({ url: '/customerService/list', method: 'get', params }); +export const CustomerServiceView = (params) => http.request({ url: '/customerService/view', method: 'get', params }); +export const CustomerServiceEdit = (params) => http.request({ url: '/customerService/edit', method: 'POST', params }); +export const CustomerServiceStatus = (params) => http.request({ url: '/customerService/status', method: 'POST', params }); +export const CustomerServiceDelete = (params) => http.request({ url: '/customerService/delete', method: 'POST', params }); diff --git a/web/src/assets/icons/login.svg b/web/src/assets/icons/login.svg new file mode 100644 index 0000000..2490aa7 --- /dev/null +++ b/web/src/assets/icons/login.svg @@ -0,0 +1,127 @@ + + + Group 21 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +